Piszę aplikację (przy okazji uczę się) z wykorzystaniem Kotlin'a i Ktor'a. Sam Ktor póki co jak najbardziej na plus ale obsługa requestów w taki sposób:
https://ktor.io/servers/features/routing.html#routing-tree
dla mnie jest kompletnie nieczytelna kiedy endpointów jest już sporo i są bardziej rozbudowane. Podzieliłem więc endpointy na kilka metod (np.: fun Route.accountEndpoints() {}
) i dodałem fasady po stronie której wykonuję walidację, logikę itp a po stronie routingu Ktor'a parsuje jedynie request i zwracam wyniki. Wygląda lepiej ale kiedy np. chcę zarejestrować nowe konto muszę sprawdzić czy 1. adres email jest unikatowy, 2. pola są poprawnie wypełnione. Fasada próbuje zarejestrować konto ale jak się to nie uda leci wyjątek który po stronie routingu trzeba obsłużyć:
route("/accounts") {
post {
val accountCmd = call.receive<AccountCmd>()
try {
call.respond(HttpStatusCode.Created, facade.save(accountCmd))
} catch (ex: AccountAlreadyExistExceptions) {
call.respond(HttpStatusCode.Conflict, ex)
}
}
To działa ale wygląda słabo tym bardziej że tych case'ów kiedy lecą różne wyjątki może być wiele i później będzie jakieś dziwne drzewo try catchów.
Ma ktoś pomysł jak to rozwiązać? Może w ogóle źle do tego podszedłem? Trochę sam kombinuje bo nie mogę znaleźć na necie żadnego dobrego przykładu dla Ktor'a. Szczególnie wołam @jarekr000000 i @Bambo bo wiem że mogą coś wiedzieć na jego temat.