diff --git a/api/src/main/kotlin/Main.kt b/api/src/main/kotlin/Main.kt index 0a97ae3..878cae0 100644 --- a/api/src/main/kotlin/Main.kt +++ b/api/src/main/kotlin/Main.kt @@ -2,6 +2,7 @@ package com.jaytux.simd import com.jaytux.simd.data.Database import com.jaytux.simd.data.Loader +import com.jaytux.simd.server.configureFallback import com.jaytux.simd.server.configureHTTP import com.jaytux.simd.server.configureRouting import com.jaytux.simd.server.configureSerialization @@ -50,4 +51,6 @@ fun Application.module() { configureSerialization() configureHTTP() configureRouting() + + configureFallback() } \ No newline at end of file diff --git a/api/src/main/kotlin/server/Endpoints.kt b/api/src/main/kotlin/server/Endpoints.kt index 772da00..9e6816e 100644 --- a/api/src/main/kotlin/server/Endpoints.kt +++ b/api/src/main/kotlin/server/Endpoints.kt @@ -85,8 +85,14 @@ fun Routing.installDetails() { get("/details/{id}") { runCatching { transaction { - val id = call.parameters["id"]?.let { UUID.fromString(it) } - ?: throw HttpError("Missing or invalid ID") + val id = call.parameters["id"]?.let { + try { + UUID.fromString(it) + } + catch(e: IllegalArgumentException) { + throw HttpError("Invalid UUID: $it") + } + } ?: throw HttpError("Missing or invalid ID") val intrinsic = Intrinsic.findById(id) ?: throw HttpError("Unknown intrinsic: $id") diff --git a/api/src/main/kotlin/server/Routing.kt b/api/src/main/kotlin/server/Routing.kt index b6af330..15925c4 100644 --- a/api/src/main/kotlin/server/Routing.kt +++ b/api/src/main/kotlin/server/Routing.kt @@ -4,6 +4,7 @@ import com.jaytux.simd.data.* import io.ktor.http.* import io.ktor.server.application.* import io.ktor.server.plugins.autohead.* +import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* import kotlinx.serialization.Serializable @@ -63,4 +64,14 @@ fun Application.configureRouting() { installSearch() installDetails() } +} + +fun Application.configureFallback() { + routing { + route("{...}") { + handle { + call.respond(HttpStatusCode.NotFound, ErrorResponse("Endpoint not found: ${call.request.httpMethod.value} ${call.request.path()}")) + } + } + } } \ No newline at end of file diff --git a/api/src/main/kotlin/server/Serialization.kt b/api/src/main/kotlin/server/Serialization.kt index 56e7987..985731b 100644 --- a/api/src/main/kotlin/server/Serialization.kt +++ b/api/src/main/kotlin/server/Serialization.kt @@ -22,7 +22,10 @@ fun Application.configureSerialization() { object UUIDSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING) - override fun deserialize(decoder: Decoder): UUID = UUID.fromString(decoder.decodeString()) + override fun deserialize(decoder: Decoder): UUID = try { UUID.fromString(decoder.decodeString()) } + catch (e: IllegalArgumentException) { + throw HttpError("Invalid UUID format") + } override fun serialize(encoder: Encoder, value: UUID) = encoder.encodeString(value.toString()) } \ No newline at end of file