Matchu
d97c32b5da
Some important little upgrades but mostly straightforward! Note that there's still a known issue where item searches crash, I was hoping that this was a bug in Rails 4.2 that would be fixed on upgading to 5, but nope, oh well! Also uhh I just got a bit silly and didn't actually mean to go all the way to 5.2 in one go, I had meant to start at 5.0… but tbh the 5.1 and 5.2 changes seem small, and this seems to be working, so. Yeah ok let's roll!
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'
|
|
|
|
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
|