Get Party ready for preview state

* Added new fields for preview state and generated_at timestamp
* Add preview state enum to model
* Add preview_relevant_changes? after_commit hook
This commit is contained in:
Justin Edmund 2025-01-18 08:52:42 -08:00
parent 74b59efd5f
commit a55ea1e50f
3 changed files with 38 additions and 2 deletions

View file

@ -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

View file

@ -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

View file

@ -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"