feat: Working on layout / css.

This commit is contained in:
2025-01-15 14:31:36 -05:00
parent cf28e52fa2
commit 24570e7191
15 changed files with 285 additions and 118 deletions

View File

@@ -13,27 +13,68 @@ struct UserViewController: RouteCollection {
// let users = routes.protected.grouped("users")
let users = routes.grouped("users")
users.get(use: index)
users.post(use: create)
users.get("create", use: form)
users.group(":id") {
$0.post(use: update)
$0.get(use: get)
$0.delete(use: delete)
}
}
@Sendable
func index(req: Request) async throws -> HTMLResponse {
HTMLResponse {
MainPage(route: .users) {
div(.class("container")) {
UserDetail(user: nil)
UserTable()
}
}
try await req.render {
try await mainPage(UserDetail(user: nil))
}
}
@Sendable
func get(req: Request) async throws -> HTMLResponse {
let user = try await users.get(req.ensureIDPathComponent())
return HTMLResponse { UserDetail(user: user) }
let detail = UserDetail(user: user)
guard req.isHtmxRequest else {
return try await req.render { try await mainPage(detail) }
}
return await req.render { UserDetail(user: user) }
}
@Sendable
func create(req: Request) async throws -> HTMLResponse {
_ = try await users.create(req.content.decode(User.Create.self))
let users = try await users.fetchAll()
// return req.redirect(to: "/users")
return await req.render { UserTable(users: users) }
}
@Sendable
func delete(req: Request) async throws -> HTTPStatus {
try await users.delete(req.ensureIDPathComponent())
return .ok
}
@Sendable
func form(req: Request) async throws -> HTMLResponse {
await req.render { UserForm(context: .create) }
}
@Sendable
func update(req: Request) async throws -> HTMLResponse {
let updates = try req.content.decode(User.Update.self)
req.logger.info("\(updates)")
let user = try await users.update(req.ensureIDPathComponent(), updates)
return await req.render { UserTable.Row(user: user) }
}
private func mainPage<C: HTML>(_ html: C) async throws -> some SendableHTMLDocument where C: Sendable {
let users = try await users.fetchAll()
return MainPage(displayNav: true, route: .users) {
div(.class("container")) {
html
UserTable(users: users)
}
}
}
}