Files
vapor-po/Sources/App/routes.swift

60 lines
1.6 KiB
Swift

import DatabaseClientLive
import Dependencies
import Elementary
import Fluent
import SharedModels
import Vapor
import VaporElementary
func routes(_ app: Application) throws {
try app.register(collection: ApiController())
try app.register(collection: UserViewController())
try app.register(collection: VendorViewController())
try app.register(collection: EmployeeViewController())
try app.register(collection: PurchaseOrderViewController())
app.get { _ in
HTMLResponse {
MainPage(displayNav: false, route: .purchaseOrders) {
div(.class("container")) {
h1 { "iT WORKS" }
}
}
}
}
app.get("login") { req in
let context = try req.query.decode(LoginContext.self)
return await req.render {
MainPage(displayNav: false, route: .login) {
UserForm(context: .login(next: context.next))
}
}
}
app.post("login") { req in
@Dependency(\.database.users) var users
let loginForm = try req.content.decode(User.Login.self)
let token = try await users.login(loginForm)
let user = try await users.get(token.userID)!
req.session.authenticate(user)
return try await PurchaseOrderViewController().index(req: req)
}
let protected = app.grouped(UserPasswordAuthenticator(), UserSessionAuthenticator())
protected.get("me") { req in
let user = try req.auth.require(User.self)
return HTMLResponse {
MainPage(displayNav: false, route: .purchaseOrders) {
h1 { "You are logged in as: \(user.username)" }
}
}
}
}
private struct LoginContext: Content {
let next: String?
}