Browse Source

[FEAT] abstract some classes to define generic behavior

Adrien Carteron 2 years ago
parent
commit
29d6030ef2

+ 18 - 0
src/main/kotlin/re/chasam/connector/Connector.kt

@@ -0,0 +1,18 @@
+package re.chasam.connector
+
+import re.chasam.models.impl.Player
+
+data class Database (
+    val scheme : String,
+    val host : String,
+    val port : Int,
+    val name : String,
+    val collection : String,
+)
+
+interface Connector {
+    val defaultDatabase: Database
+    fun insertOrUpdate(name: String, score: Int = 0, rank : Int = 0)
+    fun dropAll()
+    fun listAll(): List<Player>
+}

+ 12 - 34
src/main/kotlin/re/chasam/connector/Mongo.kt → src/main/kotlin/re/chasam/connector/impl/Mongo.kt

@@ -1,4 +1,4 @@
-package re.chasam.connector
+package re.chasam.connector.impl
 
 import com.mongodb.MongoException
 import com.mongodb.client.*
@@ -7,41 +7,22 @@ import com.mongodb.client.model.Sorts
 import com.mongodb.client.model.UpdateOptions
 import com.mongodb.client.model.Updates
 import org.bson.Document
-import re.chasam.models.Player
+import re.chasam.connector.Connector
+import re.chasam.connector.Database
+import re.chasam.models.impl.Player
 
 
-class Mongo {
-    data class Database (
-        val scheme : String,
-        val host : String,
-        val port : Int = 27017,
-        val name : String,
-        val collection : String,
-    )
-    val defaultDatabase = Database("mongodb","127.0.0.1", 27017, "tournament", "users")
+class Mongo : Connector {
+    override val defaultDatabase = Database("mongodb","127.0.0.1", 27017, "tournament", "users")
 
     private var uri = "${defaultDatabase.scheme}://${defaultDatabase.host}:${defaultDatabase.port}"
-
     private val mongoClient: MongoClient = MongoClients.create(uri)
     private val database: MongoDatabase = mongoClient.getDatabase(defaultDatabase.name)
     private val mCollection: MongoCollection<Document> = database.getCollection(defaultDatabase.collection)
     init {
         println("init tournament")
     }
-
-//    fun insert(name: String, score: Int = 0) {
-//        try {
-//            val result = collection.insertOne(
-//                Document()
-//                    .append("name", name)
-//                    .append("score", score)
-//            )
-//            println("Success! Inserted document id: " + result.insertedId)
-//        } catch (me: MongoException) {
-//            System.err.println("Unable to insert due to an error: $me")
-//        }
-//    }
-    fun insertOrUpdate(name: String, score: Int = 0) {
+    override fun insertOrUpdate(name: String, score: Int, rank : Int) {
         val query = Document().append("name", name)
         val updates = Updates.combine(
             Updates.set("score", score),
@@ -56,31 +37,28 @@ class Mongo {
             System.err.println("Unable to update due to an error: $me")
         }
     }
-    fun dropAll() {
+    override fun dropAll() {
         try {
             val result = mCollection.deleteMany(Document())
-            println("deleted document count: " + result.deletedCount)
+            println("Dropped collection : $result")
         } catch (me: MongoException) {
             System.err.println("Unable to drop due to an error: $me")
         }
     }
-    fun listAll(): List<Player> {
+    override fun listAll(): List<Player> {
         try {
 
             val projectionFields = Projections.fields(
-                Projections.include("name", "score"),
+                Projections.include("name", "score", "rank"),
                 Projections.excludeId()
             )
             val doc = mCollection.find()
                 .projection(projectionFields)
                 .sort(Sorts.descending("score"))
-
-            println("listed document count: ${doc.toList()}")
             val players = mutableListOf<Player>()
             doc.forEach { it: Document ->
-                players.add(Player(it.getString("name"), it.getInteger("score")))
+                players.add(Player(it.getString("name"), it.getInteger("score"), it.getInteger("rank")))
             }
-            println("listed document count: $players")
             return players
         } catch (me: MongoException) {
             System.err.println("Unable to drop due to an error: $me")

+ 11 - 0
src/main/kotlin/re/chasam/models/Tounament.kt

@@ -0,0 +1,11 @@
+package re.chasam.models
+
+import re.chasam.models.impl.Player
+
+interface Tournament {
+    fun getPlayer(name : String) : Player?
+    fun addOrUpdate(player : Player)
+    fun addOrUpdate(name : String, score : Int = 0)
+    fun clean()
+    fun updateRank()
+}

+ 2 - 4
src/main/kotlin/re/chasam/models/Player.kt → src/main/kotlin/re/chasam/models/impl/Player.kt

@@ -1,11 +1,9 @@
-package re.chasam.models
+package re.chasam.models.impl
 
 import kotlinx.serialization.Serializable
 
 @Serializable
-class Player (var name: String = "", var score: Int = 0) : Comparable<Player>{
-    var rank : Int = 0
-
+class Player (var name: String = "", var score: Int = 0, var rank : Int = 0) : Comparable<Player>{
     override fun compareTo(other: Player): Int {
         if (this.score == other.score)
             return 0

+ 16 - 10
src/main/kotlin/re/chasam/models/TournamentImpl.kt → src/main/kotlin/re/chasam/models/impl/TournamentImpl.kt

@@ -1,20 +1,15 @@
-package re.chasam.models
+package re.chasam.models.impl
 
 import org.koin.core.component.KoinComponent
-import re.chasam.connector.Mongo
-
-interface Tournament {
-    fun getPlayer(name : String) : Player?
-    fun addOrUpdate(player : Player)
-    fun addOrUpdate(name : String, score : Int = 0)
-    fun clean()
-}
+import re.chasam.connector.impl.Mongo
+import re.chasam.models.Tournament
 
 class TournamentImpl : Tournament, KoinComponent {
     var players = mutableListOf<Player>()
     private val mg = Mongo()
     init {
         players = mg.listAll().toMutableList()
+        updateRank()
     }
     override fun getPlayer(name: String) : Player? {
         val player = Player(name)
@@ -22,7 +17,6 @@ class TournamentImpl : Tournament, KoinComponent {
         println("index: $index")
         if (index == -1)
             return null
-        players[index].rank = index + 1
         return players[index]
     }
     override fun addOrUpdate(player : Player) {
@@ -34,6 +28,7 @@ class TournamentImpl : Tournament, KoinComponent {
             players[index] = player
         println(players)
         mg.insertOrUpdate(player.name, player.score)
+        updateRank()
     }
     override fun addOrUpdate(name : String, score : Int){
         val player = Player(name, score)
@@ -43,4 +38,15 @@ class TournamentImpl : Tournament, KoinComponent {
         players.clear()
         mg.dropAll()
     }
+    override fun updateRank() {
+        players.sortDescending()
+        var rank = 0
+        var score = 0
+        for (player in players) {
+            if (player.score != score)
+                rank ++
+            player.rank = rank
+            score = player.score
+        }
+    }
 }