Ajout d'un endpoint pour essayer de réparer un état éventuellement cassé

This commit is contained in:
Emmy D'Anello 2024-12-08 19:55:07 +01:00
parent a1b5fccc98
commit 4c157ff67f
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
3 changed files with 75 additions and 7 deletions

View File

@ -0,0 +1,6 @@
import { MoneyUpdate } from "@prisma/client"
export interface RepairGame {
added: MoneyUpdate[]
deleted: MoneyUpdate[]
}

View File

@ -1,8 +1,9 @@
import { Controller, Delete, Get, HttpCode, Post, UseGuards } from '@nestjs/common' import { Controller, Delete, Get, Post, Put, UseGuards } from '@nestjs/common'
import { GameService } from './game.service' import { GameService } from './game.service'
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard' import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'
import { ApiBearerAuth, ApiNoContentResponse, ApiOkResponse, ApiOperation, ApiUnauthorizedResponse } from '@nestjs/swagger' import { ApiBearerAuth } from '@nestjs/swagger'
import { GameEntity } from './entities/game.entity' import { GameEntity } from './entities/game.entity'
import { RepairGame } from './dto/repair-game.dto'
@Controller('game') @Controller('game')
export class GameController { export class GameController {
@ -60,4 +61,17 @@ export class GameController {
async reset(): Promise<GameEntity> { async reset(): Promise<GameEntity> {
return new GameEntity(await this.gameService.reset()) return new GameEntity(await this.gameService.reset())
} }
/**
* Tente de réparer l'état du jeu
* @remarks , Vérifie que tous les trains ont bien é payés et que tous les défis réussis sont bien accompagnés d'un crédit de points.
*
* @throws {401} Non authentifiée
*/
@Put('/repair')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
async repair(): Promise<RepairGame> {
return await this.gameService.repair()
}
} }

View File

@ -1,16 +1,17 @@
import { ConflictException, Injectable } from '@nestjs/common' import { ConflictException, Injectable } from '@nestjs/common'
import { MoneyUpdateType } from '@prisma/client' import { Game, MoneyUpdate, MoneyUpdateType } from '@prisma/client'
import { PrismaService } from 'src/prisma/prisma.service' import { PrismaService } from 'src/prisma/prisma.service'
import { RepairGame } from './dto/repair-game.dto'
@Injectable() @Injectable()
export class GameService { export class GameService {
constructor (private prisma: PrismaService) {} constructor (private prisma: PrismaService) {}
async find() { async find(): Promise<Game> {
return await this.prisma.game.findUnique({ where: { id: 1 } }) return await this.prisma.game.findUnique({ where: { id: 1 } })
} }
async start() { async start(): Promise<Game> {
const game = await this.find() const game = await this.find()
if (game.started) if (game.started)
throw new ConflictException("La partie a déjà démarré.") throw new ConflictException("La partie a déjà démarré.")
@ -37,7 +38,7 @@ export class GameService {
}) })
} }
async stop() { async stop(): Promise<Game> {
const game = await this.find() const game = await this.find()
if (!game.started) if (!game.started)
throw new ConflictException("La partie n'a pas encore démarré.") throw new ConflictException("La partie n'a pas encore démarré.")
@ -49,7 +50,7 @@ export class GameService {
}) })
} }
async reset() { async reset(): Promise<Game> {
await this.prisma.moneyUpdate.deleteMany() await this.prisma.moneyUpdate.deleteMany()
await this.prisma.challengeAction.deleteMany() await this.prisma.challengeAction.deleteMany()
await this.prisma.trainTrip.deleteMany() await this.prisma.trainTrip.deleteMany()
@ -64,4 +65,51 @@ export class GameService {
}) })
return await this.find() return await this.find()
} }
async repair(): Promise<RepairGame> {
const added: MoneyUpdate[] = []
const deleted: MoneyUpdate[] = []
const trains = await this.prisma.trainTrip.findMany({ include: { moneyUpdate: true } })
for (const train of trains) {
if (!train.moneyUpdate) {
const trainMoneyUpdate = await this.prisma.moneyUpdate.create({
data: {
playerId: train.playerId,
amount: -10 * Math.ceil(train.distance / 1000),
reason: MoneyUpdateType.BUY_TRAIN,
tripId: train.id,
}
})
added.push(trainMoneyUpdate)
}
}
const orpanTrainMoneyUpdates = await this.prisma.moneyUpdate.findMany({ where: { reason: MoneyUpdateType.BUY_TRAIN, tripId: null } })
await this.prisma.moneyUpdate.deleteMany({ where: { reason: MoneyUpdateType.BUY_TRAIN, tripId: null } })
deleted.push(...orpanTrainMoneyUpdates)
const challengeActions = await this.prisma.challengeAction.findMany({ include: { moneyUpdate: true, challenge: true } })
for (const challengeAction of challengeActions) {
if (challengeAction.success && !challengeAction.moneyUpdate) {
const challengeMoneyUpdate = await this.prisma.moneyUpdate.create({
data: {
playerId: challengeAction.playerId,
amount: challengeAction.challenge.reward,
reason: MoneyUpdateType.WIN_CHALLENGE,
actionId: challengeAction.id,
}
})
added.push(challengeMoneyUpdate)
}
else if (!challengeAction.success && challengeAction.moneyUpdate) {
deleted.push(challengeAction.moneyUpdate)
await this.prisma.moneyUpdate.delete({ where: { id: challengeAction.moneyUpdate.id } })
}
}
const orpanChallengeMoneyUpdates = await this.prisma.moneyUpdate.findMany({ where: { reason: MoneyUpdateType.WIN_CHALLENGE, actionId: null } })
await this.prisma.moneyUpdate.deleteMany({ where: { reason: MoneyUpdateType.WIN_CHALLENGE, actionId: null } })
deleted.push(...orpanTrainMoneyUpdates)
return { added: added, deleted: deleted }
}
} }