diff --git a/app/models/party.rb b/app/models/party.rb index 5d71f4c..f0944e7 100644 --- a/app/models/party.rb +++ b/app/models/party.rb @@ -105,6 +105,15 @@ class Party < ApplicationRecord attr_accessor :favorited + self.enum :preview_state, { + pending: 0, # Never generated + queued: 1, # Generation job scheduled + generated: 2, # Has preview image + failed: 3 # Generation failed + } + + after_commit :schedule_preview_regeneration, if: :preview_relevant_changes? + def is_favorited(user) user.favorite_parties.include? self if user end @@ -177,4 +186,18 @@ class Party < ApplicationRecord errors.add(:guidebooks, 'must be unique') end + + def preview_relevant_changes? + return false if preview_state == 'queued' + + (saved_changes.keys & %w[name job_id element weapons_count characters_count summons_count]).any? + end + + def schedule_preview_regeneration + # Cancel any pending jobs + GeneratePartyPreviewJob.cancel_scheduled_jobs(party_id: id) + + # Mark as pending + update_column(:preview_state, :pending) + end end diff --git a/db/migrate/20250118135254_add_preview_columns_to_parties.rb b/db/migrate/20250118135254_add_preview_columns_to_parties.rb new file mode 100644 index 0000000..0eff4de --- /dev/null +++ b/db/migrate/20250118135254_add_preview_columns_to_parties.rb @@ -0,0 +1,9 @@ +class AddPreviewColumnsToParties < ActiveRecord::Migration[8.0] + def change + add_column :parties, :preview_state, :integer, default: 0, null: false + add_column :parties, :preview_generated_at, :datetime + + add_index :parties, :preview_state + add_index :parties, :preview_generated_at + end +end diff --git a/db/schema.rb b/db/schema.rb index 22ac3b7..ffaeb01 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,12 +10,12 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2025_01_15_100356) do +ActiveRecord::Schema[8.0].define(version: 2025_01_18_135254) do # These are extensions that must be enabled in order to support this database enable_extension "btree_gin" + enable_extension "pg_catalog.plpgsql" enable_extension "pg_trgm" enable_extension "pgcrypto" - enable_extension "plpgsql" enable_extension "uuid-ossp" create_table "app_updates", primary_key: "updated_at", id: :datetime, force: :cascade do |t| @@ -300,11 +300,15 @@ ActiveRecord::Schema[7.0].define(version: 2025_01_15_100356) do t.boolean "auto_summon", default: false t.boolean "remix", default: false, null: false t.integer "visibility", default: 1, null: false + t.integer "preview_state", default: 0, null: false + t.datetime "preview_generated_at" t.index ["accessory_id"], name: "index_parties_on_accessory_id" t.index ["guidebook1_id"], name: "index_parties_on_guidebook1_id" t.index ["guidebook2_id"], name: "index_parties_on_guidebook2_id" t.index ["guidebook3_id"], name: "index_parties_on_guidebook3_id" t.index ["job_id"], name: "index_parties_on_job_id" + t.index ["preview_generated_at"], name: "index_parties_on_preview_generated_at" + t.index ["preview_state"], name: "index_parties_on_preview_state" t.index ["skill0_id"], name: "index_parties_on_skill0_id" t.index ["skill1_id"], name: "index_parties_on_skill1_id" t.index ["skill2_id"], name: "index_parties_on_skill2_id"