diff --git a/src/helper/roles.ts b/src/helper/roles.ts index 690f29dd520df4c348a4520cfc75aee48540dca5..ebd5385ec59c130f5baf20939e9d5162ba647136 100644 --- a/src/helper/roles.ts +++ b/src/helper/roles.ts @@ -1,7 +1,12 @@ import { RoleEnum } from "src/entities/pengguna.entity"; export const HIGH_AUTHORITY_ROLES = [RoleEnum.ADMIN, RoleEnum.S2_TIM_TESIS]; +export const DOSEN = [RoleEnum.S2_PEMBIMBING, RoleEnum.S2_PENGUJI]; export function isHighAuthority(roles: RoleEnum[]) { return roles.some((role) => HIGH_AUTHORITY_ROLES.includes(role)); } + +export function isDosen(roles: RoleEnum[]) { + return roles.some((role) => DOSEN.includes(role)); +} diff --git a/src/registrasi-sidsem/registrasi-sidsem.controller.ts b/src/registrasi-sidsem/registrasi-sidsem.controller.ts index 2891d5a5e5d92bb43835500a05789ef98e0b0ac2..3cc510a800f8d1434f56374cf78aee03bbee5d07 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.controller.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, + ForbiddenException, Get, Param, Patch, @@ -32,7 +33,12 @@ import { RegistrasiSidsemService } from "./registrasi-sidsem.service"; import { Request } from "express"; import { AuthDto } from "src/auth/auth.dto"; import { RoleEnum } from "src/entities/pengguna.entity"; -import { HIGH_AUTHORITY_ROLES } from "src/helper/roles"; +import { + DOSEN, + HIGH_AUTHORITY_ROLES, + isDosen, + isHighAuthority, +} from "src/helper/roles"; @ApiTags("Registrasi Sidang Seminar") @ApiBearerAuth() @@ -51,19 +57,53 @@ export class RegistrasiSidsemController { } @ApiOkResponse({ type: GetAllPengajuanSidangRespDto }) + @Roles(...HIGH_AUTHORITY_ROLES, ...DOSEN) @Get() - async findAll(@Query() query: GetAllPengajuanSidangReqQueryDto) { - return this.regisSidsemService.findAll(query); + async findAll( + @Req() req: Request, + @Query() query: GetAllPengajuanSidangReqQueryDto, + ) { + const { id, roles } = req.user as AuthDto; + + if (!roles.includes(query.view)) { + throw new ForbiddenException(); + } + + return this.regisSidsemService.findAll( + query, + query.view === RoleEnum.S2_PEMBIMBING ? id : undefined, + query.view === RoleEnum.S2_PENGUJI ? id : undefined, + ); } - @ApiOperation({ - summary: "Update status sidang seminar. Roles: ADMIN, S2_TIM_TESIS", - }) @ApiOkResponse({ type: PengajuanSidsemIdDto }) - // @Roles(...HIGH_AUTHORITY_ROLES) + @Roles(...HIGH_AUTHORITY_ROLES, ...DOSEN, RoleEnum.S2_MAHASISWA) @Get("/mahasiswa/:mhsId") - async findOne(@Param() param: SidsemMhsIdParamDto) { - return this.regisSidsemService.findOne(param.mhsId); + async findOne(@Req() req: Request, @Param() param: SidsemMhsIdParamDto) { + let idPenguji = undefined; + let idPembimbing = undefined; + + const { roles, id } = req.user as AuthDto; + + if (!isHighAuthority(roles)) { + if (roles.includes(RoleEnum.S2_PEMBIMBING)) { + idPembimbing = id; + } + + if (roles.includes(RoleEnum.S2_PENGUJI)) { + idPenguji = id; + } + + if (!isDosen(roles) && id !== param.mhsId) { + // user is mahasiswa + throw new ForbiddenException("Ini bukan data Anda."); + } + } + return this.regisSidsemService.findOne( + param.mhsId, + idPembimbing, + idPenguji, + ); } @ApiOperation({ diff --git a/src/registrasi-sidsem/registrasi-sidsem.dto.ts b/src/registrasi-sidsem/registrasi-sidsem.dto.ts index 6c8cbc8e9855c5c283db2af2b09bde080da84c37..46b28569e4da5770cfd5449a1b4561a6c46e3b50 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.dto.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.dto.ts @@ -22,8 +22,31 @@ import { TipeSidsemEnum, } from "src/entities/pendaftaranSidsem"; import { JalurEnum } from "src/entities/pendaftaranTesis.entity"; +import { RoleEnum } from "src/entities/pengguna.entity"; + +export class SidsemViewQueryDto { + @IsEnum([ + RoleEnum.S2_PEMBIMBING, + RoleEnum.ADMIN, + RoleEnum.S2_TIM_TESIS, + RoleEnum.S2_PENGUJI, + ]) + @ApiProperty({ + enum: [ + RoleEnum.S2_PEMBIMBING, + RoleEnum.ADMIN, + RoleEnum.S2_TIM_TESIS, + RoleEnum.S2_PENGUJI, + ], + }) + view: + | RoleEnum.S2_PEMBIMBING + | RoleEnum.ADMIN + | RoleEnum.S2_TIM_TESIS + | RoleEnum.S2_PENGUJI; +} -export class GetAllPengajuanSidangReqQueryDto { +export class GetAllPengajuanSidangReqQueryDto extends SidsemViewQueryDto { @ApiPropertyOptional() @IsString() @IsOptional() @@ -100,8 +123,6 @@ export class GetOnePengajuanSidangRespDto extends GetAllPengajuanSidangItemDto { dosenPenguji: string[]; } -export class UpdateAlokasiRuanganRespDto extends GetAllPengajuanSidangItemDto {} - class BerkasSidsemWithoutId extends OmitType(BerkasSidsem, ["id"] as const) {} export class CreatePengajuanSidsemDto extends PickType(PendaftaranSidsem, [ diff --git a/src/registrasi-sidsem/registrasi-sidsem.service.ts b/src/registrasi-sidsem/registrasi-sidsem.service.ts index 7daa85328b03ef5a6f1285eab47943671749fd34..0c25202e31029b46f99720233f165c0677fda919 100644 --- a/src/registrasi-sidsem/registrasi-sidsem.service.ts +++ b/src/registrasi-sidsem/registrasi-sidsem.service.ts @@ -1,5 +1,6 @@ import { BadRequestException, + ForbiddenException, Injectable, InternalServerErrorException, NotFoundException, @@ -232,13 +233,43 @@ export class RegistrasiSidsemService { return { data, total }; } - async findOne(mhsId: string): Promise<GetOnePengajuanSidangRespDto> { + async findOne( + mhsId: string, + idPembimbing?: string, + idPenguji?: string, + ): Promise<GetOnePengajuanSidangRespDto> { const latest = await this.getLatestPendaftaranSidsem(mhsId); if (!latest) { throw new NotFoundException("Pendaftaran sidsem tidak ditemukan"); } + function isPembimbing() { + return latest.pendaftaranTesis.dosenBimbingan.some( + ({ dosen: { id } }) => id === idPembimbing, + ); + } + + function isPenguji() { + return latest.penguji.some(({ dosen: { id } }) => id === idPenguji); + } + + if (idPembimbing && idPenguji) { + if (!isPembimbing() && !isPenguji()) { + throw new ForbiddenException( + "Anda tidak terdaftar sebagai pembimbing atau penguji", + ); + } + } else if (idPembimbing) { + if (!isPembimbing()) { + throw new ForbiddenException("Anda tidak terdaftar sebagai pembimbing"); + } + } else if (idPenguji) { + if (!isPenguji()) { + throw new ForbiddenException("Anda tidak terdaftar sebagai penguji"); + } + } + const data: GetOnePengajuanSidangRespDto = { idPengajuanSidsem: latest.id, idMahasiswa: latest.pendaftaranTesis.mahasiswa.id,