diff --git a/src/main/kotlin/configuration/InjectionConfiguration.kt b/src/main/kotlin/configuration/InjectionConfiguration.kt index 5d3230f189171670234d43d955881a7d29fad251..57d0f079adc670ebb33dcba53dbe8e5d79f24c52 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 f5b8ef2a2656e87b7cff8bd5bacfb7648adc3b19..4d19b9c750baffae5e8a29c2afc2a3336615355e 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 0000000000000000000000000000000000000000..4e273e43a9b08c4a15c5fac66062d5bbef125c1a --- /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