Initial commit
This commit is contained in:
103
Sources/ExodaiAcademy/Infrastructure/Database/CourseModel.swift
Normal file
103
Sources/ExodaiAcademy/Infrastructure/Database/CourseModel.swift
Normal file
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// CourseModel.swift
|
||||
// ExodaiAcademy
|
||||
//
|
||||
// Created by Exodai on 23/01/2026.
|
||||
//
|
||||
|
||||
import Fluent
|
||||
|
||||
final class CourseModel: Model, @unchecked Sendable {
|
||||
static let schema: String = Database.courses.rawValue
|
||||
|
||||
// MARK: - ID
|
||||
|
||||
@ID(key: .id)
|
||||
var id: UUID?
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
@OptionalField(key: FieldKeys.title)
|
||||
var title: String?
|
||||
|
||||
@OptionalField(key: FieldKeys.description)
|
||||
var description: String?
|
||||
|
||||
@OptionalField(key: FieldKeys.slug)
|
||||
var slug: String?
|
||||
|
||||
@OptionalField(key: FieldKeys.excerpt)
|
||||
var excerpt: String?
|
||||
|
||||
@OptionalField(key: FieldKeys.content)
|
||||
var content: String?
|
||||
|
||||
@OptionalField(key: FieldKeys.campusID)
|
||||
var campusID: CampusModel.IDValue?
|
||||
|
||||
@Field(key: FieldKeys.authorID)
|
||||
var authorID: UserModel.IDValue
|
||||
|
||||
@OptionalField(key: FieldKeys.image)
|
||||
var image: String?
|
||||
|
||||
@Enum(key: FieldKeys.status)
|
||||
var status: Status
|
||||
|
||||
@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: - Initializers
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
extension CourseModel {
|
||||
struct FieldKeys {
|
||||
static var title: FieldKey { "title" }
|
||||
static var description: FieldKey { "description" }
|
||||
static var slug: FieldKey { "slug" }
|
||||
static var excerpt: FieldKey { "excerpt" }
|
||||
static var content: FieldKey { "content" }
|
||||
static var campusID: FieldKey { "campusID" }
|
||||
static var authorID: FieldKey { "authorID" }
|
||||
static var image: FieldKey { "image" }
|
||||
static var status: FieldKey { "status" }
|
||||
static var createdAt: FieldKey { "createdAt" }
|
||||
static var updatedAt: FieldKey { "updatedAt" }
|
||||
static var publishDate: FieldKey { "publishDate" }
|
||||
}
|
||||
}
|
||||
|
||||
extension CourseModel {
|
||||
struct Migration: AsyncMigration {
|
||||
|
||||
func prepare(on database: any FluentKit.Database) async throws {
|
||||
try await database.schema(CourseModel.schema)
|
||||
.id()
|
||||
.field(FieldKeys.title, .string)
|
||||
.field(FieldKeys.description, .string)
|
||||
.field(FieldKeys.slug, .string)
|
||||
.field(FieldKeys.excerpt, .string)
|
||||
.field(FieldKeys.content, .string)
|
||||
.field(FieldKeys.campusID, .uuid)
|
||||
.field(FieldKeys.authorID, .uuid, .required)
|
||||
.field(FieldKeys.image, .string)
|
||||
.field(FieldKeys.status, .string, .required)
|
||||
.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(CourseModel.schema).delete()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user