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' }; } }