penisularhr / src / modules / activity-record / activity-record-setting.controller.ts
activity-record-setting.controller.ts
Raw
import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  Patch,
  Post,
  Query,
} from '@nestjs/common';
import { ApiOkResponse, ApiTags } from '@nestjs/swagger';

import { type PageDto } from '../../common/dto/page.dto';
import { RoleType } from '../../constants';
import {
  ApiPageOkResponse,
  Auth,
  AuthUser,
  UUIDParam,
  Whitelist,
} from '../../decorators';
import { ActivityRecordSettingNotFoundException } from '../../exceptions';
import { UserEntity } from '../user/user.entity';
import { ActivityRecordSettingService } from './activity-record-setting.service';
import { ActivityRecordSettingDto } from './dtos/activity-record-setting.dto';
import { CreateActivityRecordSettingDto } from './dtos/create-activity-record-setting.dto';
import { ActivityRecordSettingPageOptionsDto } from './dtos/get-activity-record-setting-page.dto';
import { UpdateActivityRecordSettingDto } from './dtos/update-activity-record-setting.dto';

@Controller('activity-record-settings')
@ApiTags('activity-record-settings')
export class ActivityRecordSettingController {
  constructor(
    private activityRecordSettingService: ActivityRecordSettingService,
  ) {}

  @Get()
  @Whitelist()
  @Auth([RoleType.ADMIN, RoleType.USER])
  @HttpCode(HttpStatus.OK)
  @ApiPageOkResponse({
    type: ActivityRecordSettingDto,
    description: 'Get activity record settings',
  })
  async getActivityRecordSettings(
    @Query() query: ActivityRecordSettingPageOptionsDto,
  ): Promise<PageDto<ActivityRecordSettingDto>> {
    return this.activityRecordSettingService.findMany(query);
  }

  @Post()
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async createActivityRecordSetting(
    @AuthUser() user: UserEntity,
    @Body() body: CreateActivityRecordSettingDto,
  ): Promise<ActivityRecordSettingDto> {
    const activityRecordSettingEntity =
      await this.activityRecordSettingService.createActivityRecordSetting(
        body,
        user,
      );

    return activityRecordSettingEntity.toDto();
  }

  @Patch(':id')
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async updateGame(
    @AuthUser() user: UserEntity,
    @Param('id') id: Uuid,
    @Body() body: UpdateActivityRecordSettingDto,
  ): Promise<ActivityRecordSettingDto> {
    const toPatchEntity = await this.activityRecordSettingService.findOne({
      id,
    });

    if (!toPatchEntity) {
      throw new ActivityRecordSettingNotFoundException();
    }

    const activityRecordSettingEntity =
      await this.activityRecordSettingService.updateActivitySetting(
        toPatchEntity,
        body,
        user,
      );

    return activityRecordSettingEntity.toDto();
  }

  @Delete(':id')
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async delete(@AuthUser() user: UserEntity, @UUIDParam('id') id: Uuid) {
    const toDeleteEntity = await this.activityRecordSettingService.findOne({
      id,
    });

    if (!toDeleteEntity) {
      throw new ActivityRecordSettingNotFoundException();
    }

    await this.activityRecordSettingService.delete(toDeleteEntity, user);

    return { status: 'success' };
  }
}