From 4b8ca5bc0f9c14b9b837e2a6f8d0ba8fa5773a4e Mon Sep 17 00:00:00 2001 From: Johann Pardanaud Date: Tue, 26 Nov 2024 16:12:50 +0100 Subject: [PATCH] wip: ktor --- documentation/images/social-ktor-server.png | Bin 71729 -> 73007 bytes documentation/topics/getting-started.md | 4 +- .../topics/ktor-server-integration.md | 12 +- .../topics/ktor-validation-tutorial.md | 135 +++++++++--------- examples/ktor-server/build.gradle.kts | 1 + .../examples/ktor/server/plugins/Databases.kt | 4 +- .../examples/ktor/server/plugins/Routing.kt | 11 -- .../ktor/server/plugins/Validation.kt | 17 +-- gradle.properties | 8 +- 9 files changed, 91 insertions(+), 101 deletions(-) diff --git a/documentation/images/social-ktor-server.png b/documentation/images/social-ktor-server.png index dff70cc1c612a518315ad41145b420b7ef58c0a4..0665cdff5243f97ce6384ecc4e9cab213ec1c41f 100644 GIT binary patch delta 59241 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

tE5~NegC|$meHR5CC}vT@y=v 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

+|-$1zg)W)lBTDh%iUl9o?KxQ^74N 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 Ta#sR;q0v&)Q!T#z;J^O|csPMY diff --git a/documentation/topics/getting-started.md b/documentation/topics/getting-started.md index fd760d4c..c765c9c6 100644 --- a/documentation/topics/getting-started.md +++ b/documentation/topics/getting-started.md @@ -8,7 +8,7 @@ This article will show you how to install %product% and write your first validat [KSP](https://kotlinlang.org/docs/ksp-overview.html). Follow the installation instructions below, according to your project structure. - + Add KSP to your plugin list; make sure to use the appropriate @@ -33,7 +33,7 @@ dependencies { - + Add KSP to your plugin list; make sure to use the appropriate diff --git a/documentation/topics/ktor-server-integration.md b/documentation/topics/ktor-server-integration.md index c212aa65..10a45dbb 100644 --- a/documentation/topics/ktor-server-integration.md +++ b/documentation/topics/ktor-server-integration.md @@ -21,7 +21,7 @@ automatically validate incoming data. Before using %product% with Ktor, you need to add the following dependency to your Gradle script: - + implementation("dev.nesk.akkurate:akkurate-ktor-server:%version%") @@ -29,10 +29,10 @@ implementation("dev.nesk.akkurate:akkurate-ktor-server:%version%") -The %product% plugin requires the [Content Negociation](https://ktor.io/docs/server-serialization.html) +The %product% plugin requires the [Content Negotiation](https://ktor.io/docs/server-serialization.html) and [Request Validation](https://ktor.io/docs/server-request-validation.html) plugins: - + implementation("io.ktor:ktor-server-content-negotiation:$ktor_version") @@ -92,9 +92,9 @@ curl 127.0.0.1:8080/books \ --data '{"title": ""}' ``` -```text -HTTP/1.1 422 Unprocessable Entity -Content-Type: application/problem+json +```json5 +// HTTP/1.1 422 Unprocessable Entity +// Content-Type: application/problem+json { "status": 422, diff --git a/documentation/topics/ktor-validation-tutorial.md b/documentation/topics/ktor-validation-tutorial.md index 92bd5583..b8d7a881 100644 --- a/documentation/topics/ktor-validation-tutorial.md +++ b/documentation/topics/ktor-validation-tutorial.md @@ -20,14 +20,13 @@ unique ISBN, as well as a valid title. ## Setting up the project You can download a generated Ktor -project [by following this link.](https://start.ktor.io/settings?name=akkuratewithktor&website=com.example&artifact=com.example.akkuratewithktor.akkuratewithktor&kotlinVersion=2.0.10&ktorVersion=2.3.12&buildSystem=GRADLE_KTS&engine=NETTY&configurationIn=HOCON&addSampleCode=false&plugins=routing%2Ckotlinx-serialization%2Ccontent-negotiation%2Cexposed%2Cstatus-pages) -Then click Add plugins | Generate project and, once the project is downloaded, open it in IntelliJ. +project [via Ktor's Project Generator](https://start.ktor.io/settings/?name=akkuratewithktor&website=akkuratewithktor.example.com&artifact=com.example.akkuratewithktor.akkuratewithktor&kotlinVersion=2.0.21&ktorVersion=3.0.1&buildSystem=GRADLE_KTS&buildSystemArgs.version_catalog=true&engine=NETTY&configurationIn=HOCON&addSampleCode=false&plugins=routing%252Ckotlinx-serialization%252Ccontent-negotiation%252Cexposed) +and clicking Download. Once the project is downloaded, open it in IntelliJ. > The following plugins are already preconfigured: > - **Content Negotiation & kotlinx.serialization** to handle JSON payloads; > - **Exposed** to easily read/write to the database; -> - **Routing** to handle the requests; -> - **Status Pages** to return a specific response when an exception is thrown. +> - **Routing** to handle the requests. ## Defining and persisting the data model @@ -120,8 +119,10 @@ fun Application.configureDatabases() { ## Handling the requests -We will need two routes for our HTTP API; `POST /books` to register a new book to the database, and `GET /books` to list -all the books in the database. +We will need two routes for our HTTP API: + +- `POST /books` to store a new book in the database. +- `GET /books` to list all the books in the database. Open the Routing.kt file and copy the following code in the `configureRouting` function: @@ -140,8 +141,8 @@ routing { } ``` -The `POST /books` route deserializes the payload, stores it in the database, and returns a 201 HTTP status code. The -`GET /books` route fetches all the books and serializes them into the response. +The `POST /books` route deserializes the request payload, stores it in the database and returns a 201 HTTP status code. +The `GET /books` route fetches all the books and serializes them into the response. ## What can we improve? @@ -171,8 +172,9 @@ Now list the books: curl 127.0.0.1:8080/books -v ``` -```text -HTTP/1.1 200 OK +```json5 +// HTTP/1.1 200 OK + [ { "isbn": "123 ", @@ -183,7 +185,7 @@ HTTP/1.1 200 OK -We can see two issues in this response; the ISBN is now filled up to the 13 required characters, and we shouldn't allow +We can see two issues in this response: the ISBN is now padded with space to reach 13 characters, and we shouldn't allow empty titles. Try to run the first query again: @@ -212,7 +214,7 @@ Finally, try to create a book with a title over 50 characters: ```shell curl 127.0.0.1:8080/books -v \ --header 'Content-Type: application/json' \ - --data '{"isbn": "1234", "title": "this a really long title and it will not fit our database column"}' + --data '{"isbn": "456", "title": "this a really long title and it will not fit our database column"}' ``` ```text @@ -221,13 +223,12 @@ HTTP/1.1 500 Internal Server Error -Once again, we see another internal error, because our title is composed of 64 characters meanwhile our database column +Once again, we see another internal error, because our title is composed of 64 characters, meanwhile our database column can contain a maximum of 50 characters. ## Validating the requests -All these issues can be fixed by validating the requests. We will use %product% coupled -to [Ktor request validation](https://ktor.io/docs/request-validation.html). +All these issues can be fixed by validating the requests, first we need to set up our validator. ### Enhancing the DAO @@ -236,7 +237,9 @@ by its ISBN: ```kotlin suspend fun existsWithIsbn(isbn: String): Boolean = dbQuery { - Books.select { Books.isbn eq isbn }.singleOrNull() != null + Books.selectAll() + .where { Books.isbn eq isbn } + .singleOrNull() != null } ``` @@ -253,9 +256,14 @@ Then mark the `Book` class with the `@Validate` annotation: ```kotlin @Validate @Serializable -data class Book(/* ... */) +data class Book( + val isbn: String = "", + val title: String = "", +) ``` +{collapsible="true" default-state="collapsed" collapsed-title="@Validate @Serializable data class Book"} + Just like in the [Getting Started guide](getting-started.md), we create a `Validator` instance and add our constraints to it: @@ -298,39 +306,27 @@ There are multiple things to explain here: ## Wiring to Ktor validation -%product% runs the validation and returns a result, but it needs to provide the latter to Ktor in order to generate a -response. This requires [the Request Validation plugin](https://ktor.io/docs/request-validation.html): +%product% provides [a Ktor plugin](ktor-server-integration.md) to automatically validate deserialized payloads: + + + +This plugin also requires [the Request Validation plugin](https://ktor.io/docs/request-validation.html) to be added: ```kotlin -implementation("io.ktor:ktor-server-request-validation") +implementation("io.ktor:ktor-server-request-validation:$ktor_version") ``` -This plugin allows configuring a validation function for a specific class; it will be executed on each deserialization. -A validation result must be returned, we can generate it from %product%'s own result: +Now we must install both plugins and declare what types we want to validate on deserialization: ```kotlin -import dev.nesk.akkurate.ValidationResult.Failure as AkkurateFailure -import dev.nesk.akkurate.ValidationResult.Success as AkkurateSuccess - fun Application.configureValidation() { + install(Akkurate) install(RequestValidation) { - validate { book -> - when (val result = validateBook(bookDao, book)) { - is AkkurateSuccess -> ValidationResult.Valid - is AkkurateFailure -> { - val reasons = result.violations.map { - "${it.path.joinToString(".")}: ${it.message}" - } - ValidationResult.Invalid(reasons) - } - } - } + registerValidator(validateBook) { bookDao } } } ``` -Notice how we execute our `validateBook` function with the provided book, then we map the result to Ktor's result. - We also have to call our `configureValidation` function on application start, this is done in the Application.kt file: @@ -343,20 +339,8 @@ fun Application.module() { } ``` -When the validation fails, the plugin throws a `RequestValidationException`. To handle this exception and return a -proper response, we use [the Status Pages plugin](https://ktor.io/docs/status-pages.html). - -Open the Routing.kt file, navigate to the `configureRouting` function, then the `install(StatusPages) {}` -lambda, and add the following code: - -```kotlin -exception { call, cause -> - call.respond(HttpStatusCode.UnprocessableEntity, cause.reasons) -} -``` - -When the `RequestValidationException` is thrown, the Status Page plugin catches it and returns a response with a 422 -HTTP status code, along with a JSON array of validation messages. +When the validation fails, the server returns a default response, +based [on the RFC 9457 (Problem Details for HTTP APIs).](https://www.rfc-editor.org/rfc/rfc9457.html) ## Conformance checking @@ -372,12 +356,25 @@ curl 127.0.0.1:8080/books -v \ --data '{"isbn": "123", "title": ""}' ``` -```text -HTTP/1.1 422 Unprocessable Entity -[ - "isbn: Must be a valid ISBN (13 digits)", - "title: Must not be blank" -] +```json5 +// HTTP/1.1 422 Unprocessable Entity + +{ + "status": 422, + "fields": [ + { + "message": "Must be a valid ISBN (13 digits)", + "path": "isbn" + }, + { + "message": "Must not be blank", + "path": "title" + } + ], + "type": "https://akkurate.dev/validation-error", + "title": "The payload is invalid", + "detail": "The payload has been successfully parsed, but the server is unable to accept it due to validation errors." +} ``` @@ -391,7 +388,7 @@ Now try to create a book with valid values: ```shell curl 127.0.0.1:8080/books -v \ --header 'Content-Type: application/json' \ - --data '{"isbn": "1234567891234", "title": "The Lord of the Rings"}' + --data '{"isbn": "9780261103207", "title": "The Lord of the Rings"}' ``` ```text @@ -404,11 +401,21 @@ The request is considered valid and we received a 201 HTTP status code. What if we try to create the same book a second time? -```text -HTTP/1.1 422 Unprocessable Entity -[ - "isbn: This ISBN is already registered" -] +```json5 +// HTTP/1.1 422 Unprocessable Entity + +{ + "status": 422, + "fields": [ + { + "message": "This ISBN is already registered", + "path": "isbn" + } + ], + "type": "https://akkurate.dev/validation-error", + "title": "The payload is invalid", + "detail": "The payload has been successfully parsed, but the server is unable to accept it due to validation errors." +} ``` As expected, we can't register the same ISBN twice. diff --git a/examples/ktor-server/build.gradle.kts b/examples/ktor-server/build.gradle.kts index ff79c29f..ed2f3e0a 100755 --- a/examples/ktor-server/build.gradle.kts +++ b/examples/ktor-server/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(project(":akkurate-core")) implementation(project(":akkurate-ksp-plugin")) + implementation(project(":akkurate-ktor-server")) ksp(project(":akkurate-ksp-plugin")) implementation("io.ktor:ktor-server-request-validation:$ktor_version") } diff --git a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Databases.kt b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Databases.kt index a3e59994..bf09a52e 100755 --- a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Databases.kt +++ b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Databases.kt @@ -78,6 +78,8 @@ class BookDao(database: Database) { } suspend fun existsWithIsbn(isbn: String): Boolean = dbQuery { - Books.select { Books.isbn eq isbn }.singleOrNull() != null + Books.selectAll() + .where { Books.isbn eq isbn } + .singleOrNull() != null } } diff --git a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Routing.kt b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Routing.kt index ce078efa..0f751581 100755 --- a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Routing.kt +++ b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Routing.kt @@ -19,22 +19,11 @@ package dev.nesk.akkurate.examples.ktor.server.plugins import io.ktor.http.* import io.ktor.server.application.* -import io.ktor.server.plugins.requestvalidation.* -import io.ktor.server.plugins.statuspages.* import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* fun Application.configureRouting() { - install(StatusPages) { - exception { call, cause -> - call.respondText(text = "500: $cause", status = HttpStatusCode.InternalServerError) - } - exception { call, cause -> - call.respond(HttpStatusCode.UnprocessableEntity, cause.reasons) - } - } - routing { post("/books") { val book = call.receive() diff --git a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Validation.kt b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Validation.kt index a11171b9..9c0aa48e 100644 --- a/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Validation.kt +++ b/examples/ktor-server/src/main/kotlin/dev/nesk/akkurate/examples/ktor/server/plugins/Validation.kt @@ -25,24 +25,15 @@ import dev.nesk.akkurate.constraints.constrain import dev.nesk.akkurate.constraints.otherwise import dev.nesk.akkurate.examples.ktor.server.plugins.validation.accessors.isbn import dev.nesk.akkurate.examples.ktor.server.plugins.validation.accessors.title +import dev.nesk.akkurate.ktor.server.Akkurate +import dev.nesk.akkurate.ktor.server.registerValidator import io.ktor.server.application.* import io.ktor.server.plugins.requestvalidation.* -import dev.nesk.akkurate.ValidationResult.Failure as AkkurateFailure -import dev.nesk.akkurate.ValidationResult.Success as AkkurateSuccess fun Application.configureValidation() { + install(Akkurate) install(RequestValidation) { - validate { book -> - when (val result = validateBook(bookDao, book)) { - is AkkurateSuccess -> ValidationResult.Valid - is AkkurateFailure -> { - val reasons = result.violations.map { - "${it.path.joinToString(".")}: ${it.message}" - } - ValidationResult.Invalid(reasons) - } - } - } + registerValidator(validateBook) { bookDao } } } diff --git a/gradle.properties b/gradle.properties index b5d05d26..0d2dfb50 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx4g kotlin.code.style=official kotlin_version=1.9.10 -ktor_version=2.3.5 -logback_version=1.3.11 -exposed_version=0.41.1 -h2_version=2.1.214 +ktor_version=3.0.1 +logback_version=1.4.14 +exposed_version=0.56.0 +h2_version=2.3.232