101 lines
2.7 KiB
Swift
101 lines
2.7 KiB
Swift
//
|
|
// SessionModel.swift
|
|
// ExodaiAcademy
|
|
//
|
|
// Created by Exodai on 23/01/2026.
|
|
//
|
|
|
|
import Fluent
|
|
|
|
final class SessionModel: Model, @unchecked Sendable {
|
|
static let schema: String = Database.sessions.rawValue
|
|
|
|
// MARK: - ID
|
|
|
|
@ID(key: .id)
|
|
var id: UUID?
|
|
|
|
// MARK: - CMS Fields (ALL optional)
|
|
|
|
@OptionalField(key: FieldKeys.title)
|
|
var title: String?
|
|
|
|
@OptionalField(key: FieldKeys.description)
|
|
var description: String?
|
|
|
|
@OptionalField(key: FieldKeys.slug)
|
|
var slug: String?
|
|
|
|
@OptionalField(key: FieldKeys.mp4URL)
|
|
var mp4URL: String?
|
|
|
|
@OptionalField(key: FieldKeys.hlsURL)
|
|
var hlsURL: String?
|
|
|
|
@OptionalField(key: FieldKeys.content)
|
|
var content: String?
|
|
|
|
@OptionalEnum(key: FieldKeys.status)
|
|
var status: Status?
|
|
|
|
@OptionalField(key: FieldKeys.courseID)
|
|
var courseID: CourseModel.IDValue?
|
|
|
|
// MARK: - Timestamps
|
|
|
|
@Timestamp(key: FieldKeys.createdAt, on: .create)
|
|
var createdAt: Date?
|
|
|
|
@Timestamp(key: FieldKeys.updatedAt, on: .update)
|
|
var updatedAt: Date?
|
|
|
|
@OptionalField(key: FieldKeys.publishDate)
|
|
var publishDate: Date?
|
|
|
|
// MARK: - Initializer
|
|
|
|
init() {}
|
|
}
|
|
|
|
extension SessionModel {
|
|
struct FieldKeys {
|
|
static var title: FieldKey { "title" }
|
|
static var description: FieldKey { "description" }
|
|
static var slug: FieldKey { "slug" }
|
|
static var mp4URL: FieldKey { "mp4URL" }
|
|
static var hlsURL: FieldKey { "hlsURL" }
|
|
static var content: FieldKey { "content" }
|
|
static var status: FieldKey { "status" }
|
|
static var courseID: FieldKey { "courseID" }
|
|
static var createdAt: FieldKey { "createdAt" }
|
|
static var updatedAt: FieldKey { "updatedAt" }
|
|
static var publishDate: FieldKey { "publishDate" }
|
|
}
|
|
}
|
|
|
|
extension SessionModel {
|
|
struct Migration: AsyncMigration {
|
|
|
|
func prepare(on database: any FluentKit.Database) async throws {
|
|
try await database.schema(SessionModel.schema)
|
|
.id()
|
|
.field(FieldKeys.title, .string)
|
|
.field(FieldKeys.description, .string)
|
|
.field(FieldKeys.slug, .string)
|
|
.field(FieldKeys.mp4URL, .string)
|
|
.field(FieldKeys.hlsURL, .string)
|
|
.field(FieldKeys.content, .string)
|
|
.field(FieldKeys.status, .string)
|
|
.field(FieldKeys.courseID, .uuid)
|
|
.field(FieldKeys.createdAt, .datetime)
|
|
.field(FieldKeys.updatedAt, .datetime)
|
|
.field(FieldKeys.publishDate, .datetime)
|
|
.create()
|
|
}
|
|
|
|
func revert(on database: any FluentKit.Database) async throws {
|
|
try await database.schema(SessionModel.schema).delete()
|
|
}
|
|
}
|
|
}
|