diff --git a/src/nilai/nilai.service.ts b/src/nilai/nilai.service.ts index 81ebba4d7151fc7b42f495d542af94057fd4f66e..973251cd9ba63a7be3a5aa0ef6a04903d8f77e54 100644 --- a/src/nilai/nilai.service.ts +++ b/src/nilai/nilai.service.ts @@ -41,7 +41,6 @@ export class NilaiService { search: string, ) { const currPeriode = await this.konfServ.getPeriodeOrFail(); - console.log(limit); const baseQuery = this.mataKuliahRepo .createQueryBuilder("matkul") diff --git a/src/submisi-tugas/submisi-tugas.dto.ts b/src/submisi-tugas/submisi-tugas.dto.ts index 96c638462944f622dcaaf16dee39078602ebf26d..86bbae65c8d1f21b2502e4679e16de8acf272ea9 100644 --- a/src/submisi-tugas/submisi-tugas.dto.ts +++ b/src/submisi-tugas/submisi-tugas.dto.ts @@ -34,7 +34,7 @@ export class CreateOrUpdateSubmisiTugasDto extends PickType(SubmisiTugas, [ @Type(() => BerkasSubmisiTugasWithoutId) berkasSubmisiTugas: BerkasSubmisiTugasWithoutId[]; - @ApiPropertyOptional() + @ApiPropertyOptional({ example: "550e8400-e29b-41d4-a716-446655440000" }) @IsOptional() @IsUUID() id?: string; @@ -85,7 +85,7 @@ class PickedSubmisiTugas extends PickType(SubmisiTugas, [ "berkasSubmisiTugas", ] as const) {} -class PickedSubmisiTugasExtended extends PickType(SubmisiTugas, [ +export class PickedSubmisiTugasExtended extends PickType(SubmisiTugas, [ "id", "isSubmitted", "jawaban", diff --git a/src/submisi-tugas/submisi-tugas.service.ts b/src/submisi-tugas/submisi-tugas.service.ts index e949c71aae4d0576038d62bbe840ace98266f6f0..59b4be284e535ec40456da9d3531badb009ea614 100644 --- a/src/submisi-tugas/submisi-tugas.service.ts +++ b/src/submisi-tugas/submisi-tugas.service.ts @@ -86,12 +86,23 @@ export class SubmisiTugasService { ): Promise<SubmisiTugasIdDto> { await this.tugasService.isMahasiswaTugasOrFail(mahasiswaId, dto.tugasId); - const tugas = await this.tugasRepo.findOne({ - where: { id: dto.tugasId, submisiTugas: { mahasiswaId } }, - relations: { - submisiTugas: true, - }, - }); + // const tugas = await this.tugasRepo.findOne({ + // where: { id: dto.tugasId, submisiTugas: { mahasiswaId } }, + // relations: { + // submisiTugas: true, + // }, + // }); + + const tugas = await this.tugasRepo + .createQueryBuilder("tugas") + .leftJoinAndSelect( + "tugas.submisiTugas", + "submisiTugas", + "submisiTugas.mahasiswaId = :mahasiswaId", + { mahasiswaId }, + ) + .where("tugas.id = :id", { id: dto.tugasId }) + .getOne(); const mahasiswa = await this.penggunaRepo.findOneBy({ id: mahasiswaId }); @@ -145,6 +156,7 @@ export class SubmisiTugasService { const data = { ...tugas.submisiTugas[0], + ...dto, berkasSubmisiTugas, mahasiswa, tugas: omittedTugas, diff --git a/src/tugas/tugas.controller.ts b/src/tugas/tugas.controller.ts index 70637ad4c7ce8f2b381c2b815609cd82c6c1aa8c..1e2b396d33bcdebaab6e7f7b79b292b9022f7224 100644 --- a/src/tugas/tugas.controller.ts +++ b/src/tugas/tugas.controller.ts @@ -30,9 +30,11 @@ import { GetTugasByKelasIdQueryDto, GetTugasByKelasIdRespDto, GetTugasByMahasiswaIdQueryDto, + GetDaftarTugasByMahasiswaIdRespDto, } from "./tugas.dto"; import { Request } from "express"; import { AuthDto } from "src/auth/auth.dto"; +import { PickedSubmisiTugasExtended } from "src/submisi-tugas/submisi-tugas.dto"; @ApiCookieAuth() @ApiBearerAuth() @@ -108,6 +110,7 @@ export class TugasController { summary: "Get a specific submisi tugas by mahasiswa ID and tugas ID. Roles: S2_MAHASISWA", }) + @ApiOkResponse({ type: PickedSubmisiTugasExtended }) @Roles(RoleEnum.S2_MAHASISWA) @Get("/:id/submisi-tugas") async getSubmisiTugasByMahasiswaAndTugasId( @@ -125,6 +128,7 @@ export class TugasController { @ApiOperation({ summary: "Get Tugas list by mahasiswa Id. Roles: S2_MAHASISWA", }) + @ApiOkResponse({ type: [GetDaftarTugasByMahasiswaIdRespDto] }) @Roles(RoleEnum.S2_MAHASISWA) @Get("/-/daftar-tugas") async getTugasByMahasiswaId( diff --git a/src/tugas/tugas.dto.ts b/src/tugas/tugas.dto.ts index f7f8eab5c0af6ec866eff1addea9113584714163..c91d2592fc2c201ea085e671e4d6a0575e0d34e9 100644 --- a/src/tugas/tugas.dto.ts +++ b/src/tugas/tugas.dto.ts @@ -133,3 +133,26 @@ export class GetTugasByKelasIdRespDto { @ApiProperty({ type: GetKelasRespDto }) kelas: GetKelasRespDto; } + +export class GetDaftarTugasByMahasiswaIdRespDto { + @ApiProperty({ example: "IF4031" }) + kodeMataKuliah: string; + + @ApiProperty({ example: "Pengembangan Aplikasi" }) + namaMataKuliah: string; + + @ApiProperty({ + example: "550e8400-e29b-41d4-a716-446655440000", + description: "tugas id", + }) + id: string; + + @ApiProperty() + judul: string; + + @ApiPropertyOptional({ example: "550e8400-e29b-41d4-a716-446655440000" }) + submisiTugasId: string; + + @ApiPropertyOptional() + isSubmitted: boolean; +} diff --git a/src/tugas/tugas.service.ts b/src/tugas/tugas.service.ts index 7a48b5323fd785cadbe7a93a8cab37a4cd02eca9..84b144eaeabc9384ac96268f656a732a7b74977c 100644 --- a/src/tugas/tugas.service.ts +++ b/src/tugas/tugas.service.ts @@ -9,6 +9,7 @@ import { Tugas } from "src/entities/tugas.entity"; import { Brackets, Repository } from "typeorm"; import { CreateTugasDto, + GetDaftarTugasByMahasiswaIdRespDto, GetTugasByIdRespDto, GetTugasByKelasIdRespDto, GetTugasSummaryRespDto, @@ -24,6 +25,7 @@ import { KelasService } from "src/kelas/kelas.service"; import { KonfigurasiService } from "src/konfigurasi/konfigurasi.service"; import * as dayjs from "dayjs"; import { SubmisiTugas } from "src/entities/submisiTugas.entity"; +import { PickedSubmisiTugasExtended } from "src/submisi-tugas/submisi-tugas.dto"; @Injectable() export class TugasService { @@ -278,10 +280,17 @@ export class TugasService { async getSubmisiTugasByMahasiswaAndTugasId( mahasiswaId: string, tugasId: string, - ): Promise<SubmisiTugas> { + ): Promise<PickedSubmisiTugasExtended> { await this.isMahasiswaTugasOrFail(mahasiswaId, tugasId); const submisiTugas = await this.submisiTugasRepo.findOne({ + select: [ + "id", + "isSubmitted", + "jawaban", + "submittedAt", + "berkasSubmisiTugas", + ], where: { mahasiswaId: mahasiswaId, tugasId: tugasId, @@ -304,7 +313,7 @@ export class TugasService { page: number, limit: number, isSubmitted?: boolean, - ) { + ): Promise<GetDaftarTugasByMahasiswaIdRespDto[]> { const baseQuery = this.mahasiswaKelasRepo .createQueryBuilder("mk") .innerJoin("mk.kelas", "kelas", "kelas.id = mk.kelasId") @@ -319,11 +328,12 @@ export class TugasService { .select([ "mk.id", "kelas.id", - "mataKuliah.kode", - "mataKuliah.nama", - "tugas.id", - "submisiTugas.id", - "submisiTugas.isSubmitted", + "mataKuliah.kode AS kode_mata_kuliah", + "mataKuliah.nama AS nama_mata_kuliah", + "tugas.id AS tugas_id", + "tugas.judul AS tugas_judul", + "submisiTugas.id AS submisi_tugas_id", + "submisiTugas.isSubmitted AS submisi_tugas_is_submitted", ]) .where("mk.mahasiswaId = :mahasiswaId", { mahasiswaId, @@ -348,8 +358,21 @@ export class TugasService { const daftarTugas = await baseQuery .limit(limit) .skip((page - 1) * limit) - .getMany(); + .getRawMany(); - return daftarTugas; + const mappedDaftarTugas: GetDaftarTugasByMahasiswaIdRespDto[] = + daftarTugas.map((tugas) => ({ + kodeMataKuliah: tugas.kode_mata_kuliah, + namaMataKuliah: tugas.nama_mata_kuliah, + id: tugas.tugas_id, + judul: tugas.tugas_judul, + submisiTugasId: tugas.submisi_tugas_id || undefined, + isSubmitted: + tugas.submisi_tugas_is_submitted === null + ? undefined + : tugas.submisi_tugas_is_submitted, + })); + + return mappedDaftarTugas; } }