90 lines
4.6 KiB
TypeScript
90 lines
4.6 KiB
TypeScript
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<ChallengeActionEntity> {
|
|
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<PaginateOutputDto<ChallengeActionEntity>> {
|
|
const [challengeActions, total] = await this.challengeActionsService.findAll(queryPagination, filterChallengeActions)
|
|
return paginateOutput<ChallengeActionEntity>(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<ChallengeActionEntity> {
|
|
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<ChallengeActionEntity> {
|
|
const challengeAction = await this.challengeActionsService.endCurrentChallenge(request.user, success)
|
|
return new ChallengeActionEntity(challengeAction)
|
|
}
|
|
}
|