diff --git a/src/form/form.controller.ts b/src/form/form.controller.ts index 2fc618b..c97bc0a 100644 --- a/src/form/form.controller.ts +++ b/src/form/form.controller.ts @@ -12,6 +12,7 @@ import { ApiOperation } from '@nestjs/swagger'; import { UpdateFieldDto } from './dto/update-field.dto'; import { CreateUpdateDto } from './dto/create-update.dto'; + @Controller('form') export class FormController { constructor(private readonly formService: FormService) {} @@ -28,6 +29,12 @@ export class FormController { return await this.formService.findAll(); } + @Get(':formId') + @ApiOperation({ summary: 'Find a form' }) + async find(@Param('formId') formId: string) { + return await this.formService.find(formId); + } + @Patch(':id/fields/:fieldId') @ApiOperation({ summary: 'update a field in a form' }) async updateField( @@ -40,7 +47,22 @@ export class FormController { @Delete(':id/fields/:fieldId') @ApiOperation({ summary: 'Delete a field' }) - deleteField(@Param('id') id: string, @Param('fieldId') fieldId: string) { - return this.formService.deleteField(id, fieldId); + async deleteField( + @Param('id') id: string, + @Param('fieldId') fieldId: string, + ) { + return await this.formService.deleteField(id, fieldId); + } + + @Delete(':id') + @ApiOperation({ summary: 'Soft delete a form' }) + async softDelete(@Param('id') id: string) { + return await this.formService.softDelete(id); + } + + @Patch(':id/restore') + @ApiOperation({ summary: 'Restore a soft deleted form' }) + restore(@Param('id') id: string) { + return this.formService.restore(id); } } diff --git a/src/form/form.service.ts b/src/form/form.service.ts index 291d268..5d53cf9 100644 --- a/src/form/form.service.ts +++ b/src/form/form.service.ts @@ -1,3 +1,4 @@ +import { FormModule } from './form.module'; import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Form, FormDocument, Status } from './schemas/form.schema'; @@ -7,6 +8,7 @@ import { CreateFieldDto } from './dto/create-field.dto'; import { UpdateFieldDto } from './dto/update-field.dto'; import { CreateUpdateDto } from './dto/create-update.dto'; + @Injectable() export class FormService { constructor(@InjectModel(Form.name) private formModel: Model) {} @@ -36,11 +38,11 @@ export class FormService { } async findAll(): Promise { - return await this.formModel.find().exec(); + return await this.formModel.find({isDeleted:false}).exec(); } async find(formId: string): Promise
{ - const form = await this.formModel.findOne({ id: formId }).exec(); + const form = await this.formModel.findOne({ id: formId, isDeleted:false }).exec(); if (!form) throw new NotFoundException(`Form ${formId} not found`); return form; } @@ -77,4 +79,35 @@ export class FormService { if (!form) throw new NotFoundException(`Form ${formId} not found`); return form; } + + async softDelete(FormId: string): Promise { + const form = await this.formModel.findOneAndUpdate( + { id: FormId, isDeleted: false }, // prevent double deletion + { + $set: { + isDeleted: true, + deletedAt: new Date(), + }, + }, + { new: true }, + ); + + if (!form) throw new NotFoundException(`Form ${FormId} not found`); + return form; + } + + async restore(FormId: string): Promise { + const form = await this.formModel.findOneAndUpdate( + { id: FormId, isDeleted: true }, + { + $set: { + isDeleted: false, + deletedAt: null, + }, + }, + { new: true }, + ); + if (!form) throw new NotFoundException(`Form ${FormId} not found`); + return form; + } } diff --git a/src/form/schemas/form.schema.ts b/src/form/schemas/form.schema.ts index d817c06..0642ec0 100644 --- a/src/form/schemas/form.schema.ts +++ b/src/form/schemas/form.schema.ts @@ -25,6 +25,12 @@ export class Form { default: Status.DRAFT, }) status!: Status; + + @Prop({ default: false }) + isDeleted?: boolean; + + @Prop({ type: Date, default: null }) + deletedAt?: Date; } export const FormSchema = SchemaFactory.createForClass(Form);