import Dependencies import DependenciesMacros import Fluent import SharedModels import Vapor public extension DatabaseClient { @DependencyClient struct PurchaseOrders: Sendable { public var create: @Sendable (PurchaseOrder.Create, User.ID) async throws -> PurchaseOrder public var fetchAll: @Sendable () async throws -> [PurchaseOrder] public var fetchPage: @Sendable (PageRequest) async throws -> Page public var get: @Sendable (PurchaseOrder.ID) async throws -> PurchaseOrder? // var update: @Sendable (PurchaseOrder.ID, PurchaseOrder.Update) async throws -> PurchaseOrder public var delete: @Sendable (PurchaseOrder.ID) async throws -> Void } } extension PurchaseOrder: Content {} extension PurchaseOrder.Create: Content {} extension DatabaseClient.PurchaseOrders: TestDependencyKey { public static let testValue: DatabaseClient.PurchaseOrders = Self() } #if DEBUG typealias PurchaseOrderMockStorage = MockStorage< PurchaseOrder, PurchaseOrder.Create, Void, Void, Void > public extension DependencyValues { var purchaseOrderID: PurchaseOrderIDGenerator { get { self[PurchaseOrderIDGenerator.self] } set { self[PurchaseOrderIDGenerator.self] = newValue } } } @DependencyClient public struct PurchaseOrderIDGenerator: Sendable { var nextID: @Sendable () async throws -> Int } extension PurchaseOrderIDGenerator: DependencyKey { public static let testValue: PurchaseOrderIDGenerator = .liveValue public static var liveValue: Self { let counter = Counter() return .init(nextID: { await counter.nextID() }) } actor Counter { private var count: Int init(starting: Int = 1) { self.count = starting } func nextID() async -> Int { count += 1 return count } } } // private extension PurchaseOrderMockStorage { // static func make(_ mocks: [PurchaseOrder]) -> Self { // @Dependency(\.date.now) var now // @Dependency(\.purchaseOrderID) var purchaseOrderID // // return .init( // mocks, // create: { model in // try await PurchaseOrder( // id: purchaseOrderID.nextID(), // workOrder: model.workOrder, // materials: model.materials, // customer: model.customer, // truckStock: model.truckStock, // createdBy: model.createdForID, // createdFor: model.createdForID, // vendorBranch: .i // // ) // }, // update: { _, _ in // fatalError() // } // ) // } // } #endif