From 97346e96f636efc4c508af4c837436feaaa2f5e6 Mon Sep 17 00:00:00 2001
From: ccornu <ccornu@takima.fr>
Date: Tue, 11 Feb 2025 16:36:03 +0100
Subject: [PATCH] feat: improve routes + use env variables for DynamoDB

---
 .../configuration/DynamoDbConfiguration.kt    | 12 ++++------
 .../configuration/ExceptionConfiguration.kt   |  1 -
 .../exceptions/AlreadyExistingException.kt    |  2 +-
 src/main/kotlin/player/routes/PlayerRoute.kt  | 24 +++++++------------
 4 files changed, 14 insertions(+), 25 deletions(-)

diff --git a/src/main/kotlin/configuration/DynamoDbConfiguration.kt b/src/main/kotlin/configuration/DynamoDbConfiguration.kt
index 2ebb6fb..0b8963a 100644
--- a/src/main/kotlin/configuration/DynamoDbConfiguration.kt
+++ b/src/main/kotlin/configuration/DynamoDbConfiguration.kt
@@ -1,24 +1,20 @@
 package betclic.test.configuration
 
+import io.ktor.server.config.*
 import org.slf4j.LoggerFactory
 import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient
 import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient
 import java.net.URI
-import software.amazon.awssdk.regions.Region
-import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
 
 class DynamoDbConfiguration {
     private val logger = LoggerFactory.getLogger(DynamoDbConfiguration::class.java)
 
     fun createDynamoDbClient(): DynamoDbAsyncClient {
+        val url = ApplicationConfig("application.yaml").property("ktor.database.dynamodbUrl").getString()
         return DynamoDbAsyncClient.builder()
-            .endpointOverride(URI("http://localhost:8000"))
-            .region(Region.US_EAST_1)
-            .credentialsProvider(
-                StaticCredentialsProvider.create(AwsBasicCredentials.create("dummy", "dummy"))
-            )
+            .endpointOverride(URI(url))
             .build()
+
     }
 
     fun createDataSource(dynamoDbAsyncClient: DynamoDbAsyncClient): DynamoDbEnhancedAsyncClient {
diff --git a/src/main/kotlin/configuration/ExceptionConfiguration.kt b/src/main/kotlin/configuration/ExceptionConfiguration.kt
index c2a6274..6f00bf5 100644
--- a/src/main/kotlin/configuration/ExceptionConfiguration.kt
+++ b/src/main/kotlin/configuration/ExceptionConfiguration.kt
@@ -25,7 +25,6 @@ fun Application.configureExceptionHandling() {
                     cause.message ?: SOMETHING_WENT_WRONG
                 )
             }
-            call.respondText(text = "500: $cause", status = HttpStatusCode.InternalServerError)
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/player/exceptions/AlreadyExistingException.kt b/src/main/kotlin/player/exceptions/AlreadyExistingException.kt
index f08bc6f..4deded5 100644
--- a/src/main/kotlin/player/exceptions/AlreadyExistingException.kt
+++ b/src/main/kotlin/player/exceptions/AlreadyExistingException.kt
@@ -1,4 +1,4 @@
 package betclic.test.player.exceptions
 
 class AlreadyExistingPlayerException(val pseudo: String) :
-    Exception("$pseudo already exists. You still can update this player points")
\ No newline at end of file
+    RuntimeException("$pseudo already exists. You still can update this player points")
\ No newline at end of file
diff --git a/src/main/kotlin/player/routes/PlayerRoute.kt b/src/main/kotlin/player/routes/PlayerRoute.kt
index bdb8158..fc4c201 100644
--- a/src/main/kotlin/player/routes/PlayerRoute.kt
+++ b/src/main/kotlin/player/routes/PlayerRoute.kt
@@ -3,7 +3,6 @@ package betclic.test.player.routes
 import betclic.test.player.dtos.PlayerCreationDTO
 import betclic.test.player.dtos.PlayerInfoDTO
 import betclic.test.player.dtos.PlayerUpdateDTO
-import betclic.test.player.entities.Player
 import betclic.test.player.services.PlayerService
 import io.ktor.http.*
 import io.ktor.server.application.*
@@ -12,10 +11,15 @@ import io.ktor.server.response.*
 import io.ktor.server.routing.*
 import org.koin.ktor.ext.inject
 
+private const val PLAYERS = "/players"
+
 fun Routing.playerRoutes() {
     val playerService by inject<PlayerService>()
-    // const
-    route("/players") {
+    route(PLAYERS) {
+        get {
+            val pseudo = call.request.queryParameters["pseudo"] ?: return@get call.respond(HttpStatusCode.BadRequest)
+            call.respond<PlayerInfoDTO>(HttpStatusCode.OK, playerService.getPlayerInfoByPseudo(pseudo))
+        }
         post {
             val request = call.receive<PlayerCreationDTO>()
             call.respond(HttpStatusCode.Created, playerService.createNewPlayer(request))
@@ -26,23 +30,13 @@ fun Routing.playerRoutes() {
             call.respond(HttpStatusCode.OK, playerService.updatePlayer(request))
         }
 
-        get("/{pseudo}") {
-            val pseudo = call.parameters["pseudo"] ?: return@get call.respond(HttpStatusCode.BadRequest)
-            call.respond<Player>(playerService.findPlayerByPseudo(pseudo))
-        }
-
-        get("/{pseudo}/info") {
-            val pseudo = call.parameters["pseudo"] ?: return@get call.respond(HttpStatusCode.BadRequest)
-            call.respond<PlayerInfoDTO>(playerService.getPlayerInfoByPseudo(pseudo))
-        }
-
         get("/ranking") {
-            call.respond(playerService.getPlayersRanked())
+            call.respond(HttpStatusCode.OK, playerService.getPlayersRanked())
         }
 
         delete {
             playerService.deleteAllPlayers()
-            call.respond(HttpStatusCode.NoContent)
+            call.respond(HttpStatusCode.NoContent) // code de retours partout
         }
 
     }
-- 
GitLab