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

82 lines
3.9 KiB
Swift
Raw Normal View History

import FluentKit
/// Creates the conversations, offers, sales, and messages tables, and hands the demo shops to seller accounts, created here when missing.
struct CreateTrade: AsyncMigration {
// MARK: Methods
func prepare(on database: Database) async throws {
try await database.schema(ConversationRecord.schema)
.id()
.field("buyer_id", .uuid, .required, .references(UserRecord.schema, "id"))
.field("shop_id", .uuid, .required, .references(ShopRecord.schema, "id"))
.field("listing_id", .uuid, .references(ListingRecord.schema, "id"))
.field("created_at", .datetime, .required)
.field("buyer_read_at", .datetime, .required)
.field("seller_read_at", .datetime, .required)
.create()
try await database.schema(OfferRecord.schema)
.id()
.field("conversation_id", .uuid, .required, .references(ConversationRecord.schema, "id"))
.field("listing_id", .uuid, .required, .references(ListingRecord.schema, "id"))
.field("buyer_id", .uuid, .required, .references(UserRecord.schema, "id"))
.field("amount_cents", .int, .required)
.field("status", .string, .required)
.field("created_at", .datetime, .required)
.field("expires_at", .datetime, .required)
.create()
try await database.schema(SaleRecord.schema)
.id()
.field("number", .int, .required)
.field("conversation_id", .uuid, .required, .references(ConversationRecord.schema, "id"))
.field("listing_id", .uuid, .required, .references(ListingRecord.schema, "id"))
.field("buyer_id", .uuid, .required, .references(UserRecord.schema, "id"))
.field("seller_id", .uuid, .required, .references(UserRecord.schema, "id"))
.field("price_cents", .int, .required)
.field("asked_cents", .int, .required)
.field("shipping_cents", .int, .required)
.field("declared_grade", .string, .required)
.field("declared_page_quality", .string)
.field("declared_printing", .string, .required)
.field("declared_notes", .string, .required)
.field("agreed_at", .datetime, .required)
.field("paid_at", .datetime)
.field("payment_note", .string)
.field("sent_at", .datetime)
.field("shipping_note", .string)
.field("received_at", .datetime)
.field("buyer_rating", .int)
.field("seller_rating", .int)
.unique(on: "number")
.create()
try await database.schema(MessageRecord.schema)
.id()
.field("conversation_id", .uuid, .required, .references(ConversationRecord.schema, "id"))
.field("sender_id", .uuid, .required, .references(UserRecord.schema, "id"))
.field("kind", .string, .required)
.field("body", .string, .required)
.field("offer_id", .uuid, .references(OfferRecord.schema, "id"))
.field("sale_number", .int)
.field("created_at", .datetime, .required)
.create()
for (slug, seller) in Seed.owners {
let owner = try await UserRecord.query(on: database)
.filter(\.$email == seller.email)
.first() ?? UserRecord(email: seller.email, displayName: seller.displayName)
try await owner.save(on: database)
try await ShopRecord.query(on: database)
.filter(\.$slug == slug)
.set(\.$owner.$id, to: try owner.requireID())
.update()
}
}
func revert(on database: Database) async throws {
for schema in [MessageRecord.schema, SaleRecord.schema, OfferRecord.schema, ConversationRecord.schema] {
try await database.schema(schema).delete()
}
}
}