From 5da433b8153257579d44605a966757f47e0104d8 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Mon, 27 Jan 2025 13:12:18 -0500 Subject: [PATCH] fix: Fixes purchase order view generation to use the intermediate request and the logged in user as the created by id. --- .../Extensions/ViewController+respond.swift | 5 ++++- Sources/SharedModels/Routes/ViewRoute.swift | 5 ++--- Sources/ViewController/ViewController.swift | 17 ++++++++++++++--- Sources/ViewControllerLive/Live.swift | 3 ++- Sources/ViewControllerLive/Routes+view.swift | 18 ++++++++++-------- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Sources/App/Extensions/ViewController+respond.swift b/Sources/App/Extensions/ViewController+respond.swift index 1f2967b..102cedb 100644 --- a/Sources/App/Extensions/ViewController+respond.swift +++ b/Sources/App/Extensions/ViewController+respond.swift @@ -10,7 +10,10 @@ extension ViewController { for: route, isHtmxRequest: request.isHtmxRequest, logger: request.logger, - authenticate: { request.session.authenticate($0) } + authenticate: { request.session.authenticate($0) }, + currentUser: { + try request.auth.require(User.self) + } ) return AnyHTMLResponse(value: html) } diff --git a/Sources/SharedModels/Routes/ViewRoute.swift b/Sources/SharedModels/Routes/ViewRoute.swift index a85c77c..da5c0b3 100644 --- a/Sources/SharedModels/Routes/ViewRoute.swift +++ b/Sources/SharedModels/Routes/ViewRoute.swift @@ -135,7 +135,7 @@ public extension SiteRoute { } public enum PurchaseOrderRoute: Sendable, Equatable { - case create(PurchaseOrder.Create) + case create(PurchaseOrder.CreateIntermediate) case form case get(id: PurchaseOrder.ID) case index @@ -155,11 +155,10 @@ public extension SiteRoute { Field("materials", .string) Field("customer", .string) Optionally { Field("truckStock") { Bool.parser() } } - Field("createdByID") { User.ID.parser() } Field("createdForID") { Employee.ID.parser() } Field("vendorBranchID") { VendorBranch.ID.parser() } } - .map(.memberwise(PurchaseOrder.Create.init)) + .map(.memberwise(PurchaseOrder.CreateIntermediate.init)) } } Route(.case(Self.form)) { diff --git a/Sources/ViewController/ViewController.swift b/Sources/ViewController/ViewController.swift index 8dfcdbe..3cdb410 100644 --- a/Sources/ViewController/ViewController.swift +++ b/Sources/ViewController/ViewController.swift @@ -16,6 +16,7 @@ public typealias AnySendableHTML = (any HTML & Sendable) @DependencyClient public struct ViewController: Sendable { public typealias AuthenticateHandler = @Sendable (User) -> Void + public typealias CurrentUserHandler = @Sendable () throws -> User public var view: @Sendable (Request) async throws -> AnySendableHTML @@ -24,9 +25,16 @@ public struct ViewController: Sendable { for route: SiteRoute.View, isHtmxRequest: Bool, logger: Logger, - authenticate: @escaping AuthenticateHandler + authenticate: @escaping AuthenticateHandler, + currentUser: @escaping CurrentUserHandler ) 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 { @@ -34,17 +42,20 @@ public struct ViewController: Sendable { public let isHtmxRequest: Bool public let authenticate: AuthenticateHandler public let logger: Logger + public let currentUser: CurrentUserHandler public init( _ route: SiteRoute.View, isHtmxRequest: Bool, authenticate: @escaping AuthenticateHandler, - logger: Logger + logger: Logger, + currentUser: @escaping CurrentUserHandler ) { self.route = route self.isHtmxRequest = isHtmxRequest self.authenticate = authenticate self.logger = logger + self.currentUser = currentUser } } diff --git a/Sources/ViewControllerLive/Live.swift b/Sources/ViewControllerLive/Live.swift index 71fa230..697b1c0 100644 --- a/Sources/ViewControllerLive/Live.swift +++ b/Sources/ViewControllerLive/Live.swift @@ -9,7 +9,8 @@ extension ViewController: DependencyKey { try await request.route.view( isHtmxRequest: request.isHtmxRequest, logger: request.logger, - authenticate: request.authenticate + authenticate: request.authenticate, + currentUser: request.currentUser ) }) } diff --git a/Sources/ViewControllerLive/Routes+view.swift b/Sources/ViewControllerLive/Routes+view.swift index 71408a0..bf8d19e 100644 --- a/Sources/ViewControllerLive/Routes+view.swift +++ b/Sources/ViewControllerLive/Routes+view.swift @@ -12,14 +12,11 @@ public extension SiteRoute.View { func view( isHtmxRequest: Bool, logger: Logger, - authenticate: @escaping @Sendable (User) -> Void + authenticate: @escaping @Sendable (User) -> Void, + currentUser: @escaping @Sendable () throws -> User ) async throws -> AnySendableHTML { @Dependency(\.database.users) var users switch self { - // case .index: - // // This get's redirected to purchase-orders route in the app / site handler. - // return nil - case let .employee(route): return try await route.view(isHtmxRequest: isHtmxRequest) @@ -38,7 +35,7 @@ public extension SiteRoute.View { } case let .purchaseOrder(route): - return try await route.view(isHtmxRequest: isHtmxRequest) + return try await route.view(isHtmxRequest: isHtmxRequest, currentUser: currentUser) case let .resetPassword(route): return try await route.view(isHtmxRequest: isHtmxRequest) @@ -116,7 +113,10 @@ extension SiteRoute.View.PurchaseOrderRoute { } @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 switch self { @@ -129,7 +129,9 @@ extension SiteRoute.View.PurchaseOrderRoute { return try await route.view(isHtmxRequest: isHtmxRequest) 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: return try await mainPage(PurchaseOrderForm())