Compare commits

...

2 Commits

6 changed files with 73 additions and 13 deletions

View File

@ -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<PaginateOutputDto<ChallengeActionEntity>> {
const [challengeActions, total] = await this.challengeActionsService.findAll(queryPagination)
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)
}

View File

@ -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 {
@ -12,20 +13,33 @@ export class ChallengeActionsService {
async create(authenticatedUser: User, createChallengeActionDto: CreateChallengeActionDto): Promise<ChallengeAction> {
const data = { ...createChallengeActionDto, userId: authenticatedUser.id }
return await this.prisma.challengeAction.create({ data: data })
return await this.prisma.challengeAction.create({
data: data,
include: { challenge: true },
})
}
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,
},
}),
await this.prisma.challenge.count(),
]
}
async findOne(id: number): Promise<ChallengeAction> {
return await this.prisma.challengeAction.findUnique({ where: { id } })
return await this.prisma.challengeAction.findUnique({
where: { id },
include: {
challenge: true,
},
})
}
async update(id: number, updateChallengeActionDto: UpdateChallengeActionDto): Promise<ChallengeAction> {
@ -36,6 +50,8 @@ export class ChallengeActionsService {
}
async remove(id: number): Promise<ChallengeAction> {
return await this.prisma.challengeAction.delete({ where: { id } })
return await this.prisma.challengeAction.delete({
where: { id },
})
}
}

View File

@ -1,6 +1,7 @@
import { ApiProperty } from "@nestjs/swagger"
import { Type } from "class-transformer"
import { IsBoolean, IsInt } from "class-validator"
import { IsBoolean, IsInt, IsOptional } from "class-validator"
import { BooleanTransform } from "src/common/utils/transform.utils"
export class CreateChallengeActionDto {
@IsInt()
@ -8,13 +9,15 @@ export class CreateChallengeActionDto {
@ApiProperty({ description: "Identifiant du défi rattaché à l'action" })
challengeId: number
@IsOptional()
@IsBoolean()
@Type(() => Boolean)
@ApiProperty({ description: "Est-ce que le défi est actuellement en train d'être réalisé" })
active: 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)
@ApiProperty({ description: "Est-ce que le défi a été réussi" })
success: boolean
@BooleanTransform()
@ApiProperty({ description: "Est-ce que le défi a été réussi", default: false })
success: boolean = false
}

View File

@ -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
}

View File

@ -1,9 +1,13 @@
import { ApiProperty } from "@nestjs/swagger"
import { ChallengeAction } from "@prisma/client"
import { ChallengeEntity } from "src/challenges/entities/challenge.entity"
export class ChallengeActionEntity implements ChallengeAction {
constructor(partial: Partial<ChallengeActionEntity>) {
Object.assign(this, partial)
if (this.challenge) {
this.challenge = new ChallengeEntity(this.challenge)
}
}
@ApiProperty({ description: "Identifiant unique" })
@ -15,6 +19,9 @@ export class ChallengeActionEntity implements ChallengeAction {
@ApiProperty({ description: "Identifiant du défi rattaché à l'action" })
challengeId: number
@ApiProperty({ type: ChallengeEntity, description: "Défi rattaché à l'action", nullable: true })
challenge?: ChallengeEntity | null
@ApiProperty({ description: "Est-ce que le défi est actuellement en train d'être réalisé" })
active: boolean

View File

@ -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)
}