Files
ccn/Packages/Persistence/Sources/Internal/Migrations/CreateCommunity.swift
T

50 lines
1.9 KiB
Swift

import FluentKit
/// Creates the `events`, `event_shops`, and `owned_issues` tables, seeded with the demo cons and the shops trading at them.
struct CreateCommunity: AsyncMigration {
// MARK: Methods
func prepare(on database: Database) async throws {
try await database.schema(EventRecord.schema)
.id()
.field("slug", .string, .required)
.field("name", .string, .required)
.field("venue", .string, .required)
.field("starts_on", .datetime, .required)
.field("ends_on", .datetime, .required)
.unique(on: "slug")
.create()
try await database.schema(EventShopRecord.schema)
.id()
.field("event_id", .uuid, .required, .references(EventRecord.schema, "id", onDelete: .cascade))
.field("shop_id", .uuid, .required, .references(ShopRecord.schema, "id", onDelete: .cascade))
.unique(on: "event_id", "shop_id")
.create()
try await database.schema(OwnedIssueRecord.schema)
.id()
.field("user_id", .uuid, .required, .references(UserRecord.schema, "id", onDelete: .cascade))
.field("series_slug", .string, .required)
.field("issue", .int, .required)
.unique(on: "user_id", "series_slug", "issue")
.create()
for (event, shops) in Seed.events(after: .init()) {
let record = EventRecord(event)
try await record.save(on: database)
for shop in try await ShopRecord.query(on: database).filter(\.$slug ~~ shops).all() {
try await record.$shops.attach(shop, on: database)
}
}
}
func revert(on database: Database) async throws {
for schema in [OwnedIssueRecord.schema, EventShopRecord.schema, EventRecord.schema] {
try await database.schema(schema).delete()
}
}
}