diff --git a/src/Resume/resume.schema.ts b/src/Resume/resume.schema.ts index 6448a10..3a75e10 100644 --- a/src/Resume/resume.schema.ts +++ b/src/Resume/resume.schema.ts @@ -8,7 +8,7 @@ import { import { Builder } from '../Graphql/graphql.builder' import { PrismaService } from '../Prisma/prisma.service' import { MinioService } from '../Minio/minio.service' -import { ResumeStatus } from '@prisma/client' +import { ResumeStatus, Role } from '@prisma/client' @Injectable() export class ResumeSchema extends PothosSchema { constructor( @@ -54,6 +54,9 @@ export class ResumeSchema extends PothosSchema { resumeFile: t.relation('resumeFile', { description: 'The resume file for the resume.', }), + user: t.relation('user', { + description: 'The user for the resume.', + }), }), }) } @@ -250,9 +253,9 @@ export class ResumeSchema extends PothosSchema { }, }), - updateResumeStatus: t.prismaField({ + approveOrRejectResume: t.prismaField({ type: this.resume(), - description: 'Update the status of a resume.', + description: 'Approve or reject a resume.', args: { resumeId: t.arg({ type: 'String', @@ -262,34 +265,74 @@ export class ResumeSchema extends PothosSchema { type: ResumeStatus, required: true, }), - }, - resolve: async (query, root, args) => { - const { resumeId, status } = args - const resume = await this.prisma.resume.update({ - ...query, - where: { id: resumeId }, - data: { status }, - }) - return resume - }, - }), - - deleteResumeFile: t.prismaField({ - type: this.resumeFile(), - description: 'Delete a resume file by its unique identifier.', - args: { - resumeFileId: t.arg({ + adminNote: t.arg({ type: 'String', required: true, }), }, - resolve: async (query, root, args) => { - const { resumeFileId } = args - const resumeFile = await this.prisma.resumeFile.delete({ - ...query, - where: { id: resumeFileId }, + resolve: async (_query, _root, args, ctx, _info) => { + if (ctx.isSubscription) { + throw new Error('Not allowed') + } + if (ctx.http.me.role !== Role.MODERATOR) { + throw new Error('Not allowed') + } + const { resumeId, status, adminNote } = args + return this.prisma.$transaction(async (tx) => { + const resumeOwner = await tx.user.findUnique({ + where: { id: resumeId }, + }) + if (!resumeOwner) { + throw new Error('Resume not found') + } + const oldResume = await tx.resume.findUnique({ + where: { id: resumeId }, + }) + if (!oldResume) { + throw new Error('Resume not found') + } + // if resumeOwner.status is REQUESTED and status is REVIEWING then we need update status and return resume + if ( + oldResume.status === ResumeStatus.REQUESTED && + status === ResumeStatus.REVIEWING + ) { + const resume = await tx.resume.update({ + where: { id: resumeId }, + data: { status }, + }) + return resume + } + + let _adminNote + if ( + status === ResumeStatus.APPROVED || + status === ResumeStatus.REJECTED + ) { + if (status === ResumeStatus.REJECTED && adminNote === '') { + throw new Error('Admin note is required when rejecting') + } + _adminNote = await tx.adminNote.create({ + data: { + content: adminNote, + notedByUserId: ctx.http.me.id, + resumeId, + }, + }) + } + if (_adminNote) { + _adminNote = { + connect: { id: _adminNote.id }, + } + } + const resume = await tx.resume.update({ + where: { id: resumeId }, + data: { + status, + adminNote: _adminNote, + }, + }) + return resume }) - return resumeFile }, }), }))