From 5c423d4762152a162b02c7e588305f56142df0f4 Mon Sep 17 00:00:00 2001
From: ccornu <ccornu@takima.fr>
Date: Tue, 11 Feb 2025 16:59:47 +0100
Subject: [PATCH] feat: better exception handling

---
 .../configuration/ExceptionConfiguration.kt   | 31 ++++++++++++++-----
 .../configuration/SecurityConfiguration.kt    |  7 -----
 2 files changed, 23 insertions(+), 15 deletions(-)
 delete mode 100644 src/main/kotlin/configuration/SecurityConfiguration.kt

diff --git a/src/main/kotlin/configuration/ExceptionConfiguration.kt b/src/main/kotlin/configuration/ExceptionConfiguration.kt
index 6f00bf5..7c6ad94 100644
--- a/src/main/kotlin/configuration/ExceptionConfiguration.kt
+++ b/src/main/kotlin/configuration/ExceptionConfiguration.kt
@@ -6,25 +6,40 @@ import io.ktor.server.application.*
 import io.ktor.server.plugins.*
 import io.ktor.server.plugins.statuspages.*
 import io.ktor.server.response.*
+import kotlinx.serialization.Serializable
 import software.amazon.awssdk.services.dynamodb.model.DynamoDbException
 
 private const val SOMETHING_WENT_WRONG = "Something went wrong"
+private const val RESOURCE_NOT_FOUND = "Resource not found"
+
+@Serializable
+data class ErrorResponse(
+    val message: String,
+    val statusCode: Int,
+)
 
 fun Application.configureExceptionHandling() {
     install(StatusPages) {
         exception<Throwable> { call, cause ->
-            when (cause) {
-                is NotFoundException -> call.respond(HttpStatusCode.NotFound, cause.message ?: SOMETHING_WENT_WRONG)
-                is DynamoDbException -> call.respond(
-                    HttpStatusCode.InternalServerError,
-                    cause.message ?: "$SOMETHING_WENT_WRONG with DynamoDb"
+            val (errorStatusCode, errorResponse) = when (cause) {
+                is NotFoundException -> HttpStatusCode.NotFound to ErrorResponse(
+                    message = cause.message ?: RESOURCE_NOT_FOUND,
+                    statusCode = HttpStatusCode.NotFound.value
+                )
+
+                is DynamoDbException -> HttpStatusCode.ServiceUnavailable to ErrorResponse(
+                    message = cause.message ?: "$SOMETHING_WENT_WRONG with DynamoDb",
+                    statusCode = HttpStatusCode.ServiceUnavailable.value,
                 )
 
-                is AlreadyExistingPlayerException -> call.respond(
-                    HttpStatusCode.BadRequest,
-                    cause.message ?: SOMETHING_WENT_WRONG
+                is AlreadyExistingPlayerException -> HttpStatusCode.BadRequest to ErrorResponse(
+                    message = cause.message ?: SOMETHING_WENT_WRONG,
+                    statusCode = HttpStatusCode.BadRequest.value,
                 )
+
+                else -> throw cause
             }
+            call.respond(errorStatusCode, errorResponse)
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/configuration/SecurityConfiguration.kt b/src/main/kotlin/configuration/SecurityConfiguration.kt
deleted file mode 100644
index a3f508e..0000000
--- a/src/main/kotlin/configuration/SecurityConfiguration.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package betclic.test.configuration
-
-import io.ktor.server.application.*
-
-fun Application.configureSecurity() {
-    //TODO Add comment to say what I would do in term of security
-}
-- 
GitLab