// // PurchaseModel.swift // ExodaiAcademy // // Created by Exodai on 24/01/2026. // import Fluent final class PurchaseModel: Model, @unchecked Sendable { static let schema: String = Database.purchases.rawValue @ID(key: .id) var id: UUID? @Field(key: FieldKeys.userID) var userID: UserModel.IDValue @Field(key: FieldKeys.courseID) var courseID: CourseModel.IDValue @Field(key: FieldKeys.pricePaid) var pricePaid: Double @Field(key: FieldKeys.currency) var currency: String @Field(key: FieldKeys.paymentProvider) var paymentProvider: String @Field(key: FieldKeys.paymentReference) var paymentReference: String @Timestamp(key: FieldKeys.purchasedAt, on: .create) var purchasedAt: Date? @OptionalField(key: FieldKeys.refundedAt) var refundedAt: Date? @Field(key: FieldKeys.grantedByAdmin) var grantedByAdmin: Bool init() {} } extension PurchaseModel { struct FieldKeys { static var userID: FieldKey { "userID" } static var courseID: FieldKey { "courseID" } static var pricePaid: FieldKey { "pricePaid" } static var currency: FieldKey { "currency" } static var paymentProvider: FieldKey { "paymentProvider" } static var paymentReference: FieldKey { "paymentReference" } static var purchasedAt: FieldKey { "purchasedAt" } static var refundedAt: FieldKey { "refundedAt" } static var grantedByAdmin: FieldKey { "grantedByAdmin" } } } extension PurchaseModel { struct Migration: AsyncMigration { func prepare(on database: any FluentKit.Database) async throws { try await database.schema(PurchaseModel.schema) .id() .field(FieldKeys.userID, .uuid, .required) .field(FieldKeys.courseID, .uuid, .required) .field(FieldKeys.pricePaid, .double, .required) .field(FieldKeys.currency, .string, .required) .field(FieldKeys.paymentProvider, .string, .required) .field(FieldKeys.paymentReference, .string, .required) .field(FieldKeys.purchasedAt, .datetime) .field(FieldKeys.refundedAt, .datetime) .field(FieldKeys.grantedByAdmin, .bool, .required) .unique(on: FieldKeys.userID, FieldKeys.courseID) .create() } func revert(on database: any FluentKit.Database) async throws { try await database.schema(PurchaseModel.schema).delete() } } }