fix: Fixes purchase order view generation to use the intermediate request and the logged in user as the created by id.

This commit is contained in:
2025-01-27 13:12:18 -05:00
parent f6c36cb489
commit 5da433b815
5 changed files with 32 additions and 16 deletions

View File

@@ -10,7 +10,10 @@ extension ViewController {
for: route, for: route,
isHtmxRequest: request.isHtmxRequest, isHtmxRequest: request.isHtmxRequest,
logger: request.logger, logger: request.logger,
authenticate: { request.session.authenticate($0) } authenticate: { request.session.authenticate($0) },
currentUser: {
try request.auth.require(User.self)
}
) )
return AnyHTMLResponse(value: html) return AnyHTMLResponse(value: html)
} }

View File

@@ -135,7 +135,7 @@ public extension SiteRoute {
} }
public enum PurchaseOrderRoute: Sendable, Equatable { public enum PurchaseOrderRoute: Sendable, Equatable {
case create(PurchaseOrder.Create) case create(PurchaseOrder.CreateIntermediate)
case form case form
case get(id: PurchaseOrder.ID) case get(id: PurchaseOrder.ID)
case index case index
@@ -155,11 +155,10 @@ public extension SiteRoute {
Field("materials", .string) Field("materials", .string)
Field("customer", .string) Field("customer", .string)
Optionally { Field("truckStock") { Bool.parser() } } Optionally { Field("truckStock") { Bool.parser() } }
Field("createdByID") { User.ID.parser() }
Field("createdForID") { Employee.ID.parser() } Field("createdForID") { Employee.ID.parser() }
Field("vendorBranchID") { VendorBranch.ID.parser() } Field("vendorBranchID") { VendorBranch.ID.parser() }
} }
.map(.memberwise(PurchaseOrder.Create.init)) .map(.memberwise(PurchaseOrder.CreateIntermediate.init))
} }
} }
Route(.case(Self.form)) { Route(.case(Self.form)) {

View File

@@ -16,6 +16,7 @@ public typealias AnySendableHTML = (any HTML & Sendable)
@DependencyClient @DependencyClient
public struct ViewController: Sendable { public struct ViewController: Sendable {
public typealias AuthenticateHandler = @Sendable (User) -> Void public typealias AuthenticateHandler = @Sendable (User) -> Void
public typealias CurrentUserHandler = @Sendable () throws -> User
public var view: @Sendable (Request) async throws -> AnySendableHTML public var view: @Sendable (Request) async throws -> AnySendableHTML
@@ -24,9 +25,16 @@ public struct ViewController: Sendable {
for route: SiteRoute.View, for route: SiteRoute.View,
isHtmxRequest: Bool, isHtmxRequest: Bool,
logger: Logger, logger: Logger,
authenticate: @escaping AuthenticateHandler authenticate: @escaping AuthenticateHandler,
currentUser: @escaping CurrentUserHandler
) async throws -> AnySendableHTML { ) async throws -> AnySendableHTML {
try await view(.init(route, isHtmxRequest: isHtmxRequest, authenticate: authenticate, logger: logger)) try await view(.init(
route,
isHtmxRequest: isHtmxRequest,
authenticate: authenticate,
logger: logger,
currentUser: currentUser
))
} }
public struct Request: Sendable { public struct Request: Sendable {
@@ -34,17 +42,20 @@ public struct ViewController: Sendable {
public let isHtmxRequest: Bool public let isHtmxRequest: Bool
public let authenticate: AuthenticateHandler public let authenticate: AuthenticateHandler
public let logger: Logger public let logger: Logger
public let currentUser: CurrentUserHandler
public init( public init(
_ route: SiteRoute.View, _ route: SiteRoute.View,
isHtmxRequest: Bool, isHtmxRequest: Bool,
authenticate: @escaping AuthenticateHandler, authenticate: @escaping AuthenticateHandler,
logger: Logger logger: Logger,
currentUser: @escaping CurrentUserHandler
) { ) {
self.route = route self.route = route
self.isHtmxRequest = isHtmxRequest self.isHtmxRequest = isHtmxRequest
self.authenticate = authenticate self.authenticate = authenticate
self.logger = logger self.logger = logger
self.currentUser = currentUser
} }
} }

View File

@@ -9,7 +9,8 @@ extension ViewController: DependencyKey {
try await request.route.view( try await request.route.view(
isHtmxRequest: request.isHtmxRequest, isHtmxRequest: request.isHtmxRequest,
logger: request.logger, logger: request.logger,
authenticate: request.authenticate authenticate: request.authenticate,
currentUser: request.currentUser
) )
}) })
} }

View File

@@ -12,14 +12,11 @@ public extension SiteRoute.View {
func view( func view(
isHtmxRequest: Bool, isHtmxRequest: Bool,
logger: Logger, logger: Logger,
authenticate: @escaping @Sendable (User) -> Void authenticate: @escaping @Sendable (User) -> Void,
currentUser: @escaping @Sendable () throws -> User
) async throws -> AnySendableHTML { ) async throws -> AnySendableHTML {
@Dependency(\.database.users) var users @Dependency(\.database.users) var users
switch self { switch self {
// case .index:
// // This get's redirected to purchase-orders route in the app / site handler.
// return nil
case let .employee(route): case let .employee(route):
return try await route.view(isHtmxRequest: isHtmxRequest) return try await route.view(isHtmxRequest: isHtmxRequest)
@@ -38,7 +35,7 @@ public extension SiteRoute.View {
} }
case let .purchaseOrder(route): case let .purchaseOrder(route):
return try await route.view(isHtmxRequest: isHtmxRequest) return try await route.view(isHtmxRequest: isHtmxRequest, currentUser: currentUser)
case let .resetPassword(route): case let .resetPassword(route):
return try await route.view(isHtmxRequest: isHtmxRequest) return try await route.view(isHtmxRequest: isHtmxRequest)
@@ -116,7 +113,10 @@ extension SiteRoute.View.PurchaseOrderRoute {
} }
@Sendable @Sendable
func view(isHtmxRequest: Bool) async throws -> AnySendableHTML { func view(
isHtmxRequest: Bool,
currentUser: @escaping @Sendable () throws -> User
) async throws -> AnySendableHTML {
@Dependency(\.database.purchaseOrders) var purchaseOrders @Dependency(\.database.purchaseOrders) var purchaseOrders
switch self { switch self {
@@ -129,7 +129,9 @@ extension SiteRoute.View.PurchaseOrderRoute {
return try await route.view(isHtmxRequest: isHtmxRequest) return try await route.view(isHtmxRequest: isHtmxRequest)
case let .create(purchaseOrder): case let .create(purchaseOrder):
return try await PurchaseOrderTable.Row(purchaseOrder: purchaseOrders.create(purchaseOrder)) return try await PurchaseOrderTable.Row(
purchaseOrder: purchaseOrders.create(purchaseOrder.toCreate(createdByID: currentUser().id))
)
case .index: case .index:
return try await mainPage(PurchaseOrderForm()) return try await mainPage(PurchaseOrderForm())