Compare commits

...

2 Commits

Author SHA1 Message Date
b93b8b4c04
Ajout structure de jeu 2024-12-08 16:34:06 +01:00
0d96b78c33
Retrait de logs superflus 2024-12-08 16:04:00 +01:00
14 changed files with 124 additions and 11 deletions

View File

@ -7,11 +7,19 @@ CREATE TABLE "Player" (
"name" TEXT NOT NULL, "name" TEXT NOT NULL,
"password" TEXT NOT NULL, "password" TEXT NOT NULL,
"money" INTEGER NOT NULL DEFAULT 0, "money" INTEGER NOT NULL DEFAULT 0,
"currentRunner" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "Player_pkey" PRIMARY KEY ("id") CONSTRAINT "Player_pkey" PRIMARY KEY ("id")
); );
-- CreateTable
CREATE TABLE "Game" (
"id" SERIAL NOT NULL,
"started" BOOLEAN NOT NULL DEFAULT false,
"currentRunnerId" INTEGER,
CONSTRAINT "Game_pkey" PRIMARY KEY ("id")
);
-- CreateTable -- CreateTable
CREATE TABLE "Geolocation" ( CREATE TABLE "Geolocation" (
"id" SERIAL NOT NULL, "id" SERIAL NOT NULL,
@ -82,6 +90,9 @@ CREATE TABLE "MoneyUpdate" (
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "Player_name_key" ON "Player"("name"); CREATE UNIQUE INDEX "Player_name_key" ON "Player"("name");
-- CreateIndex
CREATE UNIQUE INDEX "Game_currentRunnerId_key" ON "Game"("currentRunnerId");
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "Challenge_title_key" ON "Challenge"("title"); CREATE UNIQUE INDEX "Challenge_title_key" ON "Challenge"("title");
@ -94,6 +105,9 @@ CREATE UNIQUE INDEX "MoneyUpdate_actionId_key" ON "MoneyUpdate"("actionId");
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "MoneyUpdate_tripId_key" ON "MoneyUpdate"("tripId"); CREATE UNIQUE INDEX "MoneyUpdate_tripId_key" ON "MoneyUpdate"("tripId");
-- AddForeignKey
ALTER TABLE "Game" ADD CONSTRAINT "Game_currentRunnerId_fkey" FOREIGN KEY ("currentRunnerId") REFERENCES "Player"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey -- AddForeignKey
ALTER TABLE "Geolocation" ADD CONSTRAINT "Geolocation_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "Geolocation" ADD CONSTRAINT "Geolocation_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@ -12,11 +12,18 @@ model Player {
name String @unique name String @unique
password String password String
money Int @default(0) money Int @default(0)
currentRunner Boolean @default(false)
actions ChallengeAction[] actions ChallengeAction[]
geolocations Geolocation[] geolocations Geolocation[]
moneyUpdates MoneyUpdate[] moneyUpdates MoneyUpdate[]
trips TrainTrip[] trips TrainTrip[]
runningGame Game?
}
model Game {
id Int @id @default(autoincrement())
started Boolean @default(false)
currentRunner Player? @relation(fields: [currentRunnerId], references: [id])
currentRunnerId Int? @unique
} }
model Geolocation { model Geolocation {

View File

@ -4,6 +4,7 @@ import * as bcrypt from 'bcrypt'
const prisma = new PrismaClient() const prisma = new PrismaClient()
async function main() { async function main() {
const game = await prisma.game.create({ data: {} })
const emmyPassword = await bcrypt.hash("Emmy", 10) const emmyPassword = await bcrypt.hash("Emmy", 10)
const emmy = await prisma.player.upsert({ const emmy = await prisma.player.upsert({
where: { id: 1 }, where: { id: 1 },
@ -17,7 +18,7 @@ async function main() {
update: { name: 'Tamina' }, update: { name: 'Tamina' },
create: { name: 'Tamina', password: taminaPassword }, create: { name: 'Tamina', password: taminaPassword },
}) })
console.log({ emmy, tamina }) console.log({ game, emmy, tamina })
} }
main() main()

View File

@ -8,9 +8,10 @@ import { ChallengesModule } from './challenges/challenges.module'
import { ChallengeActionsModule } from './challenge-actions/challenge-actions.module' import { ChallengeActionsModule } from './challenge-actions/challenge-actions.module'
import { TrainsModule } from './trains/trains.module' import { TrainsModule } from './trains/trains.module'
import { MoneyUpdatesModule } from './money-updates/money-updates.module' import { MoneyUpdatesModule } from './money-updates/money-updates.module'
import { GameModule } from './game/game.module'
@Module({ @Module({
imports: [PrismaModule, PlayersModule, AuthModule, GeolocationsModule, ChallengesModule, ChallengeActionsModule, TrainsModule, MoneyUpdatesModule], imports: [PrismaModule, AuthModule, PlayersModule, GameModule, GeolocationsModule, ChallengesModule, ChallengeActionsModule, TrainsModule, MoneyUpdatesModule],
providers: [PrismaService], providers: [PrismaService],
}) })
export class AppModule {} export class AppModule {}

View File

@ -4,8 +4,8 @@ import { ApiOkResponse, ApiTags } from '@nestjs/swagger'
import { AuthEntity } from './entity/auth.entity' import { AuthEntity } from './entity/auth.entity'
import { LoginDto } from './dto/login.dto' import { LoginDto } from './dto/login.dto'
@Controller('auth')
@ApiTags('auth') @ApiTags('auth')
@Controller('auth')
export class AuthController { export class AuthController {
constructor(private readonly authService: AuthService) {} constructor(private readonly authService: AuthService) {}

View File

@ -15,7 +15,6 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
} }
async validate(payload: { playerId: number }): Promise<Player> { async validate(payload: { playerId: number }): Promise<Player> {
console.log(payload)
const player = await this.playersService.findOne(payload.playerId) const player = await this.playersService.findOne(payload.playerId)
if (!player) { if (!player) {
throw new UnauthorizedException() throw new UnauthorizedException()

View File

@ -19,7 +19,6 @@ export class ChallengeActionsService {
} }
async findAll(queryPagination: QueryPaginationDto, filterChallengeActions: FilterChallengeActionsDto): Promise<[ChallengeAction[], number]> { async findAll(queryPagination: QueryPaginationDto, filterChallengeActions: FilterChallengeActionsDto): Promise<[ChallengeAction[], number]> {
console.log(filterChallengeActions)
return [ return [
await this.prisma.challengeAction.findMany({ await this.prisma.challengeAction.findMany({
...paginate(queryPagination), ...paginate(queryPagination),
@ -36,7 +35,6 @@ export class ChallengeActionsService {
} }
async update(id: number, updateChallengeActionDto: UpdateChallengeActionDto): Promise<ChallengeAction> { async update(id: number, updateChallengeActionDto: UpdateChallengeActionDto): Promise<ChallengeAction> {
console.log(updateChallengeActionDto)
return await this.prisma.challengeAction.update({ return await this.prisma.challengeAction.update({
where: { id }, where: { id },
data: updateChallengeActionDto, data: updateChallengeActionDto,

View File

@ -0,0 +1,17 @@
import { ApiProperty } from "@nestjs/swagger"
import { Game } from "@prisma/client"
export class GameEntity implements Game {
constructor(partial: Partial<GameEntity>) {
Object.assign(this, partial)
}
@ApiProperty({ description: "Identifiant unique du jeu" })
id: number
@ApiProperty({ description: "Est-ce que la partie est en cours" })
started: boolean
@ApiProperty({ description: "Identifiant de læ joueur⋅se en course" })
currentRunnerId: number
}

View File

@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing'
import { GameController } from './game.controller'
import { GameService } from './game.service'
describe('GameController', () => {
let controller: GameController
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [GameController],
providers: [GameService],
}).compile()
controller = module.get<GameController>(GameController)
})
it('should be defined', () => {
expect(controller).toBeDefined()
})
})

View File

@ -0,0 +1,19 @@
import { Controller, Get, UseGuards } from '@nestjs/common'
import { GameService } from './game.service'
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'
import { ApiBearerAuth, ApiOkResponse, ApiUnauthorizedResponse } from '@nestjs/swagger'
import { GameEntity } from './entities/game.entity'
@Controller('game')
export class GameController {
constructor(private readonly gameService: GameService) {}
@Get()
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@ApiOkResponse({ type: GameEntity })
@ApiUnauthorizedResponse({ description: "Non authentifié⋅e" })
async find() {
return new GameEntity(await this.gameService.find())
}
}

View File

@ -0,0 +1,11 @@
import { Module } from '@nestjs/common'
import { GameService } from './game.service'
import { GameController } from './game.controller'
import { PrismaModule } from 'src/prisma/prisma.module'
@Module({
controllers: [GameController],
providers: [GameService],
imports: [PrismaModule],
})
export class GameModule {}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing'
import { GameService } from './game.service'
describe('GameService', () => {
let service: GameService
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [GameService],
}).compile()
service = module.get<GameService>(GameService)
})
it('should be defined', () => {
expect(service).toBeDefined()
})
})

View File

@ -0,0 +1,11 @@
import { Injectable } from '@nestjs/common'
import { PrismaService } from 'src/prisma/prisma.service'
@Injectable()
export class GameService {
constructor (private prisma: PrismaService) {}
async find() {
return await this.prisma.game.findUnique({ where: { id: 1 } })
}
}

View File

@ -18,7 +18,4 @@ export class PlayerEntity implements Player {
@ApiProperty({description: "Nombre de jetons dont dispose actuellement læ joueur⋅se"}) @ApiProperty({description: "Nombre de jetons dont dispose actuellement læ joueur⋅se"})
money: number money: number
@ApiProperty({description: "Est-ce que cet⋅te joueur⋅se est cellui actuellement en course"})
currentRunner: boolean
} }