Skip to content

Commit 6f0be46

Browse files
committed
refactor(resources): update listChildren
1 parent 61961ab commit 6f0be46

File tree

5 files changed

+69
-48
lines changed

5 files changed

+69
-48
lines changed

src/api-key/api-key.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,9 @@ export class APIKeyService {
206206

207207
async info(apiKey: APIKey): Promise<APIKeyInfoDto> {
208208
// Get the namespace
209-
const namespace = await this.namespacesService.getNamespace(apiKey.namespaceId);
209+
const namespace = await this.namespacesService.getNamespace(
210+
apiKey.namespaceId,
211+
);
210212

211213
// Get the user
212214
const user = await this.userService.find(apiKey.userId);

src/namespace-resources/namespace-resources.service.ts

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -128,27 +128,26 @@ export class NamespaceResourcesService {
128128
return resources.map((resource) => resource.id);
129129
}
130130

131-
private async hasChildren(
132-
namespaceId: string,
133-
parents: ResourceMetaDto[],
134-
userId: string,
135-
): Promise<boolean> {
136-
const children = await this.resourcesService.getSubResources(
137-
namespaceId,
138-
parents[0].id,
139-
);
140-
for (const child of children) {
141-
const permission = await this.permissionsService.getCurrentPermission(
142-
namespaceId,
143-
[child, ...parents],
144-
userId,
145-
);
146-
if (permission !== ResourcePermission.NO_ACCESS) {
147-
return true;
148-
}
149-
}
150-
return false;
151-
}
131+
// private async hasChildren(
132+
// namespaceId: string,
133+
// parents: ResourceMetaDto[],
134+
// userId: string,
135+
// ): Promise<boolean> {
136+
// const children = await this.resourcesService.getSubResources(namespaceId, [
137+
// parents[0].id,
138+
// ]);
139+
// for (const child of children) {
140+
// const permission = await this.permissionsService.getCurrentPermission(
141+
// namespaceId,
142+
// [child, ...parents],
143+
// userId,
144+
// );
145+
// if (permission !== ResourcePermission.NO_ACCESS) {
146+
// return true;
147+
// }
148+
// }
149+
// return false;
150+
// }
152151

153152
async create(
154153
userId: string,
@@ -403,10 +402,9 @@ export class NamespaceResourcesService {
403402
if (permission === ResourcePermission.NO_ACCESS) {
404403
return [];
405404
}
406-
const children = await this.resourcesService.getSubResources(
407-
namespaceId,
405+
const children = await this.resourcesService.getSubResources(namespaceId, [
408406
parents[0].id,
409-
);
407+
]);
410408
const filteredChildren: ResourceMetaDto[] = [];
411409
for (const child of children) {
412410
const permission = await this.permissionsService.getCurrentPermission(
@@ -430,21 +428,42 @@ export class NamespaceResourcesService {
430428
namespaceId,
431429
resourceId,
432430
);
433-
const children = await this.getSubResourcesByParents(
431+
const children = await this.resourcesService.getSubResources(namespaceId, [
432+
resourceId,
433+
]);
434+
const subChildren = await this.resourcesService.getSubResources(
435+
namespaceId,
436+
children.map((child) => child.id),
437+
);
438+
const resources = [...parents, ...children, ...subChildren];
439+
const permissionMap = await this.permissionsService.getCurrentPermissions(
434440
namespaceId,
435-
parents,
436441
userId,
442+
resources,
437443
);
438-
const resps: ChildrenMetaDto[] = [];
444+
445+
const hasChildrenMap = new Map<string, boolean>();
446+
for (const subChild of subChildren) {
447+
if (!subChild.parentId) {
448+
continue;
449+
}
450+
const permission = permissionMap.get(subChild.id);
451+
if (!permission || permission === ResourcePermission.NO_ACCESS) {
452+
continue;
453+
}
454+
hasChildrenMap.set(subChild.parentId, true);
455+
}
456+
457+
const childrenDtos: ChildrenMetaDto[] = [];
439458
for (const child of children) {
440-
const hasChildren = await this.hasChildren(
441-
namespaceId,
442-
[child, ...parents],
443-
userId,
444-
);
445-
resps.push(new ChildrenMetaDto(child, hasChildren));
459+
const permission = permissionMap.get(child.id);
460+
if (!permission || permission === ResourcePermission.NO_ACCESS) {
461+
continue;
462+
}
463+
const hasChildren = hasChildrenMap.get(child.id) || false;
464+
childrenDtos.push(new ChildrenMetaDto(child, hasChildren));
446465
}
447-
return resps;
466+
return childrenDtos;
448467
}
449468

450469
async getSpaceType(

src/namespaces/namespaces.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Namespace } from './entities/namespace.entity';
88
import { NamespaceMember } from './entities/namespace-member.entity';
99
import { NamespaceResourcesModule } from 'omniboxd/namespace-resources/namespace-resources.module';
1010
import { PermissionsModule } from 'omniboxd/permissions/permissions.module';
11+
import { ResourcesModule } from 'omniboxd/resources/resources.module';
1112

1213
@Module({
1314
exports: [NamespacesService],
@@ -16,6 +17,7 @@ import { PermissionsModule } from 'omniboxd/permissions/permissions.module';
1617
imports: [
1718
UserModule,
1819
NamespaceResourcesModule,
20+
ResourcesModule,
1921
PermissionsModule,
2022
TypeOrmModule.forFeature([Resource]),
2123
TypeOrmModule.forFeature([Namespace]),

src/permissions/permissions.service.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export class PermissionsService {
167167
userId: string,
168168
resources: ResourceMetaDto[],
169169
entityManager?: EntityManager,
170-
): Promise<ResourcePermission[]> {
170+
): Promise<Map<string, ResourcePermission>> {
171171
if (!entityManager) {
172172
return await this.dataSource.transaction((entityManager) =>
173173
this.getCurrentPermissions(
@@ -277,22 +277,20 @@ export class PermissionsService {
277277
}
278278
};
279279

280-
const permissions: ResourcePermission[] = new Array(resources.length).fill(
281-
ResourcePermission.NO_ACCESS,
282-
);
280+
const permissions: Map<string, ResourcePermission> = new Map();
283281
for (let i = 0; i < resources.length; i++) {
284282
const resource = resources[i];
285283
const userPermission = calcUserPermission(resource);
286284
const groupPermissions = groupIds.map((groupId) =>
287285
calcGroupPermission(resource, groupId),
288286
);
289287
const globalPermission = calcGlobalPermission(resource);
290-
permissions[i] =
291-
maxPermissions([
292-
globalPermission,
293-
userPermission,
294-
...groupPermissions,
295-
]) || ResourcePermission.NO_ACCESS;
288+
const permission = maxPermissions([
289+
globalPermission,
290+
userPermission,
291+
...groupPermissions,
292+
]);
293+
permissions.set(resource.id, permission || ResourcePermission.NO_ACCESS);
296294
}
297295
return permissions;
298296
}

src/resources/resources.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Injectable, NotFoundException } from '@nestjs/common';
22
import { InjectRepository } from '@nestjs/typeorm';
33
import { Resource, ResourceType } from './entities/resource.entity';
4-
import { DataSource, EntityManager, Repository } from 'typeorm';
4+
import { DataSource, EntityManager, In, Repository } from 'typeorm';
55
import { ResourceMetaDto } from './dto/resource-meta.dto';
66
import { WizardTaskService } from 'omniboxd/tasks/wizard-task.service';
77
import { Task } from 'omniboxd/tasks/tasks.entity';
@@ -101,7 +101,7 @@ export class ResourcesService {
101101

102102
async getSubResources(
103103
namespaceId: string,
104-
resourceId: string,
104+
parentIds: string[],
105105
): Promise<ResourceMetaDto[]> {
106106
const children = await this.resourceRepository.find({
107107
select: [
@@ -116,7 +116,7 @@ export class ResourcesService {
116116
],
117117
where: {
118118
namespaceId,
119-
parentId: resourceId,
119+
parentId: In(parentIds),
120120
},
121121
order: { updatedAt: 'DESC' },
122122
});

0 commit comments

Comments
 (0)