Files
2026-01-26 00:37:35 +01:00

84 lines
2.5 KiB
Swift

//
// 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()
}
}
}