Skip to content

Commit ab7d482

Browse files
committed
refactor(namespaces): restore private root
1 parent c73e587 commit ab7d482

File tree

2 files changed

+81
-28
lines changed

2 files changed

+81
-28
lines changed

src/namespaces/namespaces.service.ts

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -188,22 +188,19 @@ export class NamespacesService {
188188
await this.namespaceRepository.softDelete(id);
189189
}
190190

191-
async addMember(
192-
namespaceId: string,
191+
async createOrRestorePrivateRoot(
193192
userId: string,
194-
role: NamespaceRole,
195-
permission: ResourcePermission,
193+
namespaceId: string,
194+
namespaceMember: NamespaceMember | null,
196195
entityManager: EntityManager,
197-
) {
198-
const count = await entityManager.count(NamespaceMember, {
199-
where: {
196+
): Promise<string> {
197+
if (namespaceMember) {
198+
await this.resourcesService.restoreResource(
200199
namespaceId,
201-
userId,
202-
deletedAt: IsNull(),
203-
},
204-
});
205-
if (count > 0) {
206-
return;
200+
namespaceMember.rootResourceId,
201+
entityManager,
202+
);
203+
return namespaceMember.rootResourceId;
207204
}
208205
const privateRoot = await this.resourcesService.createResource(
209206
{
@@ -214,12 +211,45 @@ export class NamespacesService {
214211
},
215212
entityManager,
216213
);
214+
await this.resourcesService.createResource(
215+
{
216+
namespaceId,
217+
parentId: privateRoot.id,
218+
userId,
219+
resourceType: ResourceType.FOLDER,
220+
name: await this.getUncategorizedName(userId, entityManager),
221+
},
222+
entityManager,
223+
);
224+
return privateRoot.id;
225+
}
226+
227+
async addMember(
228+
namespaceId: string,
229+
userId: string,
230+
role: NamespaceRole,
231+
permission: ResourcePermission,
232+
entityManager: EntityManager,
233+
) {
234+
const namespaceMember = await entityManager.findOne(NamespaceMember, {
235+
where: { namespaceId, userId },
236+
withDeleted: true,
237+
});
238+
if (namespaceMember && !namespaceMember.deletedAt) {
239+
return;
240+
}
241+
const privateRootId = await this.createOrRestorePrivateRoot(
242+
userId,
243+
namespaceId,
244+
namespaceMember,
245+
entityManager,
246+
);
217247
await entityManager.save(
218248
entityManager.create(NamespaceMember, {
219249
namespaceId,
220250
userId,
221251
role,
222-
rootResourceId: privateRoot.id,
252+
rootResourceId: privateRootId,
223253
}),
224254
);
225255
const teamspaceRoot = await this.getTeamspaceRoot(
@@ -235,21 +265,11 @@ export class NamespacesService {
235265
);
236266
await this.permissionsService.updateUserPermission(
237267
namespaceId,
238-
privateRoot.id,
268+
privateRootId,
239269
userId,
240270
ResourcePermission.FULL_ACCESS,
241271
entityManager,
242272
);
243-
await this.resourcesService.createResource(
244-
{
245-
namespaceId,
246-
parentId: privateRoot.id,
247-
userId,
248-
resourceType: ResourceType.FOLDER,
249-
name: await this.getUncategorizedName(userId, entityManager),
250-
},
251-
entityManager,
252-
);
253273
}
254274

255275
private async getUncategorizedName(
@@ -347,10 +367,11 @@ export class NamespacesService {
347367
return;
348368
}
349369
// Delete private root
350-
await manager.softDelete(Resource, {
370+
await this.resourcesService.deleteResource(
351371
namespaceId,
352-
id: member.rootResourceId,
353-
});
372+
member.rootResourceId,
373+
manager,
374+
);
354375
// Clear user permissions
355376
await manager.softDelete(UserPermission, {
356377
namespaceId,

src/resources/resources.service.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,4 +327,36 @@ export class ResourcesService {
327327

328328
return resource;
329329
}
330+
331+
async restoreResource(
332+
namespaceId: string,
333+
resourceId: string,
334+
entityManager?: EntityManager,
335+
): Promise<void> {
336+
if (!entityManager) {
337+
return await this.dataSource.transaction((entityManager) =>
338+
this.restoreResource(namespaceId, resourceId, entityManager),
339+
);
340+
}
341+
await entityManager.restore(Resource, {
342+
namespaceId,
343+
id: resourceId,
344+
});
345+
}
346+
347+
async deleteResource(
348+
namespaceId: string,
349+
resourceId: string,
350+
entityManager?: EntityManager,
351+
): Promise<void> {
352+
if (!entityManager) {
353+
return await this.dataSource.transaction((entityManager) =>
354+
this.restoreResource(namespaceId, resourceId, entityManager),
355+
);
356+
}
357+
await entityManager.softDelete(Resource, {
358+
namespaceId,
359+
id: resourceId,
360+
});
361+
}
330362
}

0 commit comments

Comments
 (0)