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;