diff --git a/src/activity/controllers/activity/activity.controller.spec.ts b/src/activity/controllers/activity/activity.controller.spec.ts index 04f0d46..57f1faf 100644 --- a/src/activity/controllers/activity/activity.controller.spec.ts +++ b/src/activity/controllers/activity/activity.controller.spec.ts @@ -66,6 +66,7 @@ describe('ActivityController', () => { eventAccessibility: 'Wheelchair accessible venue.', eventNote: 'This is a sample note.', isHidden: false, + isArchived: false, }; const mockUpdateActivity = { @@ -103,6 +104,7 @@ describe('ActivityController', () => { eventAccessibility: 'Wheelchair accessible venue updated.', eventNote: 'This is a sample note.', isHidden: false, + isArchived: false, }; beforeEach(async () => { @@ -211,6 +213,7 @@ describe('ActivityController', () => { eventAccessibility: 'Wheelchair accessible venue.', eventNote: 'This is a sample note.', isHidden: false, + isArchived: false, }; const expectedResponse = { activity: mockCreateEvent, @@ -260,6 +263,7 @@ describe('ActivityController', () => { eventAccessibility: 'Wheelchair accessible venue.', eventNote: 'This is a sample note.', isHidden: false, + isArchived: false, }; const errorMessage = 'Error occurred while creating event'; jest diff --git a/src/activity/controllers/activity/activity.controller.ts b/src/activity/controllers/activity/activity.controller.ts index 1c70b04..000ef9e 100644 --- a/src/activity/controllers/activity/activity.controller.ts +++ b/src/activity/controllers/activity/activity.controller.ts @@ -99,4 +99,25 @@ export class ActivityController { throw new UnauthorizedException(); } } + + @Put('archive/:id') + @UseGuards(AuthGuard()) + async archiveActivityById( + @Param('id') id: string, + @Req() req: any, + ): Promise<{ archivedActivity: Activity; message: string }> { + const preOperationActivity: Activity = + await this.activityService.getActivityById(id); + if (req.user.role === Role.admin) { + return this.activityService.archiveActivityById(id); + } + if ( + preOperationActivity.createdByUser.equals(req.user._id) && + req.user.role === Role.creator + ) { + return await this.activityService.archiveActivityById(id); + } else { + throw new UnauthorizedException(); + } + } } diff --git a/src/activity/dto/create-activity.dto.ts b/src/activity/dto/create-activity.dto.ts index 5b8a914..9dd89d2 100644 --- a/src/activity/dto/create-activity.dto.ts +++ b/src/activity/dto/create-activity.dto.ts @@ -120,4 +120,8 @@ export class CreateActivityDto { @IsOptional() @IsBoolean() readonly isHidden: boolean; + + @IsOptional() + @IsBoolean() + readonly isArchived: boolean; } diff --git a/src/activity/dto/update-activity.dto.ts b/src/activity/dto/update-activity.dto.ts index ddff7ea..fb6b61e 100644 --- a/src/activity/dto/update-activity.dto.ts +++ b/src/activity/dto/update-activity.dto.ts @@ -134,4 +134,8 @@ export class UpdateActivityDto { @IsOptional() @IsBoolean() readonly isHidden: boolean; + + @IsOptional() + @IsBoolean() + readonly isArchived: boolean; } diff --git a/src/activity/schemas/activity.schema.ts b/src/activity/schemas/activity.schema.ts index e80130e..32fcdc8 100644 --- a/src/activity/schemas/activity.schema.ts +++ b/src/activity/schemas/activity.schema.ts @@ -99,6 +99,9 @@ export class Activity { @Prop({ default: false }) isHidden: boolean; + + @Prop({ default: false }) + isArchived: boolean; } export const ActivitySchema = SchemaFactory.createForClass(Activity); diff --git a/src/activity/services/activity/activity.service.ts b/src/activity/services/activity/activity.service.ts index 43b275e..d3f8959 100644 --- a/src/activity/services/activity/activity.service.ts +++ b/src/activity/services/activity/activity.service.ts @@ -154,4 +154,26 @@ export class ActivityService { message: 'Activity deleted successfully.', }; } + + async archiveActivityById( + id: string, + ): Promise<{ archivedActivity: Activity; message: string }> { + const isValidId = mongoose.isValidObjectId(id); + // if provided ID is invalid, throw BadRequestException exception + if (!isValidId) { + throw new BadRequestException('Invalid ID. Please enter correct id.'); + } + const activity = await this.activityModel.findById(id).exec(); + // if no activity found with given ID, throw NotFoundException exception + if (!activity) { + throw new NotFoundException(`Activity with ID ${id} not found.`); + } + const archivedActivity = await this.activityModel + .findByIdAndUpdate(id, { isArchived: true }) + .exec(); + return { + archivedActivity, + message: 'Activity archived successfully.', + }; + } } diff --git a/test/mock-data/createMockActivity.ts b/test/mock-data/createMockActivity.ts index 0ef98bd..848c17b 100644 --- a/test/mock-data/createMockActivity.ts +++ b/test/mock-data/createMockActivity.ts @@ -33,6 +33,7 @@ const createMockActivity: CreateActivityDto = { eventAccessibility: 'Wheelchair accessible venue.', eventNote: 'This is a sample note.', isHidden: false, + isArchived: false, }; export default createMockActivity;