38 lines
980 B
Swift
38 lines
980 B
Swift
import ApiController
|
|
import ManualDCore
|
|
import Vapor
|
|
|
|
extension ApiController {
|
|
|
|
func respond(_ route: SiteRoute.Api, request: Vapor.Request) async throws
|
|
-> any AsyncResponseEncodable
|
|
{
|
|
guard let encodable = try await json(.init(route: route, logger: request.logger)) else {
|
|
return HTTPStatus.ok
|
|
}
|
|
return AnyJSONResponse(value: encodable)
|
|
}
|
|
}
|
|
|
|
struct AnyJSONResponse: AsyncResponseEncodable {
|
|
public var headers: HTTPHeaders = ["Content-Type": "application/json"]
|
|
let value: any Encodable
|
|
|
|
init(additionalHeaders: HTTPHeaders = [:], value: any Encodable) {
|
|
if additionalHeaders.contains(name: .contentType) {
|
|
self.headers = additionalHeaders
|
|
} else {
|
|
headers.add(contentsOf: additionalHeaders)
|
|
}
|
|
self.value = value
|
|
}
|
|
|
|
func encodeResponse(for request: Request) async throws -> Response {
|
|
try Response(
|
|
status: .ok,
|
|
headers: headers,
|
|
body: .init(data: JSONEncoder().encode(value))
|
|
)
|
|
}
|
|
}
|