From 1e7638f6d363c9370e6dfdc3dd128a141e9166d6 Mon Sep 17 00:00:00 2001
From: ccornu <ccornu@takima.fr>
Date: Tue, 11 Feb 2025 09:28:57 +0100
Subject: [PATCH] feat: declare interface of repository

---
 .../configuration/InjectionConfiguration.kt   |  3 +-
 .../player/repositories/PlayerRepository.kt   | 65 ++---------------
 .../repositories/PlayerRepositoryImpl.kt      | 69 +++++++++++++++++++
 3 files changed, 78 insertions(+), 59 deletions(-)
 create mode 100644 src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt

diff --git a/src/main/kotlin/configuration/InjectionConfiguration.kt b/src/main/kotlin/configuration/InjectionConfiguration.kt
index 5d3230f..57d0f07 100644
--- a/src/main/kotlin/configuration/InjectionConfiguration.kt
+++ b/src/main/kotlin/configuration/InjectionConfiguration.kt
@@ -1,6 +1,7 @@
 package betclic.test.configuration
 
 import betclic.test.player.repositories.PlayerRepository
+import betclic.test.player.repositories.PlayerRepositoryImpl
 import betclic.test.player.services.PlayerService
 import betclic.test.player.services.PlayerServiceImpl
 import io.ktor.server.application.*
@@ -22,6 +23,6 @@ val databaseModule = module {
 }
 
 val playerModule = module {
-    single<PlayerRepository> { PlayerRepository(get()) }
+    single<PlayerRepository> { PlayerRepositoryImpl(get()) }
     single<PlayerService> { PlayerServiceImpl(get()) }
 }
diff --git a/src/main/kotlin/player/repositories/PlayerRepository.kt b/src/main/kotlin/player/repositories/PlayerRepository.kt
index f5b8ef2..4d19b9c 100644
--- a/src/main/kotlin/player/repositories/PlayerRepository.kt
+++ b/src/main/kotlin/player/repositories/PlayerRepository.kt
@@ -1,69 +1,18 @@
 package betclic.test.player.repositories
 
 import betclic.test.player.entities.Player
-import betclic.test.player.entities.PlayerEntity
-import betclic.test.player.entities.toPlayer
-import betclic.test.player.entities.toPlayerEntity
-import dev.andrewohara.dynamokt.DataClassTableSchema
-import io.ktor.server.application.*
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.future.await
-import kotlinx.coroutines.reactive.asFlow
-import org.slf4j.LoggerFactory
-import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient
-import software.amazon.awssdk.enhanced.dynamodb.Expression
-import software.amazon.awssdk.enhanced.dynamodb.Key
-import software.amazon.awssdk.enhanced.dynamodb.model.ScanEnhancedRequest
-import software.amazon.awssdk.services.dynamodb.model.AttributeValue
 
