Skip to content

Commit 66ed506

Browse files
committed
refactor(permissions): add getCurrentPermissions
1 parent 4dbdd7a commit 66ed506

File tree

1 file changed

+73
-9
lines changed

1 file changed

+73
-9
lines changed

src/permissions/permissions.service.ts

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)