diff --git a/backend/src/core/api/draft/draft.controller.js b/backend/src/core/api/draft/draft.controller.js index 6ef88c9..6489228 100644 --- a/backend/src/core/api/draft/draft.controller.js +++ b/backend/src/core/api/draft/draft.controller.js @@ -1,5 +1,5 @@ import { DraftService } from 'core/modules/draft/services'; -import { CreateDraftDto } from 'core/modules/draft/dto'; +import { CreateDraftDto, UpdateDraftDto } from 'core/modules/draft/dto'; import { ValidHttpResponse } from 'packages/handler/response/validHttp.response'; class Controller { @@ -13,6 +13,15 @@ class Controller { const data = await this.service.createDraft(userId, dto); return ValidHttpResponse.toOkResponse(data); }; + + updateDraft = async req => { + const userId = req.user.payload.id; + const draftId = req.params.id; + const dto = UpdateDraftDto(req.body); + const data = await this.service.updateDraft(userId, draftId, dto); + return ValidHttpResponse.toOkResponse(data); + }; } export const DraftController = new Controller(); + diff --git a/backend/src/core/api/draft/draft.resolver.js b/backend/src/core/api/draft/draft.resolver.js index cce013d..638ce67 100644 --- a/backend/src/core/api/draft/draft.resolver.js +++ b/backend/src/core/api/draft/draft.resolver.js @@ -1,5 +1,7 @@ import { Module } from 'packages/handler/Module'; -import { CreateDraftInterceptor } from 'core/modules/draft/interceptor'; +import { CreateDraftInterceptor, UpdateDraftInterceptor } from 'core/modules/draft/interceptor'; +import { RecordIdInterceptor } from 'core/modules/interceptor/recordId/record-id.interceptor'; +import { RecordId } from 'core/common/swagger'; import { DraftController } from './draft.controller'; export const DraftResolver = Module.builder() @@ -16,5 +18,16 @@ export const DraftResolver = Module.builder() body: 'CreateDraftDto', controller: DraftController.createDraft, preAuthorization: true + }, + { + route: '/:id', + method: 'put', + params: [RecordId], + interceptors: [RecordIdInterceptor, UpdateDraftInterceptor], + body: 'UpdateDraftDto', + controller: DraftController.updateDraft, + preAuthorization: true } ]); + + diff --git a/backend/src/core/modules/draft/dto/index.js b/backend/src/core/modules/draft/dto/index.js index da620e9..e81c9ef 100644 --- a/backend/src/core/modules/draft/dto/index.js +++ b/backend/src/core/modules/draft/dto/index.js @@ -1 +1,2 @@ export * from './create-draft.dto'; +export * from './update-draft.dto'; diff --git a/backend/src/core/modules/draft/dto/update-draft.dto.js b/backend/src/core/modules/draft/dto/update-draft.dto.js new file mode 100644 index 0000000..695f2c3 --- /dev/null +++ b/backend/src/core/modules/draft/dto/update-draft.dto.js @@ -0,0 +1,10 @@ +import { ApiDocument } from 'core/config/swagger.config'; +import { SwaggerDocument } from 'packages/swagger'; + +ApiDocument.addModel('UpdateDraftDto', { + content: SwaggerDocument.ApiProperty({ type: 'object', required: false }), +}); + +export const UpdateDraftDto = body => ({ + content: body.content || {}, +}); diff --git a/backend/src/core/modules/draft/interceptor/index.js b/backend/src/core/modules/draft/interceptor/index.js index 18bcdd9..910bc16 100644 --- a/backend/src/core/modules/draft/interceptor/index.js +++ b/backend/src/core/modules/draft/interceptor/index.js @@ -1 +1,2 @@ export * from './create-draft.interceptor'; +export * from './update-draft.interceptor'; diff --git a/backend/src/core/modules/draft/interceptor/update-draft.interceptor.js b/backend/src/core/modules/draft/interceptor/update-draft.interceptor.js new file mode 100644 index 0000000..e039b19 --- /dev/null +++ b/backend/src/core/modules/draft/interceptor/update-draft.interceptor.js @@ -0,0 +1,8 @@ +import Joi from 'joi'; +import { DefaultValidatorInterceptor } from 'core/infrastructure/interceptor'; + +export const UpdateDraftInterceptor = new DefaultValidatorInterceptor( + Joi.object({ + content: Joi.object().optional().allow(null), + }) +); diff --git a/backend/src/core/modules/draft/services/draft.service.js b/backend/src/core/modules/draft/services/draft.service.js index 12efdef..59bb337 100644 --- a/backend/src/core/modules/draft/services/draft.service.js +++ b/backend/src/core/modules/draft/services/draft.service.js @@ -27,6 +27,37 @@ class Service { throw new InternalServerException(error.message); } } + + async updateDraft(userId, draftId, payload) { + try { + const { content } = payload; + + const existing = await prisma.documents.findFirst({ + where: { + id: draftId, + user_id: userId, + is_draft: true, + deleted_at: null + } + }); + + if (!existing) { + throw new NotFoundException(`Draft with ID "${draftId}" not found`); + } + + return await prisma.documents.update({ + where: { id: draftId }, + data: { + content: content || {}, + updated_at: new Date() + } + }); + } catch (error) { + if (error instanceof NotFoundException) throw error; + throw new InternalServerException(error.message); + } + } } + export const DraftService = new Service();