diff --git a/src/entities/pengguna.entity.ts b/src/entities/pengguna.entity.ts index c6011ee1dc0ec6adb74010bc2a21bae668198d23..4018370c6e6f5550a3d8126b08ad179c9a78f0c4 100644 --- a/src/entities/pengguna.entity.ts +++ b/src/entities/pengguna.entity.ts @@ -26,7 +26,7 @@ export class Pengguna { id: string; @ApiProperty() - @Column() + @Column({ type: "text", nullable: true }) nama: string; @ApiProperty({ example: "13521999@mahasiswa.itb.ac.id" }) diff --git a/src/registrasi-sidsem/registrasi-sidsem.controller.ts b/src/registrasi-sidsem/registrasi-sidsem.controller.ts index 15d95f95dc3c098631494a56e1d809598920df52..e66b83522cabfb3d370827bf65798e1ca5fd0fd1 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.controller.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.controller.ts @@ -128,8 +128,13 @@ export class RegistrasiSidsemController { async updateStatus( @Param() param: SidsemMhsIdParamDto, @Body() updateDto: UpdateSidsemStatusDto, + @Req() req: Request, ) { - return this.regisSidsemService.updateStatus(param.mhsId, updateDto.status); + return this.regisSidsemService.updateStatus( + param.mhsId, + updateDto.status, + req, + ); } @ApiOperation({ @@ -142,7 +147,8 @@ export class RegistrasiSidsemController { async updateDetail( @Param() param: SidsemMhsIdParamDto, @Body() updateDto: UpdateSidsemDetailDto, + @Req() req: Request, ) { - return this.regisSidsemService.updateDetail(param.mhsId, updateDto); + return this.regisSidsemService.updateDetail(param.mhsId, updateDto, req); } } diff --git a/src/registrasi-sidsem/registrasi-sidsem.module.ts b/src/registrasi-sidsem/registrasi-sidsem.module.ts index 2c719e4bb91688835ae74a0deddff814efc15d31..db10743fedc136a73bebabfa779804b49133f606 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.module.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.module.ts @@ -17,6 +17,7 @@ import { PengujiSidsem } from "src/entities/pengujiSidsem.entity"; import { KonfigurasiModule } from "src/konfigurasi/konfigurasi.module"; import { KonfigurasiService } from "src/konfigurasi/konfigurasi.service"; import { Konfigurasi } from "src/entities/konfigurasi.entity"; +import { HttpModule } from "@nestjs/axios"; @Module({ imports: [ @@ -34,6 +35,7 @@ import { Konfigurasi } from "src/entities/konfigurasi.entity"; RegistrasiTesisModule, PenggunaModule, KonfigurasiModule, + HttpModule, ], controllers: [RegistrasiSidsemController], providers: [ diff --git a/src/registrasi-sidsem/registrasi-sidsem.service.ts b/src/registrasi-sidsem/registrasi-sidsem.service.ts index e900ba12a5115d0f3620dc763699b32309a69479..1f1b73a3907008766d8dfb9f34917b29283242e0 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.service.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.service.ts @@ -30,6 +30,9 @@ import { Pengguna, RoleEnum } from "src/entities/pengguna.entity"; import { KonfigurasiService } from "src/konfigurasi/konfigurasi.service"; import { KonfigurasiKeyEnum } from "src/entities/konfigurasi.entity"; import * as dayjs from "dayjs"; +import { HttpService } from "@nestjs/axios"; +import { Request } from "express"; +import { firstValueFrom } from "rxjs"; @Injectable() export class RegistrasiSidsemService { @@ -45,6 +48,7 @@ export class RegistrasiSidsemService { private regTesisService: RegistrasiTesisService, private dataSource: DataSource, private konfService: KonfigurasiService, + private httpService: HttpService, ) {} private async getLatestPendaftaranSidsem(mhsId: string) { @@ -346,6 +350,7 @@ export class RegistrasiSidsemService { async updateStatus( mhsId: string, status: SidsemStatus.REJECTED | SidsemStatus.APPROVED, + req: Request, ): Promise<PengajuanSidsemIdDto> { const latest = await this.getLatestPendaftaranSidsem(mhsId); @@ -355,9 +360,46 @@ export class RegistrasiSidsemService { ); } - await this.pendaftaranSidsemRepo.update(latest.id, { - status, - }); + let token = ""; + if (req?.cookies?.[process.env.COOKIE_NAME]) { + token = req.cookies[process.env.COOKIE_NAME]; + } + if (req.headers?.authorization) { + token = req.headers.authorization.slice(7); + } + + const { data: notif } = await firstValueFrom( + this.httpService.post( + `${process.env.AUTH_SERVICE_URL}/notifikasi`, + { + title: `Pendaftaran ${latest.tipe.split("_").join(" ").toLowerCase()} Anda ${status === SidsemStatus.APPROVED ? "diterima" : "ditolak"}`, + description: `Pendaftaran tesis Anda ${status === SidsemStatus.APPROVED ? "diterima" : "ditolak"}. Silahkan periksa kembali data Anda untuk mengetahui lebih lanjut.`, + penggunaId: mhsId, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + + try { + await this.pendaftaranSidsemRepo.update(latest.id, { + status, + }); + } catch { + await firstValueFrom( + this.httpService.delete( + `${process.env.AUTH_SERVICE_URL}/notifikasi/${notif.id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + } return { id: latest.id } as PengajuanSidsemIdDto; } @@ -365,6 +407,7 @@ export class RegistrasiSidsemService { async updateDetail( mhsId: string, updateDto: UpdateSidsemDetailDto, + req: Request, ): Promise<PengajuanSidsemIdDto> { const latest = await this.getLatestPendaftaranSidsem(mhsId); @@ -416,6 +459,30 @@ export class RegistrasiSidsemService { await queryRunner.connect(); await queryRunner.startTransaction(); + let token = ""; + if (req?.cookies?.[process.env.COOKIE_NAME]) { + token = req.cookies[process.env.COOKIE_NAME]; + } + if (req.headers?.authorization) { + token = req.headers.authorization.slice(7); + } + + const { data: notif } = await firstValueFrom( + this.httpService.post( + `${process.env.AUTH_SERVICE_URL}/notifikasi`, + { + title: `Detail pendaftaran ${latest.tipe.split("_").join(" ").toLowerCase()} Anda diubah`, + description: `Detail pendaftaran ${latest.tipe.split("_").join(" ").toLowerCase()} Anda diubah. Silahkan periksa kembali data Anda untuk mengetahui lebih lanjut.`, + penggunaId: mhsId, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + try { await queryRunner.manager.insert( PengujiSidsem, @@ -436,7 +503,16 @@ export class RegistrasiSidsemService { } catch (err) { await queryRunner.rollbackTransaction(); - console.error(err); + await firstValueFrom( + this.httpService.delete( + `${process.env.AUTH_SERVICE_URL}/notifikasi/${notif.id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); throw new InternalServerErrorException(); } finally { diff --git a/src/registrasi-tesis/registrasi-tesis.controller.ts b/src/registrasi-tesis/registrasi-tesis.controller.ts index 0ac28aece930cb6f6c9ea7ec037540d9ec3d5f1e..d7585fc17933028c4352b0d2f132a807b883a1a3 100644 --- a/src/registrasi-tesis/registrasi-tesis.controller.ts +++ b/src/registrasi-tesis/registrasi-tesis.controller.ts @@ -211,6 +211,7 @@ export class RegistrasiTesisController { return await this.registrasiTesisService.updateInterviewDate( params.mhsId, body, + req, idPenerima, ); } @@ -242,6 +243,7 @@ export class RegistrasiTesisController { return await this.registrasiTesisService.updateStatus( params.mhsId, body, + req, idPenerima, ); } @@ -257,10 +259,12 @@ export class RegistrasiTesisController { async updatePembimbingListByMhsId( @Param() params: UpdateByMhsParamsDto, @Body() body: UpdatePembimbingBodyDto, + @Req() req: Request, ) { return await this.registrasiTesisService.updatePembimbingList( params.mhsId, body, + req, ); } } diff --git a/src/registrasi-tesis/registrasi-tesis.module.ts b/src/registrasi-tesis/registrasi-tesis.module.ts index c3bbd21aa0fd1935e94879632141698224e27ac3..7c4c8a408b9f2d910ecb11cd35ec1182885bb787 100644 --- a/src/registrasi-tesis/registrasi-tesis.module.ts +++ b/src/registrasi-tesis/registrasi-tesis.module.ts @@ -10,6 +10,7 @@ import { CustomStrategy } from "src/middlewares/custom.strategy"; import { AuthModule } from "src/auth/auth.module"; import { PenggunaModule } from "src/pengguna/pengguna.module"; import { PenggunaService } from "src/pengguna/pengguna.service"; +import { HttpModule } from "@nestjs/axios"; @Module({ imports: [ @@ -21,6 +22,7 @@ import { PenggunaService } from "src/pengguna/pengguna.service"; ]), AuthModule, PenggunaModule, + HttpModule, ], controllers: [RegistrasiTesisController], providers: [RegistrasiTesisService, CustomStrategy, PenggunaService], diff --git a/src/registrasi-tesis/registrasi-tesis.service.ts b/src/registrasi-tesis/registrasi-tesis.service.ts index 4efe8d5d5be8bc2b1bb94cab81c1da1381d473aa..18135e28d03c83d6c97926c377218a43dce95180 100644 --- a/src/registrasi-tesis/registrasi-tesis.service.ts +++ b/src/registrasi-tesis/registrasi-tesis.service.ts @@ -26,6 +26,9 @@ import { UpdateStatusBodyDto, } from "./registrasi-tesis.dto"; import { PenggunaService } from "src/pengguna/pengguna.service"; +import { HttpService } from "@nestjs/axios"; +import { Request } from "express"; +import { firstValueFrom } from "rxjs"; @Injectable() export class RegistrasiTesisService { @@ -40,6 +43,7 @@ export class RegistrasiTesisService { private dosenBimbinganRepository: Repository<DosenBimbingan>, private dataSource: DataSource, private penggunaService: PenggunaService, + private httpService: HttpService, ) {} async createTopicRegistration( @@ -429,6 +433,7 @@ export class RegistrasiTesisService { async updateInterviewDate( mahasiswaId: string, dto: UpdateInterviewBodyDto, + req: Request, idPenerima?: string, ) { await this.penggunaService.isMahasiswaAktifOrFail(mahasiswaId); @@ -462,17 +467,56 @@ export class RegistrasiTesisService { const newDate = new Date(dto.date); - await this.pendaftaranTesisRepository.update( - { id: newestReg.id }, - { jadwalInterview: newDate, status: RegStatus.INTERVIEW }, + let token = ""; + if (req?.cookies?.[process.env.COOKIE_NAME]) { + token = req.cookies[process.env.COOKIE_NAME]; + } + if (req.headers?.authorization) { + token = req.headers.authorization.slice(7); + } + + const { data: notif } = await firstValueFrom( + this.httpService.post( + `${process.env.AUTH_SERVICE_URL}/notifikasi`, + { + title: "Jadwal interview pendaftaran Anda telah diubah", + description: + "Jadwal interview pendaftaran tesis Anda telah diubah. Silahkan periksa kembali data Anda untuk mengetahui lebih lanjut.", + penggunaId: mahasiswaId, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), ); + try { + await this.pendaftaranTesisRepository.update( + { id: newestReg.id }, + { jadwalInterview: newDate, status: RegStatus.INTERVIEW }, + ); + } catch { + await firstValueFrom( + this.httpService.delete( + `${process.env.AUTH_SERVICE_URL}/notifikasi/${notif.id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + } + return { id: newestReg.id } as IdDto; } async updateStatus( mahasiswaId: string, dto: UpdateStatusBodyDto, + req: Request, idPenerima?: string, ) { await this.penggunaService.isMahasiswaAktifOrFail(mahasiswaId); @@ -487,6 +531,30 @@ export class RegistrasiTesisService { await queryRunner.connect(); await queryRunner.startTransaction(); + let token = ""; + if (req?.cookies?.[process.env.COOKIE_NAME]) { + token = req.cookies[process.env.COOKIE_NAME]; + } + if (req.headers?.authorization) { + token = req.headers.authorization.slice(7); + } + + const { data: notif } = await firstValueFrom( + this.httpService.post( + `${process.env.AUTH_SERVICE_URL}/notifikasi`, + { + title: `Pendaftaran tesis Anda ${dto.status === RegStatus.APPROVED ? "diterima" : "ditolak"}`, + description: `Pendaftaran tesis Anda ${dto.status === RegStatus.APPROVED ? "diterima" : "ditolak"}. Silahkan periksa kembali data Anda untuk mengetahui lebih lanjut.`, + penggunaId: mahasiswaId, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + try { await queryRunner.manager.update( PendaftaranTesis, @@ -510,6 +578,17 @@ export class RegistrasiTesisService { } catch (err) { await queryRunner.rollbackTransaction(); + await firstValueFrom( + this.httpService.delete( + `${process.env.AUTH_SERVICE_URL}/notifikasi/${notif.id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + throw new InternalServerErrorException(); } finally { await queryRunner.release(); @@ -521,6 +600,7 @@ export class RegistrasiTesisService { async updatePembimbingList( mahasiswaId: string, { pembimbing_ids: dosen_ids }: UpdatePembimbingBodyDto, + req: Request, ) { await this.penggunaService.isMahasiswaAktifOrFail(mahasiswaId); @@ -564,6 +644,31 @@ export class RegistrasiTesisService { await queryRunner.connect(); await queryRunner.startTransaction(); + let token = ""; + if (req?.cookies?.[process.env.COOKIE_NAME]) { + token = req.cookies[process.env.COOKIE_NAME]; + } + if (req.headers?.authorization) { + token = req.headers.authorization.slice(7); + } + + const { data: notif } = await firstValueFrom( + this.httpService.post( + `${process.env.AUTH_SERVICE_URL}/notifikasi`, + { + title: "Dosen pembimbing Anda telah diubah", + description: + "Dosen pembimbing Anda telah diubah. Silahkan periksa kembali data Anda untuk mengetahui lebih lanjut.", + penggunaId: mahasiswaId, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + try { await queryRunner.manager.insert( DosenBimbingan, @@ -577,6 +682,17 @@ export class RegistrasiTesisService { } catch (err) { await queryRunner.rollbackTransaction(); + await firstValueFrom( + this.httpService.delete( + `${process.env.AUTH_SERVICE_URL}/notifikasi/${notif.id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + ), + ); + throw new InternalServerErrorException(); } finally { await queryRunner.release();