diff --git a/server/src/challenge-actions/challenge-actions.controller.ts b/server/src/challenge-actions/challenge-actions.controller.ts index 6601880..e2e6028 100644 --- a/server/src/challenge-actions/challenge-actions.controller.ts +++ b/server/src/challenge-actions/challenge-actions.controller.ts @@ -8,6 +8,7 @@ import { ApiOkResponsePaginated, paginateOutput } from 'src/common/utils/paginat 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' @Controller('challenge-actions') export class ChallengeActionsController { @@ -32,8 +33,8 @@ export class ChallengeActionsController { @ApiOkResponsePaginated(ChallengeActionEntity) @ApiUnauthorizedResponse({ description: "Non authentifié⋅e" }) @ApiForbiddenResponse({ description: "Permission refusée" }) - async findAll(@Query() queryPagination?: QueryPaginationDto): Promise> { - const [challengeActions, total] = await this.challengeActionsService.findAll(queryPagination) + 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) } diff --git a/server/src/challenge-actions/challenge-actions.service.ts b/server/src/challenge-actions/challenge-actions.service.ts index d939e03..095f0ae 100644 --- a/server/src/challenge-actions/challenge-actions.service.ts +++ b/server/src/challenge-actions/challenge-actions.service.ts @@ -5,6 +5,7 @@ import { ChallengeAction, User } from '@prisma/client' import { PrismaService } from 'src/prisma/prisma.service' import { QueryPaginationDto } from 'src/common/dto/pagination-query.dto' import { paginate } from 'src/common/utils/pagination.utils' +import { FilterChallengeActionsDto } from './dto/filter-challenge-action.dto' @Injectable() export class ChallengeActionsService { @@ -18,10 +19,12 @@ export class ChallengeActionsService { }) } - async findAll(queryPagination?: QueryPaginationDto): Promise<[ChallengeAction[], number]> { + async findAll(queryPagination: QueryPaginationDto, filterChallengeActions: FilterChallengeActionsDto): Promise<[ChallengeAction[], number]> { + console.log(filterChallengeActions) return [ await this.prisma.challengeAction.findMany({ ...paginate(queryPagination), + where: filterChallengeActions, include: { challenge: true, }, diff --git a/server/src/challenge-actions/dto/create-challenge-action.dto.ts b/server/src/challenge-actions/dto/create-challenge-action.dto.ts index 13c6371..35a4b43 100644 --- a/server/src/challenge-actions/dto/create-challenge-action.dto.ts +++ b/server/src/challenge-actions/dto/create-challenge-action.dto.ts @@ -1,6 +1,7 @@ import { ApiProperty } from "@nestjs/swagger" import { Type } from "class-transformer" import { IsBoolean, IsInt, IsOptional } from "class-validator" +import { BooleanTransform } from "src/common/utils/transform.utils" export class CreateChallengeActionDto { @IsInt() @@ -10,13 +11,13 @@ export class CreateChallengeActionDto { @IsOptional() @IsBoolean() - @Type(() => Boolean) + @BooleanTransform() @ApiProperty({ description: "Est-ce que le défi est actuellement en train d'être réalisé", default: true }) active: boolean = true @IsOptional() @IsBoolean() - @Type(() => Boolean) + @BooleanTransform() @ApiProperty({ description: "Est-ce que le défi a été réussi", default: false }) success: boolean = false } diff --git a/server/src/challenge-actions/dto/filter-challenge-action.dto.ts b/server/src/challenge-actions/dto/filter-challenge-action.dto.ts new file mode 100644 index 0000000..7a25b9a --- /dev/null +++ b/server/src/challenge-actions/dto/filter-challenge-action.dto.ts @@ -0,0 +1,24 @@ +import { ApiProperty } from "@nestjs/swagger" +import { Type } from "class-transformer" +import { IsBoolean, IsInt, IsOptional } from "class-validator" +import { BooleanTransform } from "src/common/utils/transform.utils" + +export class FilterChallengeActionsDto { + @IsOptional() + @IsInt() + @Type(() => Number) + @ApiProperty({ description: "Identifiant de l'utilisateur⋅rice qui effectue le défi" }) + userId?: number + + @IsOptional() + @IsBoolean() + @BooleanTransform() + @ApiProperty({ description: "Défi en train d'être accompli" }) + active?: boolean + + @IsOptional() + @IsBoolean() + @BooleanTransform() + @ApiProperty({ description: "Défi réussi" }) + success?: boolean +} \ No newline at end of file diff --git a/server/src/common/utils/transform.utils.ts b/server/src/common/utils/transform.utils.ts new file mode 100644 index 0000000..b10e965 --- /dev/null +++ b/server/src/common/utils/transform.utils.ts @@ -0,0 +1,9 @@ +import { Transform, TransformOptions } from "class-transformer" + +export function BooleanTransform (options?: TransformOptions): PropertyDecorator { + return Transform(({ value }) => { + if (value.toString().toLowerCase() === "false") + return false + return Boolean(value) + }, options) +}