-class PlayerRepository(dynamoDbEnhancedClient: DynamoDbEnhancedAsyncClient) {
-    private val tableName = PlayerEntity::class.simpleName
-    private val tableSchema = DataClassTableSchema(PlayerEntity::class)
-    private val table = dynamoDbEnhancedClient.table(tableName, tableSchema)
-    private val logger = LoggerFactory.getLogger(Application::class.java)
+interface PlayerRepository {
 
-    suspend fun createNewPlayer(player: Player) = coroutineScope {
-        table.putItem(player.toPlayerEntity()).await()
-        logger.info("Successfully created new player $player")
-        return@coroutineScope player
-    }
+    suspend fun createNewPlayer(player: Player): Player
 
-    suspend fun updatePlayer(player: Player): Player {
-        val updatedPlayer = table.updateItem(player.toPlayerEntity()).await()
-        return updatedPlayer.toPlayer()
-    }
+    suspend fun updatePlayer(player: Player): Player
 
-    suspend fun findPlayerByPseudo(pseudo: String): Player? {
-        val foundPlayer = table.getItem(
-            Key.builder().partitionValue(pseudo).build()
-        ).await()
-        return foundPlayer?.toPlayer()
-    }
+    suspend fun findPlayerByPseudo(pseudo: String): Player?
 
-    suspend fun getRank(player: Player): Int {
-        val scan = ScanEnhancedRequest.builder()
-            .filterExpression(
-                Expression.builder()
-                    .expression("pointsNumber > :pointsNumber")
-                    .putExpressionValue(
-                        ":pointsNumber", AttributeValue.builder().n(player.pointsNumber.toString()).build()
-                    ).build()
-            ).build()
-        return buildList {
-            table.scan(scan).asFlow().collect { it.items().stream().forEach { t -> add(t) } }
-        }.size + 1
-    }
+    suspend fun getRank(player: Player): Int
 
-    suspend fun findAll(): List<Player> {
-        return buildList {
-            table.scan().asFlow().collect { it.items().stream().forEach { item -> add(item.toPlayer()) } }
-        }
-    }
+    suspend fun findAll(): List<Player>
 
-
-    suspend fun deleteAllPlayers() {
-        table.deleteTable()
-        table.createTable().await()
-
-    }
+    suspend fun deleteAllPlayers()
 }
\ No newline at end of file
diff --git a/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt b/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt
new file mode 100644
index 0000000..4e273e4
--- /dev/null
+++ b/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt
@@ -0,0 +1,69 @@
+package betclic.test.player.repositories
+
+import betclic.test.player.entities.Player
+import betclic.test.player.entities.PlayerEntity
+import betclic.test.player.entities.toPlayer
+import betclic.test.player.entities.toPlayerEntity
+import dev.andrewohara.dynamokt.DataClassTableSchema
+import io.ktor.server.application.*
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.future.await
+import kotlinx.coroutines.reactive.asFlow
+import org.slf4j.LoggerFactory
+import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient
+import software.amazon.awssdk.enhanced.dynamodb.Expression
+import software.amazon.awssdk.enhanced.dynamodb.Key
+import software.amazon.awssdk.enhanced.dynamodb.model.ScanEnhancedRequest
+import software.amazon.awssdk.services.dynamodb.model.AttributeValue
+
+class PlayerRepositoryImpl(dynamoDbEnhancedClient: DynamoDbEnhancedAsyncClient) : PlayerRepository {
+    private val tableName = PlayerEntity::class.simpleName
+    private val tableSchema = DataClassTableSchema(PlayerEntity::class)
+    private val table = dynamoDbEnhancedClient.table(tableName, tableSchema)
+    private val logger = LoggerFactory.getLogger(Application::class.java)
+
+    override suspend fun createNewPlayer(player: Player) = coroutineScope {
+        table.putItem(player.toPlayerEntity()).await()
+        logger.info("Successfully created new player $player")
+        return@coroutineScope player
+    }
+
+    override suspend fun updatePlayer(player: Player): Player {
+        val updatedPlayer = table.updateItem(player.toPlayerEntity()).await()
+        return updatedPlayer.toPlayer()
+    }
+
+    override suspend fun findPlayerByPseudo(pseudo: String): Player? {
+        val foundPlayer = table.getItem(
+            Key.builder().partitionValue(pseudo).build()
+        ).await()
+        return foundPlayer?.toPlayer()
+    }
+
+    override suspend fun getRank(player: Player): Int {
+        val scan = ScanEnhancedRequest.builder()
+            .filterExpression(
+                Expression.builder()
+                    .expression("pointsNumber > :pointsNumber")
+                    .putExpressionValue(
+                        ":pointsNumber", AttributeValue.builder().n(player.pointsNumber.toString()).build()
+                    ).build()
+            ).build()
+        return buildList {
+            table.scan(scan).asFlow().collect { it.items().stream().forEach { t -> add(t) } }
+        }.size + 1
+    }
+
+    override suspend fun findAll(): List<Player> {
+        return buildList {
+            table.scan().asFlow().collect { it.items().stream().forEach { item -> add(item.toPlayer()) } }
+        }
+    }
+
+
+    override suspend fun deleteAllPlayers() {
+        table.deleteTable()
+        table.createTable().await()
+
+    }
+}
\ No newline at end of file
-- 
GitLab