From 40250a244fa87adbf0c83ee3f8bb5c7c5137fb90 Mon Sep 17 00:00:00 2001 From: Chiquita Ahsanunnisa <16521248@mahasiswa.itb.ac.id> Date: Thu, 2 May 2024 11:45:08 +0700 Subject: [PATCH] refactor: konfigurasi --- src/app.module.ts | 4 +++ src/entities/konfigurasi.entity.ts | 27 ++++++++++++++ src/konfigurasi/konfigurasi.controller.ts | 37 +++++++++++++++++++ src/konfigurasi/konfigurasi.dto.ts | 19 ++++++++++ src/konfigurasi/konfigurasi.module.ts | 13 +++++++ src/konfigurasi/konfigurasi.service.ts | 44 +++++++++++++++++++++++ src/main.ts | 1 + 7 files changed, 145 insertions(+) create mode 100644 src/entities/konfigurasi.entity.ts create mode 100644 src/konfigurasi/konfigurasi.controller.ts create mode 100644 src/konfigurasi/konfigurasi.dto.ts create mode 100644 src/konfigurasi/konfigurasi.module.ts create mode 100644 src/konfigurasi/konfigurasi.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index bd865e2..3dd3d3e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -19,6 +19,8 @@ import { BerkasBimbingan } from "./entities/berkasBimbingan.entity"; import { PendaftaranSidsem } from "./entities/pendaftaranSidsem"; import { DosenBimbinganModule } from "./dosen-bimbingan/dosen-bimbingan.module"; import { PenggunaModule } from "./pengguna/pengguna.module"; +import { KonfigurasiModule } from "./konfigurasi/konfigurasi.module"; +import { Konfigurasi } from "./entities/konfigurasi.entity"; @Module({ imports: [ @@ -38,6 +40,7 @@ import { PenggunaModule } from "./pengguna/pengguna.module"; PendaftaranSidsem, Topik, DosenBimbingan, + Konfigurasi, PendaftaranTesis, PengujiSidsem, ], @@ -50,6 +53,7 @@ import { PenggunaModule } from "./pengguna/pengguna.module"; BimbinganModule, DosenBimbinganModule, PenggunaModule, + KonfigurasiModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/entities/konfigurasi.entity.ts b/src/entities/konfigurasi.entity.ts new file mode 100644 index 0000000..26ee3ce --- /dev/null +++ b/src/entities/konfigurasi.entity.ts @@ -0,0 +1,27 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsEnum, IsString } from "class-validator"; +import { Column, Entity, PrimaryColumn } from "typeorm"; + +export enum KonfigurasiKeyEnum { + AWAL_PENDAFTARAN = "AWAL_PENDAFTARAN", + AKHIR_PENDAFTARAN = "AKHIR_PENDAFTARAN", + AWAL_SEMPRO = "AWAL_SEMPRO", + AKHIR_SEMPRO = "AKHIR_SEMPRO", + AWAL_SEM_TESIS = "AWAL_SEM_TESIS", + AKHIR_SEM_TESIS = "AKHIR_SEM_TESIS", + AWAL_SIDANG = "AWAL_SIDANG", + AKHIR_SIDANG = "AKHIR_SIDANG", +} + +@Entity() +export class Konfigurasi { + @ApiProperty({ enum: KonfigurasiKeyEnum }) + @IsEnum(KonfigurasiKeyEnum) + @PrimaryColumn({ type: "enum", enum: KonfigurasiKeyEnum }) + key: KonfigurasiKeyEnum; + + @ApiProperty() + @IsString() + @Column({ type: "text" }) + value: string; +} diff --git a/src/konfigurasi/konfigurasi.controller.ts b/src/konfigurasi/konfigurasi.controller.ts new file mode 100644 index 0000000..caf6a97 --- /dev/null +++ b/src/konfigurasi/konfigurasi.controller.ts @@ -0,0 +1,37 @@ +import { Body, Controller, Get, Put, UseGuards } from "@nestjs/common"; +import { KonfigurasiService } from "./konfigurasi.service"; +import { KonfigurasiArrDto, UpdateKonfigurasiResDto } from "./konfigurasi.dto"; +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"; +import { + ApiBearerAuth, + ApiCookieAuth, + ApiOkResponse, + ApiTags, +} from "@nestjs/swagger"; + +@ApiTags("Konfigurasi") +@ApiCookieAuth() +@ApiBearerAuth() +@Controller("konfigurasi") +@UseGuards(CustomAuthGuard, RolesGuard) +@Roles(RoleEnum.ADMIN, RoleEnum.S2_TIM_TESIS) +export class KonfigurasiController { + constructor(private readonly konfigurasiService: KonfigurasiService) {} + + @ApiOkResponse({ type: UpdateKonfigurasiResDto }) + @Put() + async updateKonfigurasi( + @Body() data: KonfigurasiArrDto, + ): Promise<UpdateKonfigurasiResDto> { + return await this.konfigurasiService.updateKonfigurasi(data); + } + + @ApiOkResponse({ type: KonfigurasiArrDto }) + @Get() + async getKonfigurasi(): Promise<KonfigurasiArrDto> { + return this.konfigurasiService.getKonfigurasi(); + } +} diff --git a/src/konfigurasi/konfigurasi.dto.ts b/src/konfigurasi/konfigurasi.dto.ts new file mode 100644 index 0000000..1ebdd10 --- /dev/null +++ b/src/konfigurasi/konfigurasi.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { Type } from "class-transformer"; +import { ValidateNested } from "class-validator"; +import { + Konfigurasi, + KonfigurasiKeyEnum, +} from "src/entities/konfigurasi.entity"; + +export class KonfigurasiArrDto { + @ApiProperty({ type: [Konfigurasi] }) + @ValidateNested({ each: true }) + @Type(() => Konfigurasi) + data: Konfigurasi[]; +} + +export class UpdateKonfigurasiResDto { + @ApiProperty({ enum: KonfigurasiKeyEnum, isArray: true }) + keys: KonfigurasiKeyEnum[]; +} diff --git a/src/konfigurasi/konfigurasi.module.ts b/src/konfigurasi/konfigurasi.module.ts new file mode 100644 index 0000000..8a1fcc6 --- /dev/null +++ b/src/konfigurasi/konfigurasi.module.ts @@ -0,0 +1,13 @@ +import { Module } from "@nestjs/common"; +import { KonfigurasiController } from "./konfigurasi.controller"; +import { KonfigurasiService } from "./konfigurasi.service"; +import { TypeOrmModule } from "@nestjs/typeorm"; +import { Konfigurasi } from "src/entities/konfigurasi.entity"; + +@Module({ + imports: [TypeOrmModule.forFeature([Konfigurasi])], + controllers: [KonfigurasiController], + providers: [KonfigurasiService], + exports: [KonfigurasiService], +}) +export class KonfigurasiModule {} diff --git a/src/konfigurasi/konfigurasi.service.ts b/src/konfigurasi/konfigurasi.service.ts new file mode 100644 index 0000000..6702c21 --- /dev/null +++ b/src/konfigurasi/konfigurasi.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { + Konfigurasi, + KonfigurasiKeyEnum, +} from "src/entities/konfigurasi.entity"; +import { Repository } from "typeorm"; +import { KonfigurasiArrDto, UpdateKonfigurasiResDto } from "./konfigurasi.dto"; + +@Injectable() +export class KonfigurasiService { + constructor( + @InjectRepository(Konfigurasi) + private konfigurasiRepository: Repository<Konfigurasi>, + ) {} + + async updateKonfigurasi({ + data, + }: KonfigurasiArrDto): Promise<UpdateKonfigurasiResDto> { + await this.konfigurasiRepository.upsert(data, ["key"]); + const res = { + keys: data.map((d) => d.key), + }; + return res; + } + + async getKonfigurasi(): Promise<KonfigurasiArrDto> { + const data = await this.konfigurasiRepository.find(); + + return { data }; + } + + async getKonfigurasiByKey( + key: KonfigurasiKeyEnum, + ): Promise<string | undefined> { + const data = await this.konfigurasiRepository.findOne({ + where: { + key, + }, + }); + + return data?.value; + } +} diff --git a/src/main.ts b/src/main.ts index 2f6bfcc..8f39d1c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -25,6 +25,7 @@ async function bootstrap() { .addTag("Bimbingan") .addTag("Dashboard") .addTag("Dosen Bimbingan") + .addTag("Konfigurasi") .addTag("Registrasi Tesis") .addCookieAuth(process.env.COOKIE_NAME) .addBearerAuth() -- GitLab