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() } } }