84 lines
2.5 KiB
Swift
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()
|
|
}
|
|
}
|
|
}
|