import { Controller, Get, Post, Body, Patch, Param, Delete, ParseIntPipe, HttpCode, UseGuards, Req, Query, NotFoundException } from '@nestjs/common' import { ChallengeActionsService } from './challenge-actions.service' import { AuthenticatedRequest, JwtAuthGuard } from 'src/auth/jwt-auth.guard' import { ApiBearerAuth, ApiCreatedResponse, ApiForbiddenResponse, ApiNotFoundResponse, ApiOkResponse, ApiUnauthorizedResponse } from '@nestjs/swagger' import { ChallengeActionEntity } from './entities/challenge-action.entity' import { CreateChallengeActionDto } from './dto/create-challenge-action.dto' import { ApiOkResponsePaginated, paginateOutput } from 'src/common/utils/pagination.utils' import { QueryPaginationDto } from 'src/common/dto/pagination-query.dto' import { PaginateOutputDto } from 'src/common/dto/pagination-output.dto' import { UpdateChallengeActionDto } from './dto/update-challenge-action.dto' import { FilterChallengeActionsDto } from './dto/filter-challenge-action.dto' import { EndChallengeActionDto } from './dto/end-challenge-action.dto' @Controller('challenge-actions') export class ChallengeActionsController { constructor(private readonly challengeActionsService: ChallengeActionsService) {} @Post() @HttpCode(201) @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiCreatedResponse({ type: ChallengeActionEntity, description: "Objet créé avec succès" }) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) async create(@Req() request: AuthenticatedRequest, @Body() createChallengeActionDto: CreateChallengeActionDto): Promise { const challenge = await this.challengeActionsService.create(request.user, createChallengeActionDto) return new ChallengeActionEntity(challenge) } @Get() @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponsePaginated(ChallengeActionEntity) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) async findAll(@Query() queryPagination: QueryPaginationDto, @Query() filterChallengeActions: FilterChallengeActionsDto): Promise> { const [challengeActions, total] = await this.challengeActionsService.findAll(queryPagination, filterChallengeActions) return paginateOutput(challengeActions.map(challengeAction => new ChallengeActionEntity(challengeAction)), total, queryPagination) } @Get(':id') @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ type: ChallengeActionEntity }) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) @ApiNotFoundResponse({ description: "Objet non trouvé" }) async findOne(@Param('id', ParseIntPipe) id: number): Promise { const challenge = await this.challengeActionsService.findOne(id) if (!challenge) throw new NotFoundException(`Défi inexistant avec l'identifiant ${id}`) return new ChallengeActionEntity(challenge) } @Patch(':id') @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ type: ChallengeActionEntity }) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) @ApiNotFoundResponse({ description: "Objet non trouvé" }) async update(@Param('id', ParseIntPipe) id: number, @Body() updateChallengeActionDto: UpdateChallengeActionDto) { return await this.challengeActionsService.update(id, updateChallengeActionDto) } @Delete(':id') @HttpCode(204) @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ type: ChallengeActionEntity }) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) @ApiNotFoundResponse({ description: "Objet non trouvé" }) async remove(@Param('id', ParseIntPipe) id: number) { await this.challengeActionsService.remove(id) } @Post('/end-current') @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ type: ChallengeActionEntity }) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) @ApiNotFoundResponse({ description: "Objet non trouvé" }) async endCurrent(@Req() request: AuthenticatedRequest, @Body() { success }: EndChallengeActionDto): Promise { const challengeAction = await this.challengeActionsService.endCurrentChallenge(request.user, success) return new ChallengeActionEntity(challengeAction) } }