diff --git a/src/app.module.ts b/src/app.module.ts index 3dda3d684407ec0e5e6c34fe780296e3547db427..9af4b689a1bb2bcf76a18cbf19058e815ebd6c58 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -29,6 +29,7 @@ import { BimbinganModule } from "./bimbingan/bimbingan.module"; import { Konfigurasi } from "./entities/konfigurasi.entity"; import { KonfigurasiModule } from "./konfigurasi/konfigurasi.module"; import { DosenBimbinganModule } from "./dosen-bimbingan/dosen-bimbingan.module"; +import { ApprovalModule } from "./approval/approval.module"; @Module({ imports: [ @@ -71,6 +72,7 @@ import { DosenBimbinganModule } from "./dosen-bimbingan/dosen-bimbingan.module"; BimbinganModule, KonfigurasiModule, DosenBimbinganModule, + ApprovalModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/approval/approval.controller.ts b/src/approval/approval.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..6aa201fe7f7469bee763b9eef19236dd9bdcb2d4 --- /dev/null +++ b/src/approval/approval.controller.ts @@ -0,0 +1,31 @@ +import { Controller, Patch, Param, UseGuards } from "@nestjs/common"; +import { ApprovalService } from "./approval.service"; +import { RegStatus } from "src/entities/pendaftaranTesis.entity"; +import { CustomAuthGuard } from "src/middlewares/custom-auth.guard"; +import { RolesGuard } from "src/middlewares/roles.guard"; +import { RoleEnum } from "src/entities/pengguna.entity"; +import { Roles } from "src/middlewares/roles.decorator"; + +@Controller("approval") +@UseGuards(CustomAuthGuard, RolesGuard) +export class ApprovalController { + constructor(private readonly approvalService: ApprovalService) {} + + @Roles(RoleEnum.S2_PEMBIMBING) + @Patch(":id/approve") + async approvePendaftaran(@Param("id") id: string) { + return this.approvalService.approvePendaftaran(id, RegStatus.APPROVED); + } + + @Roles(RoleEnum.S2_PEMBIMBING) + @Patch(":id/reject") + async declinePendaftaran(@Param("id") id: string) { + return this.approvalService.approvePendaftaran(id, RegStatus.REJECTED); + } + + @Roles(RoleEnum.S2_PEMBIMBING) + @Patch(":id/interview") + async interviewPendaftaran(@Param("id") id: string) { + return this.approvalService.approvePendaftaran(id, RegStatus.INTERVIEW); + } +} diff --git a/src/approval/approval.module.ts b/src/approval/approval.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..c28790252c59277b51e473a33ab7d8b38ae32065 --- /dev/null +++ b/src/approval/approval.module.ts @@ -0,0 +1,12 @@ +import { Module } from "@nestjs/common"; +import { TypeOrmModule } from "@nestjs/typeorm"; +import { PendaftaranTesis } from "src/entities/pendaftaranTesis.entity"; +import { ApprovalController } from "./approval.controller"; +import { ApprovalService } from "./approval.service"; + +@Module({ + imports: [TypeOrmModule.forFeature([PendaftaranTesis])], + controllers: [ApprovalController], + providers: [ApprovalService], +}) +export class ApprovalModule {} diff --git a/src/approval/approval.service.ts b/src/approval/approval.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..8163efeda7b43052e82b6a5441b5590f384f1b6a --- /dev/null +++ b/src/approval/approval.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { FindOneOptions, Repository } from "typeorm"; +import { + PendaftaranTesis, + RegStatus, +} from "src/entities/pendaftaranTesis.entity"; + +@Injectable() +export class ApprovalService { + constructor( + @InjectRepository(PendaftaranTesis) + private readonly pendaftaranRepository: Repository<PendaftaranTesis>, + ) {} + + async approvePendaftaran( + id: string, + status: RegStatus, + ): Promise<PendaftaranTesis> { + try { + const findOneOptions: FindOneOptions<PendaftaranTesis> = { + where: { id }, + }; + const pendaftaran = + await this.pendaftaranRepository.findOneOrFail(findOneOptions); + pendaftaran.status = status; + + return await this.pendaftaranRepository.save(pendaftaran); + } catch (error) { + throw new Error("Pendaftaran not found"); + } + } +}