@@ -108,7 +108,33 @@ export class ResourcesService {
108108 return await this . create ( user , newResource ) ;
109109 }
110110
111- async query ( { namespaceId, parentId, spaceType, tags, userId } : IQuery ) {
111+ async permissionFilter (
112+ namespaceId : string ,
113+ userId : string ,
114+ resources : Resource [ ] ,
115+ ) : Promise < Resource [ ] > {
116+ const filteredResources : Resource [ ] = [ ] ;
117+ for ( const res of resources ) {
118+ const hasPermission : boolean =
119+ await this . permissionsService . userHasPermission (
120+ namespaceId ,
121+ res . id ,
122+ userId ,
123+ ) ;
124+ if ( hasPermission ) {
125+ filteredResources . push ( res ) ;
126+ }
127+ }
128+ return filteredResources ;
129+ }
130+
131+ // get resources under parentId
132+ async queryV2 (
133+ namespaceId : string ,
134+ parentId : string ,
135+ userId ?: string , // if is undefined, would skip the permission filter
136+ tags ?: string , // separated by `,`
137+ ) : Promise < Resource [ ] > {
112138 const where : FindOptionsWhere < Resource > = {
113139 namespace : { id : namespaceId } ,
114140 parentId,
@@ -124,22 +150,40 @@ export class ResourcesService {
124150 where,
125151 relations : [ 'namespace' ] ,
126152 } ) ;
127- const filteredResources : Resource [ ] = [ ] ;
128- for ( const resource of resources ) {
129- const hasPermission = await this . permissionsService . userHasPermission (
130- namespaceId ,
131- resource . id ,
132- userId ,
133- ) ;
134- if ( hasPermission ) {
135- filteredResources . push ( resource ) ;
136- }
137- }
153+ return userId
154+ ? await this . permissionFilter ( namespaceId , userId , resources )
155+ : resources ;
156+ }
157+
158+ async query ( { namespaceId, parentId, spaceType, tags, userId } : IQuery ) {
159+ const filteredResources : Resource [ ] = await this . queryV2 (
160+ namespaceId ,
161+ parentId ,
162+ userId ,
163+ tags ,
164+ ) ;
138165 return filteredResources . map ( ( res ) => {
139166 return { ...res , spaceType } ;
140167 } ) ;
141168 }
142169
170+ async getAllSubResources (
171+ namespaceId : string ,
172+ parentId : string ,
173+ userId ?: string ,
174+ includeRoot : boolean = false ,
175+ ) : Promise < Resource [ ] > {
176+ let resources : Resource [ ] = [ await this . get ( parentId ) ] ;
177+ for ( const res of resources ) {
178+ const subResources : Resource [ ] = await this . queryV2 ( namespaceId , res . id ) ;
179+ resources . push ( ...subResources ) ;
180+ }
181+ resources = includeRoot ? resources : resources . slice ( 1 ) ;
182+ return userId
183+ ? await this . permissionFilter ( namespaceId , userId , resources )
184+ : resources ;
185+ }
186+
143187 async getSpaceType ( resource : Resource ) : Promise < SpaceType > {
144188 while ( resource . parentId !== null ) {
145189 resource = ( await this . resourceRepository . findOne ( {
@@ -280,25 +324,18 @@ export class ResourcesService {
280324 ) ;
281325 }
282326
283- async listUserAccessibleResources (
327+ async listAllUserAccessibleResources (
284328 namespaceId : string ,
285329 userId : string ,
286- includeRoot ? : boolean ,
330+ includeRoot : boolean = false ,
287331 ) {
288332 const resources = await this . resourceRepository . find ( {
289333 where : { namespace : { id : namespaceId } , deletedAt : IsNull ( ) } ,
290334 } ) ;
291- const filtered : Resource [ ] = [ ] ;
292- for ( const resource of resources ) {
293- const hasPermission = await this . permissionsService . userHasPermission (
294- namespaceId ,
295- resource . id ,
296- userId ,
297- ) ;
298- if ( hasPermission && ( resource . parentId !== null || includeRoot ) ) {
299- filtered . push ( resource ) ;
300- }
301- }
302- return filtered ;
335+ return await this . permissionFilter (
336+ namespaceId ,
337+ userId ,
338+ resources . filter ( ( res ) => res . parentId !== null || includeRoot ) ,
339+ ) ;
303340 }
304341}
0 commit comments