diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts index 6f7b0874895e7fc2be070a8b6e68c8e7b7ff341e..de7d201a3eed05d3d3d8af8c6efc3128c2ab6c4f 100644 --- a/src/admin/admin.controller.ts +++ b/src/admin/admin.controller.ts @@ -16,7 +16,7 @@ import { validate } from 'class-validator'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema'; import { NewsletterService } from '../newsletter/newsletter.service'; -import { Structure } from '../structures/schemas/structure.schema'; +import { Structure, StructureDocument } from '../structures/schemas/structure.schema'; import { StructuresService } from '../structures/services/structures.service'; import { Roles } from '../users/decorators/roles.decorator'; import { RolesGuard } from '../users/guards/roles.guard'; @@ -315,10 +315,21 @@ export class AdminController { @ApiBearerAuth('JWT') @ApiOperation({ description: 'Get deleted structures' }) @Get('getDeletedStructures') - public async getDeletedStructures() { + public async getDeletedStructures(): Promise<StructureDocument[]> { this.logger.debug('getDeletedStructures'); const deletedStructures = await this.structuresService.findAll(true); this.logger.debug(`Found ${deletedStructures.length} deleted structures`); return deletedStructures; } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @ApiBearerAuth('JWT') + @ApiOperation({ description: 'Get deleted structures' }) + @Post('restoreDeletedStructure/:structureId') + public async restoreDeletedStructures(@Param('structureId') structureId: string): Promise<void> { + this.logger.debug(`restoreDeletedStructures: ${structureId}`); + await this.structuresService.restoreStructure(structureId); + await this.structuresService.initiateStructureIndex(); + } } diff --git a/src/structures/services/structures.service.spec.ts b/src/structures/services/structures.service.spec.ts index 26674c4adb78bd498c8b5b4c9a31c5ed16b4c140..3d38b1b29d18c2e8031544c3b873f08a91607062 100644 --- a/src/structures/services/structures.service.spec.ts +++ b/src/structures/services/structures.service.spec.ts @@ -619,4 +619,13 @@ describe('StructuresService', () => { expect(mockSetCNFSid).toHaveBeenCalledTimes(2); }); }); + + describe('restoreStructure', () => { + it('should restore a structure', async () => { + mockStructureModel.findByIdAndUpdate.mockReturnThis(); + mockStructureModel.exec.mockImplementation(() => null); + await service.restoreStructure('someId'); + expect(mockStructureModel.findByIdAndUpdate).toBeCalled(); + }); + }); }); diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts index 5018ad442d9aca900825fdfe73a1e2c252d123be..85191dd965273a3ff773d6d1d6bcb308bea2691c 100644 --- a/src/structures/services/structures.service.ts +++ b/src/structures/services/structures.service.ts @@ -1158,4 +1158,9 @@ export class StructuresService { } return null; } + + public async restoreStructure(structureId: string) { + this.logger.debug(`restoreDeletedStructures: ${structureId}`); + this.structureModel.findByIdAndUpdate(structureId, { $unset: { deletedAt: 1 } }).exec(); + } }