Compare commits

...

2 Commits

4 changed files with 67 additions and 18 deletions

View File

@ -33,10 +33,12 @@ export default function ChallengesList() {
onPostSuccess: () => { onPostSuccess: () => {
setSuccessMessage("Le défi a bien été ajouté !") setSuccessMessage("Le défi a bien été ajouté !")
setSuccessSnackbarVisible(true) setSuccessSnackbarVisible(true)
setEditChallengeVisible(false)
queryClient.invalidateQueries({ predicate: (query) => query.queryKey[0] === 'get-challenges' }) queryClient.invalidateQueries({ predicate: (query) => query.queryKey[0] === 'get-challenges' })
}, },
onError: ({ response, error }) => { onError: ({ response, error }) => {
setErrorVisible(true) setErrorVisible(true)
setEditChallengeVisible(false)
if (response) if (response)
setError([response.statusCode, response.message]) setError([response.statusCode, response.message])
else if (error) else if (error)
@ -54,6 +56,8 @@ export default function ChallengesList() {
}, },
onError: ({ response, error }) => { onError: ({ response, error }) => {
setErrorVisible(true) setErrorVisible(true)
setEditChallengeVisible(false)
setDisplayedChallenge(null)
if (response) if (response)
setError([response.statusCode, response.message]) setError([response.statusCode, response.message])
else if (error) else if (error)
@ -64,12 +68,12 @@ export default function ChallengesList() {
auth, auth,
onPostSuccess: () => { onPostSuccess: () => {
setSuccessMessage("Le défi a bien été supprimé !") setSuccessMessage("Le défi a bien été supprimé !")
setSuccessSnackbarVisible(true) setDisplayedChallenge(null)
setEditChallengeVisible(false)
queryClient.invalidateQueries({ predicate: (query) => query.queryKey[0] === 'get-challenges' }) queryClient.invalidateQueries({ predicate: (query) => query.queryKey[0] === 'get-challenges' })
}, },
onError: ({ response, error }) => { onError: ({ response, error }) => {
setErrorVisible(true) setErrorVisible(true)
setDisplayedChallenge(null)
if (response) if (response)
setError([response.statusCode, response.message]) setError([response.statusCode, response.message])
else if (error) else if (error)
@ -132,7 +136,7 @@ export default function ChallengesList() {
</Snackbar> </Snackbar>
<FAB <FAB
icon='plus' icon='plus'
style={styles.addButton} style={{ ...styles.addButton, bottom: errorVisible || successSnackbarVisible ? 80 : styles.addButton.bottom }}
onPress={() => { onPress={() => {
if (editChallengeId) { if (editChallengeId) {
setEditChallengeTitle("") setEditChallengeTitle("")

View File

@ -0,0 +1,41 @@
-- DropForeignKey
ALTER TABLE "ChallengeAction" DROP CONSTRAINT "ChallengeAction_challengeId_fkey";
-- DropForeignKey
ALTER TABLE "Geolocation" DROP CONSTRAINT "Geolocation_playerId_fkey";
-- DropForeignKey
ALTER TABLE "MoneyUpdate" DROP CONSTRAINT "MoneyUpdate_actionId_fkey";
-- DropForeignKey
ALTER TABLE "MoneyUpdate" DROP CONSTRAINT "MoneyUpdate_runId_fkey";
-- DropForeignKey
ALTER TABLE "MoneyUpdate" DROP CONSTRAINT "MoneyUpdate_tripId_fkey";
-- DropForeignKey
ALTER TABLE "PlayerRun" DROP CONSTRAINT "PlayerRun_gameId_fkey";
-- DropForeignKey
ALTER TABLE "PlayerRun" DROP CONSTRAINT "PlayerRun_runnerId_fkey";
-- AddForeignKey
ALTER TABLE "PlayerRun" ADD CONSTRAINT "PlayerRun_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "PlayerRun" ADD CONSTRAINT "PlayerRun_runnerId_fkey" FOREIGN KEY ("runnerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Geolocation" ADD CONSTRAINT "Geolocation_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ChallengeAction" ADD CONSTRAINT "ChallengeAction_challengeId_fkey" FOREIGN KEY ("challengeId") REFERENCES "Challenge"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MoneyUpdate" ADD CONSTRAINT "MoneyUpdate_actionId_fkey" FOREIGN KEY ("actionId") REFERENCES "ChallengeAction"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MoneyUpdate" ADD CONSTRAINT "MoneyUpdate_tripId_fkey" FOREIGN KEY ("tripId") REFERENCES "TrainTrip"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MoneyUpdate" ADD CONSTRAINT "MoneyUpdate_runId_fkey" FOREIGN KEY ("runId") REFERENCES "PlayerRun"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -12,7 +12,7 @@ model Player {
name String @unique name String @unique
password String password String
money Int @default(0) money Int @default(0)
activeChallenge ChallengeAction? @relation("ActiveChallenge", fields: [activeChallengeId], references: [id]) activeChallenge ChallengeAction? @relation("ActiveChallenge", fields: [activeChallengeId], references: [id], onDelete: SetNull)
activeChallengeId Int? @unique activeChallengeId Int? @unique
actions ChallengeAction[] actions ChallengeAction[]
geolocations Geolocation[] geolocations Geolocation[]
@ -24,17 +24,17 @@ model Player {
model Game { model Game {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
started Boolean @default(false) started Boolean @default(false)
currentRun PlayerRun? @relation("CurrentRun", fields: [currentRunId], references: [id]) currentRun PlayerRun? @relation("CurrentRun", fields: [currentRunId], references: [id], onDelete: SetNull)
currentRunId Int? @unique currentRunId Int? @unique
runs PlayerRun[] @relation("GameRuns") runs PlayerRun[] @relation("GameRuns")
} }
model PlayerRun { model PlayerRun {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
game Game @relation("GameRuns", fields: [gameId], references: [id]) game Game @relation("GameRuns", fields: [gameId], references: [id], onDelete: Cascade)
runningGame Game? @relation("CurrentRun") runningGame Game? @relation("CurrentRun")
gameId Int gameId Int
runner Player @relation(fields: [runnerId], references: [id]) runner Player @relation(fields: [runnerId], references: [id], onDelete: Cascade)
runnerId Int runnerId Int
start DateTime @default(now()) @db.Timestamptz(3) start DateTime @default(now()) @db.Timestamptz(3)
end DateTime? @db.Timestamptz(3) end DateTime? @db.Timestamptz(3)
@ -45,7 +45,7 @@ model PlayerRun {
model Geolocation { model Geolocation {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
player Player @relation(fields: [playerId], references: [id]) player Player @relation(fields: [playerId], references: [id], onDelete: Cascade)
playerId Int playerId Int
longitude Float longitude Float
latitude Float latitude Float
@ -66,16 +66,16 @@ model Challenge {
model ChallengeAction { model ChallengeAction {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
player Player @relation(fields: [playerId], references: [id]) player Player @relation(fields: [playerId], references: [id], onDelete: Restrict)
playerId Int playerId Int
challenge Challenge @relation(fields: [challengeId], references: [id]) challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)
challengeId Int @unique challengeId Int @unique
success Boolean @default(false) success Boolean @default(false)
start DateTime @default(now()) @db.Timestamptz(3) start DateTime @default(now()) @db.Timestamptz(3)
end DateTime? @db.Timestamptz(3) end DateTime? @db.Timestamptz(3)
penaltyStart DateTime? @db.Timestamptz(3) penaltyStart DateTime? @db.Timestamptz(3)
penaltyEnd DateTime? @db.Timestamptz(3) penaltyEnd DateTime? @db.Timestamptz(3)
run PlayerRun @relation(fields: [runId], references: [id]) run PlayerRun @relation(fields: [runId], references: [id], onDelete: Restrict)
runId Int runId Int
activePlayer Player? @relation("ActiveChallenge") activePlayer Player? @relation("ActiveChallenge")
moneyUpdate MoneyUpdate? moneyUpdate MoneyUpdate?
@ -83,7 +83,7 @@ model ChallengeAction {
model TrainTrip { model TrainTrip {
id String @id id String @id
player Player @relation(fields: [playerId], references: [id]) player Player @relation(fields: [playerId], references: [id], onDelete: Restrict)
playerId Int playerId Int
distance Float distance Float
from String from String
@ -91,22 +91,22 @@ model TrainTrip {
departureTime DateTime @db.Timestamptz(3) departureTime DateTime @db.Timestamptz(3)
arrivalTime DateTime @db.Timestamptz(3) arrivalTime DateTime @db.Timestamptz(3)
infoJson Json infoJson Json
run PlayerRun @relation(fields: [runId], references: [id]) run PlayerRun @relation(fields: [runId], references: [id], onDelete: Restrict)
runId Int runId Int
moneyUpdate MoneyUpdate? moneyUpdate MoneyUpdate?
} }
model MoneyUpdate { model MoneyUpdate {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
player Player @relation(fields: [playerId], references: [id]) player Player @relation(fields: [playerId], references: [id], onDelete: Restrict)
playerId Int playerId Int
amount Int amount Int
reason MoneyUpdateType reason MoneyUpdateType
action ChallengeAction? @relation(fields: [actionId], references: [id]) action ChallengeAction? @relation(fields: [actionId], references: [id], onDelete: Cascade)
actionId Int? @unique actionId Int? @unique
trip TrainTrip? @relation(fields: [tripId], references: [id]) trip TrainTrip? @relation(fields: [tripId], references: [id], onDelete: Cascade)
tripId String? @unique tripId String? @unique
run PlayerRun? @relation(fields: [runId], references: [id]) run PlayerRun? @relation(fields: [runId], references: [id], onDelete: Cascade)
runId Int? @unique runId Int? @unique
timestamp DateTime @default(now()) @db.Timestamptz(3) timestamp DateTime @default(now()) @db.Timestamptz(3)
} }

View File

@ -1,4 +1,4 @@
import { ConflictException, Injectable, NotFoundException } from '@nestjs/common' import { BadRequestException, ConflictException, Injectable, NotFoundException } from '@nestjs/common'
import { CreateChallengeDto } from './dto/create-challenge.dto' import { CreateChallengeDto } from './dto/create-challenge.dto'
import { UpdateChallengeDto } from './dto/update-challenge.dto' import { UpdateChallengeDto } from './dto/update-challenge.dto'
import { Challenge, Player } from '@prisma/client' import { Challenge, Player } from '@prisma/client'
@ -13,6 +13,8 @@ export class ChallengesService {
async create(createChallengeDto: CreateChallengeDto): Promise<Challenge> { async create(createChallengeDto: CreateChallengeDto): Promise<Challenge> {
const data = { ...createChallengeDto } const data = { ...createChallengeDto }
if (await this.prisma.challenge.findFirst({ where: { title: createChallengeDto.title } }))
throw new BadRequestException(`Un défi existe déjà avec pour titre « ${createChallengeDto.title} ».`)
return await this.prisma.challenge.create({ data: data }) return await this.prisma.challenge.create({ data: data })
} }
@ -40,6 +42,8 @@ export class ChallengesService {
async update(id: number, updateChallengeDto: UpdateChallengeDto): Promise<Challenge> { async update(id: number, updateChallengeDto: UpdateChallengeDto): Promise<Challenge> {
if (!await this.findOne(id)) if (!await this.findOne(id))
throw new NotFoundException(`Aucun défi n'existe avec l'identifiant ${id}`) throw new NotFoundException(`Aucun défi n'existe avec l'identifiant ${id}`)
if (await this.prisma.challenge.findFirst({ where: { title: updateChallengeDto.title, id: { not: id } } }))
throw new BadRequestException(`Un défi existe déjà avec pour titre « ${updateChallengeDto.title} ».`)
return await this.prisma.challenge.update({ return await this.prisma.challenge.update({
where: { id }, where: { id },
data: updateChallengeDto, data: updateChallengeDto,