diff --git a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/TbdexHttpServer.kt b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/TbdexHttpServer.kt index dc4dcccd..119dc811 100644 --- a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/TbdexHttpServer.kt +++ b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/TbdexHttpServer.kt @@ -24,7 +24,7 @@ import tbdex.sdk.httpserver.models.OfferingsApi import tbdex.sdk.httpserver.models.SubmitCallback import tbdex.sdk.protocol.models.MessageKind import tbdex.sdk.protocol.models.Offering -import tbdex.server.tbdex.sdk.httpserver.handlers.submitRfq +import tbdex.sdk.httpserver.handlers.submitRfq fun main() { val serverConfig = TbdexHttpServerConfig( diff --git a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/handlers/SubmitRfq.kt b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/handlers/SubmitRfq.kt index 11878963..ef525e3e 100644 --- a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/handlers/SubmitRfq.kt +++ b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/handlers/SubmitRfq.kt @@ -1,10 +1,11 @@ -package tbdex.server.tbdex.sdk.httpserver.handlers +package tbdex.sdk.httpserver.handlers import io.ktor.http.HttpStatusCode import io.ktor.server.application.ApplicationCall import io.ktor.server.request.receiveText import io.ktor.server.response.respond import tbdex.sdk.httpclient.models.ErrorDetail +import tbdex.sdk.httpserver.models.CallbackError import tbdex.sdk.httpserver.models.ExchangesApi import tbdex.sdk.httpserver.models.OfferingsApi import tbdex.sdk.httpserver.models.SubmitCallback @@ -12,22 +13,64 @@ import tbdex.sdk.protocol.models.Message import tbdex.sdk.protocol.models.MessageKind import tbdex.sdk.protocol.models.Rfq -// validate the message and then invoke submitCallback + +// todo: decide on the correct error response format suspend fun submitRfq( call: ApplicationCall, offeringsApi: OfferingsApi, exchangesApi: ExchangesApi, callback: SubmitCallback? ) { + val message: Rfq? + try { - val message = Message.parse(call.receiveText()) as Rfq - val offering = offeringsApi.getOffering(message.data.offeringId.toString()) + message = Message.parse(call.receiveText()) as Rfq + } catch (e: Exception) { + val errorResponse = ErrorDetail(detail = "Parsing of TBDex message failed: ${e.message}") + call.respond(HttpStatusCode.BadRequest, errorResponse) + return + } - callback?.invoke(call, MessageKind.rfq, offering) - call.respond(HttpStatusCode.Accepted) + val existingRfq = exchangesApi.getRfq(message.metadata.exchangeId.toString()) + if (existingRfq != null) { + val errorResponse = ErrorDetail(detail = "RFQ already exists.") + call.respond(HttpStatusCode.Conflict, errorResponse) + return + } + + val offering = offeringsApi.getOffering(message.data.offeringId.toString()) + if (offering == null) { + val errorResponse = ErrorDetail(detail = "Offering with id ${message.data.offeringId} does not exist.") + call.respond(HttpStatusCode.BadRequest, errorResponse) + return + } + try { + message.verifyOfferingRequirements(offering) } catch (e: Exception) { - val errorResponse = ErrorDetail(detail = "Parsing of TBDex message failed: ${e.message}") + val errorResponse = ErrorDetail(detail = "Failed to verify offering requirements: ${e.message}") call.respond(HttpStatusCode.BadRequest, errorResponse) + return + } + + if (callback == null) { + call.respond(HttpStatusCode.Accepted) + return } + + try { + callback.invoke(call, MessageKind.rfq, offering) + } catch (e: Exception) { + if (e is CallbackError) { + // todo: e.details is a list of ErrorDetail. do we want to include all the errordetails? + call.respond(e.statusCode, e.details!!.first()) + return + } else { + val errorResponse = ErrorDetail(detail = "umm idk") + call.respond(HttpStatusCode.InternalServerError, errorResponse) + return + } + } + + call.respond(HttpStatusCode.Accepted) } \ No newline at end of file diff --git a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/models/Callback.kt b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/models/Callback.kt index d87bd977..b1406151 100644 --- a/httpserver/src/main/kotlin/tbdex/sdk/httpserver/models/Callback.kt +++ b/httpserver/src/main/kotlin/tbdex/sdk/httpserver/models/Callback.kt @@ -6,9 +6,6 @@ import tbdex.sdk.httpclient.models.ErrorDetail import tbdex.sdk.protocol.models.MessageKind import tbdex.sdk.protocol.models.Offering -//typealias GetCallback = (RequestContext, Filters[T]) -> Any -//typealias SubmitCallback = (RequestContext, MessageKindClasses[T], SubmitCallbackOpts[O]) -> Unit - typealias GetCallback = (ApplicationCall, Filter) -> Any typealias SubmitCallback = (ApplicationCall, MessageKind, Offering?) -> Unit @@ -19,7 +16,8 @@ class GetOfferingsFilter( ) : Filter class GetExchangesFilter( - val exchangeIds: List + val exchangeIds: List, + val from: String ) : Filter sealed interface Filter diff --git a/tbdex b/tbdex index 1329531f..50bef4bb 160000 --- a/tbdex +++ b/tbdex @@ -1 +1 @@ -Subproject commit 1329531f24b7444fee5e493dacfc5413bbeeda3e +Subproject commit 50bef4bbb955d8c9c0b3933a8e76818affec610c