diff --git a/src/db/migrations/1733833824321-create-task-entities.ts b/src/db/migrations/1733904556416-create-task-entities.ts similarity index 61% rename from src/db/migrations/1733833824321-create-task-entities.ts rename to src/db/migrations/1733904556416-create-task-entities.ts index 26d6e10..946a7e1 100644 --- a/src/db/migrations/1733833824321-create-task-entities.ts +++ b/src/db/migrations/1733904556416-create-task-entities.ts @@ -1,36 +1,17 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; -export class CreateTaskEntities1733833824321 implements MigrationInterface { - name = 'CreateTaskEntities1733833824321'; +export class CreateTaskEntities1733904556416 implements MigrationInterface { + name = 'CreateTaskEntities1733904556416'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query( - `CREATE TABLE "task_submissions" - ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "status" character varying NOT NULL, "submitted_at" TIMESTAMP WITH TIME ZONE NOT NULL, - "task_id" uuid NOT NULL, "proof_of_completion_id" uuid, - "created_at" TIMESTAMP NOT NULL DEFAULT now(), - "updated_at" TIMESTAMP NOT NULL DEFAULT now(), - CONSTRAINT "REL_d6cfaee118a0300d652e28ee16" UNIQUE ("task_id"), - CONSTRAINT "PK_8d19d6b5dd776e373113de50018" PRIMARY KEY ("id"))`, + `CREATE TABLE "task_submissions" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "status" character varying NOT NULL, "submitted_at" TIMESTAMP WITH TIME ZONE NOT NULL, "task_id" uuid NOT NULL, "proof_of_completion_id" uuid, "created_at" TIMESTAMP NOT NULL DEFAULT now(), "updated_at" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "REL_d6cfaee118a0300d652e28ee16" UNIQUE ("task_id"), CONSTRAINT "PK_8d19d6b5dd776e373113de50018" PRIMARY KEY ("id"))`, ); await queryRunner.query( - `CREATE TABLE "tasks" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "title" character varying(255) NOT NULL, - "description" character varying(255) NOT NULL, - "reward_amount" numeric(12,3) NOT NULL, - "image_id" uuid NOT NULL, - "task_frequency" character varying NOT NULL, - "start_date" date NOT NULL, "due_date" date NOT NULL, - "is_proof_required" boolean NOT NULL, - "assigned_to_id" uuid NOT NULL, - "assigned_by_id" uuid NOT NULL, - "created_at" TIMESTAMP NOT NULL DEFAULT now(), - "updated_at" TIMESTAMP NOT NULL DEFAULT now(), - CONSTRAINT "PK_8d12ff38fcc62aaba2cab748772" PRIMARY KEY ("id"))`, + `CREATE TABLE "tasks" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "title" character varying(255) NOT NULL, "description" character varying(255) NOT NULL, "reward_amount" numeric(12,3) NOT NULL, "image_id" uuid NOT NULL, "task_frequency" character varying NOT NULL, "start_date" date NOT NULL, "due_date" date NOT NULL, "is_proof_required" boolean NOT NULL, "assigned_to_id" uuid NOT NULL, "assigned_by_id" uuid NOT NULL, "created_at" TIMESTAMP NOT NULL DEFAULT now(), "updated_at" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_8d12ff38fcc62aaba2cab748772" PRIMARY KEY ("id"))`, ); await queryRunner.query( - `ALTER TABLE "task_submissions" ADD CONSTRAINT "FK_d6cfaee118a0300d652e28ee166" FOREIGN KEY ("task_id") REFERENCES "tasks"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, + `ALTER TABLE "task_submissions" ADD CONSTRAINT "FK_d6cfaee118a0300d652e28ee166" FOREIGN KEY ("task_id") REFERENCES "tasks"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, ); await queryRunner.query( `ALTER TABLE "task_submissions" ADD CONSTRAINT "FK_87876dfe440de7aafce216e9f58" FOREIGN KEY ("proof_of_completion_id") REFERENCES "documents"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, diff --git a/src/db/migrations/index.ts b/src/db/migrations/index.ts index 08e1358..9eb83d9 100644 --- a/src/db/migrations/index.ts +++ b/src/db/migrations/index.ts @@ -8,4 +8,3 @@ export * from './1733731507261-create-junior-entity'; export * from './1733732021622-create-guardian-entity'; export * from './1733748083604-create-theme-entity'; export * from './1733750228289-seed-default-avatar'; -export * from './1733833824321-create-task-entities'; diff --git a/src/task/entities/task-submissions.entity.ts b/src/task/entities/task-submissions.entity.ts index ec99fef..84a01df 100644 --- a/src/task/entities/task-submissions.entity.ts +++ b/src/task/entities/task-submissions.entity.ts @@ -30,7 +30,7 @@ export class TaskSubmission extends BaseEntity { @Column({ type: 'uuid', name: 'proof_of_completion_id', nullable: true }) proofOfCompletionId!: string; - @OneToOne(() => Task, (task) => task.submission) + @OneToOne(() => Task, (task) => task.submission, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'task_id' }) task!: Task; diff --git a/src/task/entities/task.entity.ts b/src/task/entities/task.entity.ts index 6405fed..1c62d77 100644 --- a/src/task/entities/task.entity.ts +++ b/src/task/entities/task.entity.ts @@ -1,4 +1,5 @@ import { + BaseEntity, Column, CreateDateColumn, Entity, @@ -16,7 +17,7 @@ import { TaskFrequency } from '../enums/task.frequency.enum'; import { TaskSubmission } from './task-submissions.entity'; @Entity('tasks') -export class Task { +export class Task extends BaseEntity { @PrimaryGeneratedColumn('uuid') id!: string; @@ -62,7 +63,7 @@ export class Task { @JoinColumn({ name: 'assigned_by_id' }) assignedBy!: Guardian; - @OneToOne(() => TaskSubmission, (submission) => submission.task, { onDelete: 'CASCADE' }) + @OneToOne(() => TaskSubmission, (submission) => submission.task, { cascade: true }) submission?: TaskSubmission; @CreateDateColumn({ type: 'timestamp', name: 'created_at', default: () => 'CURRENT_TIMESTAMP' }) diff --git a/src/task/repositories/task.repository.ts b/src/task/repositories/task.repository.ts index f7318cc..eb6d36b 100644 --- a/src/task/repositories/task.repository.ts +++ b/src/task/repositories/task.repository.ts @@ -81,14 +81,13 @@ export class TaskRepository { } createSubmission(task: Task, body: TaskSubmissionRequestDto) { - task.submission = TaskSubmission.create({ - status: task.isProofRequired ? SubmissionStatus.PENDING : SubmissionStatus.APPROVED, - submittedAt: new Date(), - taskId: task.id, - proofOfCompletionId: body.imageId, - }); + const submission = task.submission || new TaskSubmission(); + submission.status = SubmissionStatus.PENDING; + submission.submittedAt = new Date(); + submission.taskId = task.id; + submission.proofOfCompletionId = body.imageId; - return task.submission.save(); + return task.save(); } approveSubmission(submission: TaskSubmission) { diff --git a/src/task/services/task.service.ts b/src/task/services/task.service.ts index b1dc825..b9f8050 100644 --- a/src/task/services/task.service.ts +++ b/src/task/services/task.service.ts @@ -34,10 +34,6 @@ export class TaskService { throw new BadRequestException('TASK.ALREADY_COMPLETED'); } - if (task.submission && task.submission.status !== SubmissionStatus.REJECTED) { - throw new BadRequestException('TASK.ALREADY_SUBMITTED'); - } - if (task.isProofRequired && !body.imageId) { throw new BadRequestException('TASK.PROOF_REQUIRED'); }