update approve or reject resume

This commit is contained in:
2024-10-31 16:24:39 +07:00
parent a09785ec71
commit 33190ecfa4

View File

@@ -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
},
}),
}))