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