penisularhr / src / modules / activity-record / activity-group.controller.ts
activity-group.controller.ts
Raw
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' };
  }
}