import Fluent import struct Foundation.UUID import Vapor final class VendorBranch: Model, @unchecked Sendable { static let schema = "vendor_branch" @ID(key: .id) var id: UUID? @Field(key: "name") var name: String @Timestamp(key: "created_at", on: .create) var createdAt: Date? @Timestamp(key: "updated_at", on: .update) var updatedAt: Date? @Parent(key: "vendor_id") var vendor: Vendor init() {} init(id: UUID? = nil, name: String, vendorId: Vendor.IDValue) { self.id = id self.name = name $vendor.id = vendorId } func toDTO() -> DTO { .init( id: id, name: $name.value, vendorId: $vendor.id, createdAt: createdAt, updatedAt: updatedAt ) } func applyUpdates(_ updates: Update) { name = updates.name } } // MARK: - Helpers extension VendorBranch { struct Create: Content { var name: String func toModel() -> VendorBranch { let model = VendorBranch() model.name = name return model } } struct DTO: Content { var id: UUID? var name: String? var vendorId: Vendor.IDValue? let createdAt: Date? let updatedAt: Date? func toModel() -> VendorBranch { let model = VendorBranch() model.id = id if let name { model.name = name } if let vendorId { model.$vendor.id = vendorId } return model } } struct Migrate: AsyncMigration { let name = "CreateVendorBranch" func prepare(on database: Database) async throws { try await database.schema(VendorBranch.schema) .id() .field("name", .string, .required) .field("vendor_id", .uuid, .required) .field("created_at", .datetime) .field("updated_at", .datetime) .foreignKey("vendor_id", references: Vendor.schema, "id", onDelete: .cascade) .create() } func revert(on database: Database) async throws { try await database.schema(VendorBranch.schema).delete() } } struct Update: Content { var name: String } } // MARK: - Validations extension VendorBranch.Create: Validatable { static func validations(_ validations: inout Validations) { validations.add("name", as: String.self, is: !.empty) } } extension VendorBranch.Update: Validatable { static func validations(_ validations: inout Validations) { validations.add("name", as: String.self, is: !.empty) } }