import { Body, Controller, Delete, Get, HttpCode, HttpStatus, 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 { ActivityGroupNotFoundException } from '../../exceptions'; import { UserEntity } from '../user/user.entity'; import { ActivityGroupService } from './activity-group.service'; import { ActivityGroupDto } from './dtos/activity-group.dto'; import { CreateActivityGroupDto } from './dtos/create-activity-group.dto'; import { ActivityGroupPageOptionsDto } from './dtos/get-activity-group-page.dto'; import { UpdateActivityGroupDto } from './dtos/update-activity-group.dto'; @Controller('activity-group') @ApiTags('activity-group') export class ActivityGroupController { constructor(private activityGroupService: ActivityGroupService) {} @Get() @Whitelist() @Auth([RoleType.ADMIN, RoleType.USER]) @HttpCode(HttpStatus.OK) @ApiPageOkResponse({ type: ActivityGroupDto, description: 'Get activity group list', }) async getActivityGroup( @Query() query: ActivityGroupPageOptionsDto, ): Promise<PageDto<ActivityGroupDto>> { return this.activityGroupService.findMany(query); } @Post() @Whitelist() @Auth([RoleType.ADMIN]) @HttpCode(HttpStatus.OK) @ApiOkResponse() async createActivityGroup( @AuthUser() user: UserEntity, @Body() body: CreateActivityGroupDto, ): Promise<ActivityGroupDto> { const createdActivity = await this.activityGroupService.create(body, user); return createdActivity.toDto(); } @Patch(':id') @Whitelist() @Auth([RoleType.ADMIN]) @HttpCode(HttpStatus.OK) @ApiOkResponse() async updateActivityGroup( @AuthUser() user: UserEntity, @UUIDParam('id') id: Uuid, @Body() body: UpdateActivityGroupDto, ): Promise<ActivityGroupDto> { const toPatchEntity = await this.activityGroupService.findOne({ id, }); if (!toPatchEntity) { throw new ActivityGroupNotFoundException(); } const patchedEntity = await this.activityGroupService.update( toPatchEntity, body, user, ); return patchedEntity.toDto(); } @Delete(':id') @Whitelist() @Auth([RoleType.ADMIN]) @HttpCode(HttpStatus.OK) @ApiOkResponse() async delete(@AuthUser() user: UserEntity, @UUIDParam('id') id: Uuid) { const toDeleteEntity = await this.activityGroupService.findOne({ id, }); if (!toDeleteEntity) { throw new ActivityGroupNotFoundException(); } await this.activityGroupService.delete(toDeleteEntity, user); return { status: 'success' }; } }