diff --git a/db/migrate/20260106225822_add_payments_table.rb b/db/migrate/20260106225822_add_payments_table.rb new file mode 100644 index 000000000..88ae97ece --- /dev/null +++ b/db/migrate/20260106225822_add_payments_table.rb @@ -0,0 +1,29 @@ +class AddPaymentsTable < ActiveRecord::Migration[8.1] + def change + create_table :payments do |t| + t.references :payer, polymorphic: true, null: false + + t.references :payable, polymorphic: true, null: false + + t.integer :amount_cents, null: false + t.string :currency, null: false, default: "usd" + + t.string :stripe_payment_intent_id, null: false + t.string :stripe_charge_id + + t.string :status, null: false + t.string :failure_code + t.string :failure_message + + t.json :stripe_metadata + + t.timestamps + end + + add_index :payments, :stripe_payment_intent_id, unique: true + add_index :payments, :stripe_charge_id + add_index :payments, [ :payer_type, :payer_id ] + add_index :payments, [ :payable_type, :payable_id ] + add_index :payments, [ :payable_type, :payable_id, :status ] + end +end diff --git a/db/schema.rb b/db/schema.rb index 728c6960e..4283eef4d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2026_01_03_133222) do +ActiveRecord::Schema[8.1].define(version: 2026_01_06_225822) do create_table "action_text_rich_texts", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.text "body", size: :long t.datetime "created_at", null: false @@ -447,6 +447,30 @@ t.index ["noticeable_type", "noticeable_id"], name: "index_notifications_on_noticeable_type_and_noticeable_id" end + create_table "payments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.integer "amount_cents", null: false + t.datetime "created_at", null: false + t.string "currency", default: "usd", null: false + t.string "failure_code" + t.string "failure_message" + t.bigint "payable_id", null: false + t.string "payable_type", null: false + t.bigint "payer_id", null: false + t.string "payer_type", null: false + t.string "status", null: false + t.string "stripe_charge_id" + t.json "stripe_metadata" + t.string "stripe_payment_intent_id", null: false + t.datetime "updated_at", null: false + t.index ["payable_type", "payable_id", "status"], name: "index_payments_on_payable_type_and_payable_id_and_status" + t.index ["payable_type", "payable_id"], name: "index_payments_on_payable" + t.index ["payable_type", "payable_id"], name: "index_payments_on_payable_type_and_payable_id" + t.index ["payer_type", "payer_id"], name: "index_payments_on_payer" + t.index ["payer_type", "payer_id"], name: "index_payments_on_payer_type_and_payer_id" + t.index ["stripe_charge_id"], name: "index_payments_on_stripe_charge_id" + t.index ["stripe_payment_intent_id"], name: "index_payments_on_stripe_payment_intent_id", unique: true + end + create_table "permissions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t| t.datetime "created_at", precision: nil, null: false t.integer "legacy_id"