@@ -41,7 +41,7 @@ export class PermissionsService {
4141 private readonly dataSource : DataSource ,
4242 private readonly userService : UserService ,
4343 private readonly resourcesService : ResourcesService ,
44- ) { }
44+ ) { }
4545
4646 async getGroupPermissions (
4747 namespaceId : string ,
@@ -203,26 +203,90 @@ export class PermissionsService {
203203 } ,
204204 } ) ;
205205
206- // resourceId -> GroupPermission[]
207- const groupPermissionMap : Map < string , GroupPermission [ ] > = new Map ( ) ;
206+ // resourceId + groupId -> GroupPermission
207+ const groupPermissionKeyMap : Map < string , GroupPermission > = new Map ( ) ;
208208 for ( const permission of groupPermissions ) {
209- const resourceId = permission . resourceId ;
210- if ( ! groupPermissionMap . has ( resourceId ) ) {
211- groupPermissionMap . set ( resourceId , [ ] ) ;
212- }
213- groupPermissionMap . get ( resourceId ) ! . push ( permission ) ;
209+ groupPermissionKeyMap . set (
210+ `${ permission . resourceId } ||${ permission . groupId } ` ,
211+ permission ,
212+ ) ;
214213 }
215214 // resourceId -> UserPermission
216215 const userPermissionMap : Map < string , UserPermission > = new Map ( ) ;
217216 for ( const permission of userPermissions ) {
218217 userPermissionMap . set ( permission . resourceId , permission ) ;
219218 }
219+ // resourceId -> ResourceMetaDto
220+ const resourceMap : Map < string , ResourceMetaDto > = new Map ( ) ;
221+ for ( const resource of resources ) {
222+ resourceMap . set ( resource . id , resource ) ;
223+ }
224+
225+ const calcUserPermission = ( resource : ResourceMetaDto ) => {
226+ while ( true ) {
227+ const userPermission = userPermissionMap . get ( resource . id ) ;
228+ if ( userPermission ) {
229+ return userPermission . permission ;
230+ }
231+ if ( ! resource . parentId ) {
232+ return null ;
233+ }
234+ const parent = resourceMap . get ( resource . parentId ) ;
235+ if ( ! parent ) {
236+ return null ;
237+ }
238+ resource = parent ;
239+ }
240+ } ;
241+
242+ const calcGroupPermission = ( resource : ResourceMetaDto , groupId : string ) => {
243+ while ( true ) {
244+ const groupPermission = groupPermissionKeyMap . get (
245+ `${ resource . id } ||${ groupId } ` ,
246+ ) ;
247+ if ( groupPermission ) {
248+ return groupPermission . permission ;
249+ }
250+ if ( ! resource . parentId ) {
251+ return null ;
252+ }
253+ const parent = resourceMap . get ( resource . parentId ) ;
254+ if ( ! parent ) {
255+ return null ;
256+ }
257+ resource = parent ;
258+ }
259+ } ;
260+
261+ const calcGlobalPermission = ( resource : ResourceMetaDto ) => {
262+ while ( true ) {
263+ if ( resource . globalPermission ) {
264+ return resource . globalPermission ;
265+ }
266+ if ( ! resource . parentId ) {
267+ return null ;
268+ }
269+ const parent = resourceMap . get ( resource . parentId ) ;
270+ if ( ! parent ) {
271+ return null ;
272+ }
273+ resource = parent ;
274+ }
275+ } ;
220276
221277 const permissions : ResourcePermission [ ] = new Array ( resources . length ) . fill (
222278 ResourcePermission . NO_ACCESS ,
223279 ) ;
224280 for ( let i = resources . length - 1 ; i >= 0 ; i -- ) {
225- // todo
281+ const resource = resources [ i ] ;
282+ const userPermission = calcUserPermission ( resource ) ;
283+ const groupPermissions = groupIds . map ( ( groupId ) =>
284+ calcGroupPermission ( resource , groupId ) ,
285+ ) ;
286+ const globalPermission = calcGlobalPermission ( resource ) ;
287+ permissions [ i ] =
288+ maxPermissions ( [ globalPermission , userPermission , ...groupPermissions ] ) ||
289+ ResourcePermission . NO_ACCESS ;
226290 }
227291 return permissions ;
228292 }
0 commit comments