Ajout structure de jeu

This commit is contained in:
Emmy D'Anello 2024-12-08 16:34:06 +01:00
parent 0d96b78c33
commit b93b8b4c04
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
12 changed files with 124 additions and 8 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

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