Skip to content

Commit 1ae1d4d

Browse files
committed
fix custom routes
1 parent 3a49f47 commit 1ae1d4d

File tree

7 files changed

+57
-29
lines changed

7 files changed

+57
-29
lines changed

Examples/quoteapi/Sources/QuoteAPI/QuoteService.swift

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
//===----------------------------------------------------------------------===//
1515

1616
import Foundation
17-
import HTTPTypes
1817
import Logging
1918
import OpenAPIRuntime
2019
import OpenAPILambda
@@ -25,18 +24,16 @@ struct QuoteServiceImpl: APIProtocol, OpenAPILambdaHttpApi {
2524

2625
let logger: Logger
2726

28-
func register(transport: OpenAPILambdaTransport) throws {
29-
30-
31-
let loggingMiddleware = LoggingMiddleware(logger: logger)
32-
try self.registerHandlers(on: transport, middlewares: [loggingMiddleware])
33-
27+
func register(transport: OpenAPILambdaTransport, middlewares: [ServerMiddleware]) throws {
3428
// you have a chance here to customize the routes, for example
3529
try transport.router.get("/health") { _, _ in
3630
"OK"
3731
}
3832

39-
print(transport.router)
33+
let loggingMiddleware = LoggingMiddleware(logger: logger)
34+
try self.registerHandlers(on: transport, middlewares: middlewares + [loggingMiddleware])
35+
36+
logger.trace("Available Routes\n\(transport.router)") // print the router tree (for debugging purposes)
4037
}
4138

4239
static func main() async throws {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"rawQueryString": "",
3+
"headers": {
4+
"host": "b2k1t8fon7.execute-api.us-east-1.amazonaws.com",
5+
"x-forwarded-port": "443",
6+
"content-length": "0",
7+
"x-amzn-trace-id": "Root=1-6571d134-63dbe8ee21efa87555d59265",
8+
"x-forwarded-for": "191.95.148.219",
9+
"x-forwarded-proto": "https",
10+
"accept": "*/*",
11+
"user-agent": "curl/8.1.2"
12+
},
13+
"requestContext": {
14+
"apiId": "b2k1t8fon7",
15+
"http": {
16+
"sourceIp": "191.95.148.219",
17+
"userAgent": "curl/8.1.2",
18+
"method": "GET",
19+
"path": "/health",
20+
"protocol": "HTTP/1.1"
21+
},
22+
"timeEpoch": 1701957940365,
23+
"domainPrefix": "b2k1t8fon7",
24+
"accountId": "486652066693",
25+
"time": "07/Dec/2023:14:05:40 +0000",
26+
"stage": "$default",
27+
"domainName": "b2k1t8fon7.execute-api.us-east-1.amazonaws.com",
28+
"requestId": "Pk2gOia2IAMEPOw="
29+
},
30+
"isBase64Encoded": false,
31+
"version": "2.0",
32+
"routeKey": "$default",
33+
"rawPath": "/health"
34+
}

Sources/OpenAPILambdaHandler.swift

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import HTTPTypes
2020
/// Specialization of LambdaHandler which runs an OpenAPILambda
2121
public struct OpenAPILambdaHandler<OALS: OpenAPILambdaService>: LambdaHandler, Sendable {
2222

23-
private let router: OpenAPILambdaRouter
2423
private let transport: OpenAPILambdaTransport
2524
private let openAPIService: OALS
2625

@@ -38,11 +37,9 @@ public struct OpenAPILambdaHandler<OALS: OpenAPILambdaService>: LambdaHandler, S
3837
/// - Parameters
3938
/// - withService: The OpenAPI Lambda service to bind to this Lambda handler function
4039
public init(withService openAPILambdaService: OALS) throws {
41-
self.router = TrieRouter()
42-
self.transport = OpenAPILambdaTransport(router: self.router)
43-
4440
self.openAPIService = openAPILambdaService
45-
try self.openAPIService.register(transport: self.transport)
41+
self.transport = OpenAPILambdaTransport(router: TrieRouter())
42+
try self.openAPIService.register(transport: self.transport, middlewares: [])
4643
}
4744

4845
/// The Lambda handling method.
@@ -63,7 +60,7 @@ public struct OpenAPILambdaHandler<OALS: OpenAPILambdaService>: LambdaHandler, S
6360
let request = try openAPIService.request(context: context, from: event)
6461

6562
// route the request to find the handlers and extract the paramaters
66-
let (handler, parameters) = try router.route(method: request.0.method, path: request.0.path!)
63+
let (handler, parameters) = try self.transport.router.route(method: request.0.method, path: request.0.path!)
6764

6865
// call the request handler (and extract the HTTPRequest and HTTPBody)
6966
let httpRequest = request.0
@@ -91,10 +88,10 @@ public struct OpenAPILambdaHandler<OALS: OpenAPILambdaService>: LambdaHandler, S
9188
lambdaResponse = (HTTPResponse(status: .notFound), "There is no route registered for the method \(method)")
9289

9390
}
94-
catch OpenAPILambdaRouterError.noRouteForPath(let path) {
91+
catch OpenAPILambdaRouterError.noRouteForPath(let method, let path) {
9592

9693
// There is no hadler registered for this path. This is a programming error.
97-
lambdaResponse = (HTTPResponse(status: .notFound), "There is no route registered for the path \(path)")
94+
lambdaResponse = (HTTPResponse(status: .notFound), "There is no route registered for the path \(method) \(path)")
9895

9996
}
10097
catch OpenAPILambdaHttpError.invalidMethod(let method) {

Sources/OpenAPILambdaService.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public protocol OpenAPILambdaService: Sendable {
2727
/// Injects the transport.
2828
///
2929
/// This is where your OpenAPILambdaService implementation must register the transport
30-
func register(transport: OpenAPILambdaTransport, middleware: [ServerMiddleware]) throws
30+
func register(transport: OpenAPILambdaTransport, middlewares: [ServerMiddleware]) throws
3131

3232
/// Convert from `Event` type to `OpenAPILambdaRequest`
3333
/// - Parameters:
@@ -55,13 +55,13 @@ extension OpenAPILambdaService {
5555
}
5656
}
5757

58-
extension OpenAPILambdaService {
58+
// extension OpenAPILambdaService {
5959

60-
/// Injects the transport.
61-
/// This is a convenience method that provides an empty middleware list by default
62-
///
63-
/// This is where your OpenAPILambdaService implementation must register the transport
64-
public func register(transport: OpenAPILambdaTransport, middleware: [ServerMiddleware] = []) throws {
65-
try register(transport: transport, middleware: middleware)
66-
}
67-
}
60+
// /// Injects the transport.
61+
// /// This is a convenience method that provides an empty middleware list by default
62+
// ///
63+
// /// This is where your OpenAPILambdaService implementation must register the transport
64+
// public func register(transport: OpenAPILambdaTransport, middleware: [ServerMiddleware] = []) throws {
65+
// try register(transport: transport, middleware: middleware)
66+
// }
67+
// }

Sources/Router/OpenAPILambdaRouter+SimplifiedAPI.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ extension OpenAPILambdaRouter {
4949
_ path: String,
5050
handler: @escaping @Sendable (HTTPRequest, HTTPBody?) async throws -> String
5151
) throws {
52-
try generic(method: .post, path: path, handler: handler)
52+
try generic(method: .get, path: path, handler: handler)
5353
}
5454

5555
/// Adds a POST route to the router for the given path.

Sources/Router/OpenAPILambdaRouter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import HTTPTypes
1818

1919
/// Errors returned by the router
2020
public enum OpenAPILambdaRouterError: Error {
21-
case noRouteForPath(String)
21+
case noRouteForPath(HTTPRequest.Method, String)
2222
case noHandlerForPath(String)
2323
case noRouteForMethod(HTTPRequest.Method)
2424
}

Sources/Router/OpenAPILambdaRouterTrie.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ struct URIPath: URIPathCollection {
163163
currentNode = child
164164
}
165165
else {
166-
throw OpenAPILambdaRouterError.noRouteForPath(path)
166+
throw OpenAPILambdaRouterError.noRouteForPath(method, path)
167167
}
168168
}
169169
}

0 commit comments

Comments
 (0)