diff --git a/backend/pom.xml b/backend/pom.xml index afe11dc..8f6057a 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -112,6 +112,14 @@ io.quarkus quarkus-swagger-ui + + io.quarkus + quarkus-mongodb-client + + + io.quarkus + quarkus-mongodb-panache + diff --git a/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java b/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java index 512c416..a013681 100644 --- a/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java +++ b/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java @@ -5,7 +5,9 @@ import fr.zelytra.game.pool.PoolParty; import fr.zelytra.game.pool.PoolPlayer; import fr.zelytra.game.pool.data.*; +import fr.zelytra.game.pool.game.PoolGameManager; import fr.zelytra.game.pool.game.PoolVictoryState; +import fr.zelytra.game.pool.game.services.PoolGameService; import fr.zelytra.notification.Notification; import fr.zelytra.notification.NotificationMessageKey; import fr.zelytra.notification.NotificationMessageType; @@ -29,6 +31,9 @@ public class PoolSocketService { @Inject UserService userService; + @Inject + PoolGameService poolGameService; + private final ConcurrentMap games = new ConcurrentHashMap<>(); /** @@ -382,7 +387,10 @@ public void playAction(GameAction gameAction, String socketSessionId) { user.setPp(reportPlayer.pp()); user.setGamePlayed(user.getGamePlayed() + 1); } + // Persist game + poolGameService.persist((PoolGameManager) poolParty.getGame()); } + broadcastPoolDataToParty(poolParty); Log.info("[playAction][" + poolParty.getUuid() + "] User: " + poolPlayer.getUsername() + " play game action"); } diff --git a/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java b/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java index 98e033f..66f3e1b 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java +++ b/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java @@ -4,7 +4,7 @@ import fr.zelytra.game.manager.message.SocketTimeOutManager; import fr.zelytra.game.manager.socket.PoolSocketService; import fr.zelytra.game.pool.data.*; -import fr.zelytra.game.pool.game.AmericanEightPoolGame; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import fr.zelytra.game.pool.game.PoolGameInterface; import fr.zelytra.game.pool.game.PoolVictoryState; import fr.zelytra.notification.NotificationMessageKey; @@ -171,6 +171,7 @@ public GameReport getGameReport(PoolVictoryState victoryState) { gameReport.looserPlayer().add(new GameReportPlayer(player.getPp(), newPlayerPP, player.getUsername())); } } + game.setGameReport(gameReport); return gameReport; } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java index 5fcf480..efb79ea 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java @@ -1,6 +1,7 @@ package fr.zelytra.game.pool.game; import fr.zelytra.game.pool.data.GameAction; +import fr.zelytra.game.pool.data.GameReport; import fr.zelytra.game.pool.data.PoolTeam; public interface PoolGameInterface { @@ -11,4 +12,5 @@ public interface PoolGameInterface { GameAction getCurrentAction(); void setCurrentAction(GameAction action); void setVictoryState(PoolVictoryState state); + void setGameReport(GameReport report); } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java index f9c4a24..f315ad9 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java @@ -2,13 +2,23 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import fr.zelytra.game.pool.data.GameAction; +import fr.zelytra.game.pool.data.GameReport; import fr.zelytra.game.pool.data.PoolTeam; +import io.quarkus.mongodb.panache.common.MongoEntity; +import jakarta.persistence.GeneratedValue; +import org.bson.codecs.pojo.annotations.BsonId; +import org.bson.codecs.pojo.annotations.BsonIgnore; import java.util.ArrayList; import java.util.List; +@MongoEntity(collection = "PoolGames") public class PoolGameManager { + @BsonId + @GeneratedValue + private int id; + private final PoolTeam teams = new PoolTeam(new ArrayList<>(), new ArrayList<>()); private final long startingTime; private long endTime; @@ -16,6 +26,7 @@ public class PoolGameManager { private GameAction currentAction; private boolean paused = false; private PoolVictoryState victoryState = PoolVictoryState.NONE; + private GameReport gameReport; public PoolGameManager() { startingTime = System.currentTimeMillis(); @@ -50,6 +61,7 @@ public List getTeamActions(List teamNames) { } @JsonIgnore + @BsonIgnore public String getNextPlayer() { // Get the list of players from both teams List team1 = teams.team1(); @@ -130,4 +142,12 @@ public List getHistory() { public boolean isPaused() { return paused; } + + public GameReport getGameReport() { + return gameReport; + } + + public void setGameReport(GameReport gameReport) { + this.gameReport = gameReport; + } } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java b/backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java similarity index 95% rename from backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java rename to backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java index 3c222f7..8f3808c 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java @@ -1,8 +1,11 @@ -package fr.zelytra.game.pool.game; +package fr.zelytra.game.pool.game.customs; import fr.zelytra.game.pool.data.GameAction; import fr.zelytra.game.pool.data.PoolBalls; import fr.zelytra.game.pool.data.PoolFault; +import fr.zelytra.game.pool.game.PoolGameInterface; +import fr.zelytra.game.pool.game.PoolGameManager; +import fr.zelytra.game.pool.game.PoolVictoryState; import java.util.ArrayList; import java.util.List; diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java b/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java new file mode 100644 index 0000000..60c8cbe --- /dev/null +++ b/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java @@ -0,0 +1,9 @@ +package fr.zelytra.game.pool.game.services; + +import fr.zelytra.game.pool.game.PoolGameManager; +import io.quarkus.mongodb.panache.PanacheMongoRepository; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class PoolGameService implements PanacheMongoRepository { +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 5c174c3..f7a74aa 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -5,6 +5,14 @@ quarkus.datasource.password=${DB_PASSWORD:password} quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:127.0.0.1:24900}/${DB_DATABASE:onepool} quarkus.hibernate-orm.database.generation=update +#MongoDB +quarkus.mongodb.database=onepool +#quarkus.mongodb.credentials.username=${DB_USER:admin} +#quarkus.mongodb.credentials.password=${DB_PASSWORD:password} +#quarkus.mongodb.hosts=${DB_HOST:127.0.0.1:24905} +#quarkus.mongodb.credentials.auth-source=admin +quarkus.mongodb.connection-string=mongodb://${DB_HOST:127.0.0.1:24905}/?replicaSet=rs0 + # Test %test.quarkus.datasource.db-kind=h2 %test.quarkus.datasource.jdbc.url=jdbc:h2:mem:db diff --git a/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java b/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java index 64cb5f2..9eaf1fc 100644 --- a/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java +++ b/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java @@ -4,7 +4,7 @@ import fr.zelytra.game.pool.data.GameRules; import fr.zelytra.game.pool.data.GameStatus; import fr.zelytra.game.pool.data.PoolTeam; -import fr.zelytra.game.pool.game.AmericanEightPoolGame; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import fr.zelytra.user.UserEntity; import io.quarkus.test.junit.QuarkusTest; import jakarta.transaction.Transactional; diff --git a/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java b/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java index b05e6ce..c2811ab 100644 --- a/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java +++ b/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java @@ -3,6 +3,7 @@ import fr.zelytra.game.pool.data.GameAction; import fr.zelytra.game.pool.data.PoolBalls; import fr.zelytra.game.pool.data.PoolFault; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/deployment/dev/docker-compose.yml b/deployment/dev/docker-compose.yml index 97a2b81..7695fbf 100644 --- a/deployment/dev/docker-compose.yml +++ b/deployment/dev/docker-compose.yml @@ -1,5 +1,7 @@ -version: '3.4' name: onepool +include: + - ./mongodb/mongo-replica-compose.yml + services: postgres-app: diff --git a/deployment/dev/mongodb/init-mongo.sh b/deployment/dev/mongodb/init-mongo.sh new file mode 100644 index 0000000..ed018c7 --- /dev/null +++ b/deployment/dev/mongodb/init-mongo.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -e + +echo "Starting MongoDB initialization script..." +openssl rand -base64 756 > ~/rs_keyfile + +mongosh < ${PWD}/rs_keyfile +chmod 600 ${PWD}/rs_keyfile +chown 9999:9999 ${PWD}/rs_keyfile \ No newline at end of file diff --git a/deployment/dev/mongodb/mongo-replica-compose.yml b/deployment/dev/mongodb/mongo-replica-compose.yml new file mode 100644 index 0000000..48a48c9 --- /dev/null +++ b/deployment/dev/mongodb/mongo-replica-compose.yml @@ -0,0 +1,29 @@ +services: + mongo-rs0-1: + image: mongo:latest + container_name: mongodb + ports: + - "24905:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: ${POSTGRES_USER} + MONGO_INITDB_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + MONGO_INITDB_DATABASE: onepool + MONGO_REPLICA_SET_NAME: rs0 + volumes: + - /onepool/mongo-data/app:/data/db + command: > + bash -c "mongod --replSet rs0 --bind_ip_all + && mongo --eval 'rs.initiate({_id: \"rs0\", members: [{ _id: 0, host: \"localhost:27017\" }]})'" + + mongo-init-replica: + image: mongo:latest + depends_on: + - mongo-rs0-1 + entrypoint: > + bash -c " + sleep 10; + mongo --host mongo:27017 < { - useAlertStore().send({ - content: t('alert.websocketAuthFailed.content'), - title: t('alert.websocketAuthFailed.title'), - type: AlertType.ERROR - }) }) if (!socket) return;