11/* eslint-disable sonarjs/no-duplicate-string */
2- import { Body , Controller , Delete , Get , Param , Post , Put } from '@nestjs/common' ;
2+ import { Body , Controller , Delete , Get , Param , Post , Put , UseGuards } from '@nestjs/common' ;
33import type { IBaseNodeTreeVo , IBaseNodeVo } from '@teable/openapi' ;
44import {
55 moveBaseNodeRoSchema ,
@@ -11,31 +11,67 @@ import {
1111 updateBaseNodeRoSchema ,
1212 IUpdateBaseNodeRo ,
1313} from '@teable/openapi' ;
14+ import { ClsService } from 'nestjs-cls' ;
15+ import type { IClsStore } from '../../types/cls' ;
1416import { ZodValidationPipe } from '../../zod.validation.pipe' ;
17+ import { BaseNodePermissions } from '../auth/decorators/base-node-permissions.decorator' ;
1518import { Permissions } from '../auth/decorators/permissions.decorator' ;
19+ import { BaseNodePermissionGuard } from '../auth/guard/base-node-permission.guard' ;
20+ import { checkBaseNodePermission } from './base-node.permission.helper' ;
1621import { BaseNodeService } from './base-node.service' ;
1722
1823@Controller ( 'api/base/:baseId/node' )
24+ @UseGuards ( BaseNodePermissionGuard )
1925export class BaseNodeController {
20- constructor ( private readonly baseNodeService : BaseNodeService ) { }
26+ constructor (
27+ private readonly baseNodeService : BaseNodeService ,
28+ private readonly cls : ClsService < IClsStore >
29+ ) { }
30+
31+ @Get ( 'list' )
32+ @Permissions ( 'base|read' )
33+ async getList ( @Param ( 'baseId' ) baseId : string ) : Promise < IBaseNodeVo [ ] > {
34+ const permissionContext = await this . getPermissionContext ( baseId ) ;
35+ const nodeList = await this . baseNodeService . getList ( baseId ) ;
36+ return nodeList . filter ( ( node ) =>
37+ checkBaseNodePermission (
38+ { resourceType : node . resourceType , resourceId : node . resourceId } ,
39+ 'base_node|read' ,
40+ permissionContext
41+ )
42+ ) ;
43+ }
2144
2245 @Get ( 'tree' )
2346 @Permissions ( 'base|read' )
2447 async getTree ( @Param ( 'baseId' ) baseId : string ) : Promise < IBaseNodeTreeVo > {
25- return this . baseNodeService . getTree ( baseId ) ;
48+ const permissionContext = await this . getPermissionContext ( baseId ) ;
49+ const tree = await this . baseNodeService . getTree ( baseId ) ;
50+ return {
51+ ...tree ,
52+ nodes : tree . nodes . filter ( ( node ) =>
53+ checkBaseNodePermission (
54+ { resourceType : node . resourceType , resourceId : node . resourceId } ,
55+ 'base_node|read' ,
56+ permissionContext
57+ )
58+ ) ,
59+ } ;
2660 }
2761
2862 @Get ( ':nodeId' )
2963 @Permissions ( 'base|read' )
30- async get (
64+ @BaseNodePermissions ( 'base_node|read' )
65+ async getNode (
3166 @Param ( 'baseId' ) baseId : string ,
3267 @Param ( 'nodeId' ) nodeId : string
3368 ) : Promise < IBaseNodeVo > {
34- return this . baseNodeService . getNode ( baseId , nodeId ) ;
69+ return this . baseNodeService . getNodeVo ( baseId , nodeId ) ;
3570 }
3671
3772 @Post ( )
38- @Permissions ( 'base|update' )
73+ @Permissions ( 'base|read' )
74+ @BaseNodePermissions ( 'base_node|create' )
3975 async create (
4076 @Param ( 'baseId' ) baseId : string ,
4177 @Body ( new ZodValidationPipe ( createBaseNodeRoSchema ) ) ro : ICreateBaseNodeRo
@@ -44,7 +80,8 @@ export class BaseNodeController {
4480 }
4581
4682 @Post ( ':nodeId/duplicate' )
47- @Permissions ( 'base|update' )
83+ @Permissions ( 'base|read' )
84+ @BaseNodePermissions ( 'base_node|read' , 'base_node|create' )
4885 async duplicate (
4986 @Param ( 'baseId' ) baseId : string ,
5087 @Param ( 'nodeId' ) nodeId : string ,
@@ -53,14 +90,9 @@ export class BaseNodeController {
5390 return this . baseNodeService . duplicate ( baseId , nodeId , ro ) ;
5491 }
5592
56- @Delete ( ':nodeId' )
57- @Permissions ( 'base|update' )
58- async delete ( @Param ( 'baseId' ) baseId : string , @Param ( 'nodeId' ) nodeId : string ) : Promise < void > {
59- return this . baseNodeService . delete ( baseId , nodeId ) ;
60- }
61-
6293 @Put ( ':nodeId' )
63- @Permissions ( 'base|update' )
94+ @Permissions ( 'base|read' )
95+ @BaseNodePermissions ( 'base_node|update' )
6496 async update (
6597 @Param ( 'baseId' ) baseId : string ,
6698 @Param ( 'nodeId' ) nodeId : string ,
@@ -71,11 +103,25 @@ export class BaseNodeController {
71103
72104 @Put ( ':nodeId/move' )
73105 @Permissions ( 'base|update' )
106+ @BaseNodePermissions ( 'base_node|update' )
74107 async move (
75108 @Param ( 'baseId' ) baseId : string ,
76109 @Param ( 'nodeId' ) nodeId : string ,
77110 @Body ( new ZodValidationPipe ( moveBaseNodeRoSchema ) ) ro : IMoveBaseNodeRo
78111 ) : Promise < IBaseNodeVo > {
79112 return this . baseNodeService . move ( baseId , nodeId , ro ) ;
80113 }
114+
115+ @Delete ( ':nodeId' )
116+ @Permissions ( 'base|read' )
117+ @BaseNodePermissions ( 'base_node|delete' )
118+ async delete ( @Param ( 'baseId' ) baseId : string , @Param ( 'nodeId' ) nodeId : string ) : Promise < void > {
119+ return this . baseNodeService . delete ( baseId , nodeId ) ;
120+ }
121+
122+ protected async getPermissionContext ( _baseId : string ) {
123+ const permissions = this . cls . get ( 'permissions' ) ;
124+ const permissionSet = new Set ( permissions ) ;
125+ return { permissionSet } ;
126+ }
81127}
0 commit comments