From e86e5facc65644b1ad0921ee92813b350a5a1572 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Tue, 7 Jan 2025 20:39:12 -0500 Subject: [PATCH] feat: Adds route query parameter to home, htmx updates url, and working next parameter for login --- Resources/Views/home.leaf | 12 ++++- Resources/Views/index.leaf | 9 +--- Resources/Views/login.leaf | 10 +++- Sources/App/Controllers/ViewController.swift | 53 ++++++++++++------- .../Extensions/RouteBuilder+protected.swift | 7 ++- 5 files changed, 61 insertions(+), 30 deletions(-) diff --git a/Resources/Views/home.leaf b/Resources/Views/home.leaf index d3fb644..f7ab686 100644 --- a/Resources/Views/home.leaf +++ b/Resources/Views/home.leaf @@ -1,3 +1,5 @@ +#extend("index"): +#export("content"):
@@ -10,17 +12,21 @@
+#endexport +#endextend diff --git a/Resources/Views/index.leaf b/Resources/Views/index.leaf index 57ebdc5..3f8a3c3 100644 --- a/Resources/Views/index.leaf +++ b/Resources/Views/index.leaf @@ -7,14 +7,7 @@ #(title) - - -
-
+ #import("content") diff --git a/Resources/Views/login.leaf b/Resources/Views/login.leaf index 6a528f8..5cd78b1 100644 --- a/Resources/Views/login.leaf +++ b/Resources/Views/login.leaf @@ -1,3 +1,5 @@ +#extend("index"): +#export("content"):
@@ -5,7 +7,11 @@
-
+#endexport +#endextend diff --git a/Sources/App/Controllers/ViewController.swift b/Sources/App/Controllers/ViewController.swift index eea11db..229ff12 100644 --- a/Sources/App/Controllers/ViewController.swift +++ b/Sources/App/Controllers/ViewController.swift @@ -5,34 +5,30 @@ import Vapor struct ViewController: RouteCollection { private let api = ApiController() + private let employees = EmployeeViewController() func boot(routes: any RoutesBuilder) throws { let protected = routes.protected - let login = routes.grouped("login") // MARK: - Non-protected routes. - routes.get(use: index(req:)) - login.get(use: getLogin(req:)) - login.post(use: postLogin(req:)) - routes.post("logout", use: logout(req:)) + // routes.get(use: index(req:)) + routes.get("login", use: getLogin(req:)) + routes.post(use: postLogin(req:)) // MARK: Protected routes. - protected.get("home", use: home(req:)) + protected.get(use: home(req:)) + protected.post("logout", use: logout(req:)) protected.get("users", use: users(req:)) - - try routes.register(collection: EmployeeViewController()) - } - - @Sendable - func index(req: Request) async throws -> View { - try await req.view.render("index") + try routes.register(collection: employees) } @Sendable func getLogin(req: Request) async throws -> View { - try await req.view.render("login") + req.logger.info("Query: \(req.url.query ?? "n/a")") + let params = try? req.query.decode(LoginParameter.self) + return try await req.view.render("login", ["route": params?.next ?? "/"]) } @Sendable @@ -51,7 +47,7 @@ struct ViewController: RouteCollection { req.auth.login(user) req.logger.debug("User logged in: \(user.toDTO())") - return try await req.view.render("home") + return try await home(req: req) } @Sendable @@ -60,11 +56,19 @@ struct ViewController: RouteCollection { return try await req.view.render("login") } - // TODO: Add route parameters for active route / tab. - @Sendable func home(req: Request) async throws -> View { - try await req.view.render("home") + let ctx = try req.query.decode(HomeCTX.self) + guard let route = ctx.route else { + return try await req.view.render("home", ctx) + } + + switch route { + case .users: + return try await users(req: req) + case .employees: + return try await employees.employees(req: req) + } } @Sendable @@ -79,3 +83,16 @@ private struct UserForm: Content { let username: String let password: String } + +enum HomeRoute: String, Content { + case employees + case users +} + +struct HomeCTX: Content { + let route: HomeRoute? +} + +struct LoginParameter: Content { + let next: String +} diff --git a/Sources/App/Extensions/RouteBuilder+protected.swift b/Sources/App/Extensions/RouteBuilder+protected.swift index 4ed49c0..1a84d67 100644 --- a/Sources/App/Extensions/RouteBuilder+protected.swift +++ b/Sources/App/Extensions/RouteBuilder+protected.swift @@ -5,6 +5,11 @@ extension RoutesBuilder { // Used to ensure views are protected, redirects users to the login page if they're // not authenticated. var protected: any RoutesBuilder { - grouped(User.credentialsAuthenticator(), User.redirectMiddleware(path: "login")) + grouped( + User.credentialsAuthenticator(), + User.redirectMiddleware { req in + "login?next=\(req.url)" + } + ) } }