diff --git a/src/data/entity/document.entity.ts b/src/data/entity/document.entity.ts index f7c05f9..2749294 100644 --- a/src/data/entity/document.entity.ts +++ b/src/data/entity/document.entity.ts @@ -57,6 +57,12 @@ export default class Document { @Column({ nullable: true }) volunteerId: number; + @Column({ default: false }) + received: boolean; + + @Column({ nullable: true, type: "timestamp" }) + receivedOn: Date | null; + @CreateDateColumn() createdAt: Date; diff --git a/src/data/migrations/1777303247669-add-document-received.ts b/src/data/migrations/1777303247669-add-document-received.ts new file mode 100644 index 0000000..f44e0de --- /dev/null +++ b/src/data/migrations/1777303247669-add-document-received.ts @@ -0,0 +1,18 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddDocumentReceived1777303247669 implements MigrationInterface { + name = "AddDocumentReceived1777303247669"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE "document" + ADD COLUMN IF NOT EXISTS "received" boolean NOT NULL DEFAULT false, + ADD COLUMN IF NOT EXISTS "received_on" timestamp + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "document" DROP COLUMN IF EXISTS "received_on"`); + await queryRunner.query(`ALTER TABLE "document" DROP COLUMN IF EXISTS "received"`); + } +} diff --git a/src/server/routes/volunteer/doc.routes.ts b/src/server/routes/volunteer/doc.routes.ts index 197e27e..d246acd 100644 --- a/src/server/routes/volunteer/doc.routes.ts +++ b/src/server/routes/volunteer/doc.routes.ts @@ -10,6 +10,7 @@ import { responseErrors, volunteerDocSchemaGet200, volunteerDocSchemaGetMeta200, + volunteerDocSchemaPatchBody, volunteerDocSchemaUploadMeta, } from "../../schema"; import { getVolunteerDocuments } from "../../utils"; @@ -244,4 +245,57 @@ export default async function volunteerDocRoutes( }); }, ); + + fastify.patch<{ + Params: { id: number; type: DocumentType }; + Body: { received: boolean }; + }>( + "/:type", + { + schema: { + params: idTypeParamSchema, + body: volunteerDocSchemaPatchBody, + response: { + 200: { + type: "object", + properties: { message: { type: "string" } }, + required: ["message"], + }, + ...responseErrors, + }, + }, + }, + async (request, reply) => { + const { id, type } = request.params; + const { received } = request.body; + const documentRepository = fastify.db.documentRepository; + + const doc = await documentRepository.findOneBy({ volunteerId: id, type }); + + if (!doc) { + return reply.status(404).send({ + message: `Document of type:${type} for volunteer_id:${id} not found.`, + }); + } + + const [, error] = await tryCatch( + documentRepository.save({ + ...doc, + received, + receivedOn: received ? new Date() : null, + }), + ); + + if (error) { + logger.error(`Error updating document for volunteer ${id}: ${error}`); + return reply.status(400).send({ + message: `Error updating document: ${error}`, + }); + } + + return reply.send({ + message: `Document of type:${type} for volunteer_id:${id} successfully updated.`, + }); + }, + ); } diff --git a/src/server/schema/volunteer-doc.schema.ts b/src/server/schema/volunteer-doc.schema.ts index 607643c..d09036b 100644 --- a/src/server/schema/volunteer-doc.schema.ts +++ b/src/server/schema/volunteer-doc.schema.ts @@ -33,6 +33,14 @@ export const volunteerDocSchemaGetMeta200 = { required: ["url", "fields"], }; +export const volunteerDocSchemaPatchBody = { + type: "object", + properties: { + received: { type: "boolean" }, + }, + required: ["received"], +}; + export const volunteerDocSchemaUploadMeta = { type: "object", properties: { diff --git a/src/services/dto/dto-document.ts b/src/services/dto/dto-document.ts index 46feb46..e80d0ee 100644 --- a/src/services/dto/dto-document.ts +++ b/src/services/dto/dto-document.ts @@ -10,5 +10,7 @@ export function documentSerializer(doc: Document): ApiDocumentGet { url: getDocumentUrl(doc.s3Key), mimeType: doc.mimeType, createdAt: doc.createdAt, + received: doc.received ?? false, + receivedOn: doc.receivedOn ?? null, }; }