Skip to content

Commit 71166f8

Browse files
authored
Use bearer token (#12)
1 parent e105a93 commit 71166f8

File tree

3 files changed

+28
-29
lines changed

3 files changed

+28
-29
lines changed

Sources/Grodt/Application/routes.swift

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,35 +49,33 @@ func routes(_ app: Application) async throws {
4949
app.middleware.use(app.sessions.middleware)
5050
app.middleware.use(globalRateLimiter)
5151

52-
try app.group("") { routeBuilder in
53-
try routeBuilder
54-
.grouped(loginRateLimiter)
55-
.register(collection: UserController(dtoMapper: loginResponseDTOMapper))
56-
}
57-
5852
let tokenAuthMiddleware = UserToken.authenticator()
5953
let guardAuthMiddleware = User.guardMiddleware()
6054

61-
let protected = app.grouped([tokenAuthMiddleware, guardAuthMiddleware])
62-
try protected.group("api") { routeBuilder in
63-
try routeBuilder.register(collection:
64-
PortfoliosController(
65-
portfolioRepository: PostgresPortfolioRepository(database: app.db),
66-
currencyRepository: PostgresCurrencyRepository(database: app.db),
67-
historicalPortfolioPerformanceUpdater: portfolioPerformanceUpdater,
68-
dataMapper: portfolioDTOMapper)
55+
try app.group("api") { api in
56+
// Public routes
57+
try api
58+
.grouped(loginRateLimiter)
59+
.register(collection: UserController(dtoMapper: loginResponseDTOMapper))
60+
61+
// Protected routes
62+
let protected = api.grouped([tokenAuthMiddleware, guardAuthMiddleware])
63+
try protected.register(collection:
64+
PortfoliosController(
65+
portfolioRepository: PostgresPortfolioRepository(database: app.db),
66+
currencyRepository: PostgresCurrencyRepository(database: app.db),
67+
historicalPortfolioPerformanceUpdater: portfolioPerformanceUpdater,
68+
dataMapper: portfolioDTOMapper)
6969
)
7070

7171
let transactionController = TransactionsController(transactionsRepository: PostgresTransactionRepository(database: app.db),
72-
currencyRepository: PostgresCurrencyRepository(database: app.db),
73-
dataMapper: transactionDTOMapper)
74-
72+
currencyRepository: PostgresCurrencyRepository(database: app.db),
73+
dataMapper: transactionDTOMapper)
7574
transactionController.delegate = transactionChangedHandler
76-
try routeBuilder.register(collection: transactionController)
77-
78-
try routeBuilder.register(collection: tickersController)
79-
try routeBuilder.register(collection: investmentsController)
80-
try routeBuilder.register(collection: accountController)
75+
try protected.register(collection: transactionController)
76+
try protected.register(collection: tickersController)
77+
try protected.register(collection: investmentsController)
78+
try protected.register(collection: accountController)
8179
}
8280

8381
if app.environment != .testing {

Sources/Grodt/Controllers/UserController.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ struct UserController: RouteCollection {
1010

1111
func boot(routes: Vapor.RoutesBuilder) throws {
1212
let passwordProtected = routes.grouped(User.authenticator())
13-
passwordProtected.post("login") { req async throws -> LoginResponseDTO in
13+
passwordProtected.post("login") { req async throws -> Response in
1414
let user = try req.auth.require(User.self)
1515
let token = try user.generateToken()
1616
try await token.save(on: req.db)
17-
return dtoMapper.response(from: token)
17+
18+
let response = Response(status: .ok)
19+
response.headers.add(name: .authorization, value: "Bearer \(token.value)")
20+
21+
return response
1822
}
1923
}
2024
}
21-
22-
extension LoginResponseDTO: Content { }

Tests/GrodtTests/GrodtTestCase.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,8 @@ class GrodtControllerTestCase: GrodtTestCase {
6363
}
6464

6565
private func authHeader() async throws -> (String, String) {
66-
let login = try await app.sendRequest(.POST, "login", headers: HTTPHeaders([AuthorizationHeader.basic(email: user.email, password: "password").value]))
67-
let response = try login.content.decode(LoginResponseDTO.self)
68-
return AuthorizationHeader.bearer(token: response.value).value
66+
let login = try await app.sendRequest(.POST, "api/login", headers: HTTPHeaders([AuthorizationHeader.basic(email: user.email, password: "password").value]))
67+
return AuthorizationHeader.bearer(token: login.headers.bearerAuthorization!.token).value
6968
}
7069
}
7170

0 commit comments

Comments
 (0)