// import Dependencies // import Fluent // import Vapor // // struct UserViewController: RouteCollection { // // @Dependency(\.users) var users // // private let api = UserApiController() // // func boot(routes: any RoutesBuilder) throws { // let users = routes.protected.grouped("users") // users.get(use: index(req:)) // users.post(use: create(req:)) // users.group(":id") { // $0.get(use: details(req:)) // $0.delete(use: delete(req:)) // } // } // // @Sendable // func index(req: Request) async throws -> View { // try await renderIndex(req) // } // // @Sendable // private func renderIndex(_ req: Request, _ user: User.DTO? = nil) async throws -> View { // let users = try await api.getSortedUsers(req: req) // return try await req.view.render("users/index", UsersCTX(user: user, users: users)) // } // // @Sendable // func create(req: Request) async throws -> View { // let user = try await api.create(req: req) // return try await req.view.render("users/table-row", user) // } // // @Sendable // func details(req: Request) async throws -> View { // let user = try await users.get(req.ensureIDPathComponent()) // // Check if the page has been rendered before. // guard req.isHtmxRequest else { // // Not an htmx-request, so render the whole page with the details. // return try await renderIndex(req, user) // } // // An htmx-request header was present, so just return the details, // return try await req.view.render("users/detail", ["user": user]) // } // // @Sendable // func delete(req: Request) async throws -> View { // _ = try await api.delete(req: req) // return try await req.view.render("users/table", ["users": api.getSortedUsers(req: req)]) // } // } // // struct UserFormCTX: Content { // let htmxForm: HtmxFormCTX // // struct Context: Content { // let showConfirmPassword: Bool // let showEmailInput: Bool // let buttonLabel: String // } // // static func signIn(next: String?) -> Self { // .init( // htmxForm: .init( // formClass: "user-form", // formId: "user-form", // htmxTargetUrl: .post("/login\((next != nil && next != "/") ? "?next=\(next!)" : "")"), // htmxTarget: "user-table", // htmxPushUrl: true, // htmxResetAfterRequest: true, // htmxSwapOob: nil, // htmxSwap: .afterbegin, // context: .init(showConfirmPassword: false, showEmailInput: false, buttonLabel: "Sign In") // ) // ) // } // // static func create() -> Self { // .init( // htmxForm: .init( // formClass: "user-form", // formId: "user-form", // htmxTargetUrl: .post("/users"), // htmxTarget: "#user-table", // htmxPushUrl: false, // htmxResetAfterRequest: true, // htmxSwapOob: nil, // htmxSwap: nil, // context: .init(showConfirmPassword: true, showEmailInput: true, buttonLabel: "Create") // ) // ) // } // } // // private struct UsersCTX: Content { // let user: User.DTO? // let users: [User.DTO] // let form: UserFormCTX // // init( // user: User.DTO? = nil, // users: [User.DTO], // form: UserFormCTX? = nil // ) { // self.user = user // self.users = users // self.form = form ?? .create() // } // } // // private extension UserApiController { // // func getSortedUsers(req: Request) async throws -> [User.DTO] { // try await index(req: req) // .sorted { ($0.username ?? "") < ($1.username ?? "") } // } // }