Matchu
b8a8cb9b20
Idk if this used to be different or what, but it looks like the current behavior is: if you delete a closet list, it'll leave the hangers present, but Classic DTI would not show them anywhere; but Impress 2020 (until recently) would crash about it. Now, we use `dependent: :destroy` to delete the hangers when you delete the list (which I think makes sense, and is different than what I decided in the past but that's ok, and is what the current behavior *looks* like to people!), and we add a migration that deletes orphaned hangers. The migration also outputs the deleted hangers as JSON, for us to hold onto in case we made a mistake! I'm also backing up the database in advance of running this migration, just in case we gotta roll back HARD!
107 lines
2.3 KiB
Ruby
107 lines
2.3 KiB
Ruby
class ClosetList < ApplicationRecord
|
|
belongs_to :user
|
|
has_many :hangers, class_name: 'ClosetHanger', foreign_key: 'list_id', dependent: :destroy
|
|
|
|
validates :name, :presence => true, :uniqueness => {:scope => :user_id}
|
|
validates :user, :presence => true
|
|
validates :hangers_owned, :inclusion => {:in => [true, false], :message => "can't be blank"}
|
|
|
|
scope :alphabetical, -> { order(:name) }
|
|
scope :publicly_visible, -> {
|
|
where(arel_table[:visibility].gteq(ClosetVisibility[:public].id))
|
|
}
|
|
scope :visible_to, ->(user) {
|
|
condition = arel_table[:visibility].gteq(ClosetVisibility[:public].id)
|
|
condition = condition.or(arel_table[:user_id].eq(user.id)) if user
|
|
where(condition)
|
|
}
|
|
|
|
after_save :sync_hangers_owned!
|
|
|
|
def sync_hangers_owned!
|
|
if hangers_owned_changed?
|
|
hangers.each do |hanger|
|
|
hanger.owned = hangers_owned
|
|
hanger.save!
|
|
end
|
|
end
|
|
end
|
|
|
|
def try_non_null(method_name)
|
|
send(method_name)
|
|
end
|
|
|
|
module VisibilityMethods
|
|
delegate :trading?, to: :visibility_level
|
|
|
|
def visibility_level
|
|
ClosetVisibility.levels[visibility]
|
|
end
|
|
|
|
def trading_changed?
|
|
return false unless visibility_changed?
|
|
level_change = visibility_change.map { |v| ClosetVisibility.levels[v] }
|
|
old_trading, new_trading = level_change.map(&:trading?)
|
|
old_trading != new_trading
|
|
end
|
|
end
|
|
|
|
include VisibilityMethods
|
|
|
|
class Null
|
|
include VisibilityMethods
|
|
attr_reader :user
|
|
|
|
def initialize(user)
|
|
@user = user
|
|
end
|
|
|
|
def hangers
|
|
user.closet_hangers.unlisted.where(owned: hangers_owned)
|
|
end
|
|
|
|
def hangers_owned?
|
|
hangers_owned
|
|
end
|
|
|
|
def try_non_null(method_name)
|
|
nil
|
|
end
|
|
end
|
|
|
|
class NullOwned < Null
|
|
def hangers_owned
|
|
true
|
|
end
|
|
|
|
def visibility
|
|
user.owned_closet_hangers_visibility
|
|
end
|
|
|
|
def visibility_changed?
|
|
user.owned_closet_hangers_visibility_changed?
|
|
end
|
|
|
|
def visibility_change
|
|
user.owned_closet_hangers_visibility_change
|
|
end
|
|
end
|
|
|
|
class NullWanted < Null
|
|
def hangers_owned
|
|
false
|
|
end
|
|
|
|
def visibility
|
|
user.wanted_closet_hangers_visibility
|
|
end
|
|
|
|
def visibility_changed?
|
|
user.wanted_closet_hangers_visibility_changed?
|
|
end
|
|
|
|
def visibility_change
|
|
user.wanted_closet_hangers_visibility_change
|
|
end
|
|
end
|
|
end
|