Skip to content
Snippets Groups Projects
Commit 1e7638f6 authored by Clément CORNU's avatar Clément CORNU
Browse files

feat: declare interface of repository

parent 541551a5
No related branches found
No related tags found
No related merge requests found
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()) }
}
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 findAll(): List<Player> {
return buildList {
table.scan().asFlow().collect { it.items().stream().forEach { item -> add(item.toPlayer()) } }
}
}
suspend fun getRank(player: Player): Int
suspend fun findAll(): List<Player>
suspend fun deleteAllPlayers() {
table.deleteTable()
table.createTable().await()
}
suspend fun deleteAllPlayers()
}
\ No newline at end of file
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment