75 lines
2.3 KiB
Ruby
75 lines
2.3 KiB
Ruby
class Card < ApplicationRecord
|
|
include Assignable, Boostable, Colored, DraftCommentable, Engageable, Eventable, Golden,
|
|
Messages, Notifiable, Pinnable, Closeable, Scorable, Searchable, Staged,
|
|
Statuses, Taggable, Watchable
|
|
|
|
belongs_to :collection, touch: true
|
|
belongs_to :creator, class_name: "User", default: -> { Current.user }
|
|
|
|
has_many :notifications, dependent: :destroy
|
|
|
|
has_one_attached :image, dependent: :purge_later
|
|
|
|
after_save :track_due_date_change, if: :saved_change_to_due_on?
|
|
after_save :track_title_change, if: :saved_change_to_title?
|
|
after_create :assign_initial_stage
|
|
|
|
scope :reverse_chronologically, -> { order created_at: :desc, id: :desc }
|
|
scope :chronologically, -> { order created_at: :asc, id: :asc }
|
|
scope :latest, -> { order updated_at: :desc, id: :desc }
|
|
scope :in_collection, ->(collection) { where collection: collection }
|
|
|
|
scope :indexed_by, ->(index) do
|
|
case index
|
|
when "most_active" then ordered_by_activity
|
|
when "most_boosted" then ordered_by_boosts
|
|
when "newest" then reverse_chronologically
|
|
when "oldest" then chronologically
|
|
when "latest" then latest
|
|
when "stalled" then ordered_by_staleness
|
|
when "closed" then closed
|
|
end
|
|
end
|
|
|
|
scope :by_engagement_status, ->(status) do
|
|
case status.to_s
|
|
when "considering" then considering
|
|
when "doing" then doing.with_golden_first
|
|
end
|
|
end
|
|
|
|
def cache_key
|
|
[ super, collection&.name ].compact.join("/")
|
|
end
|
|
|
|
private
|
|
def track_due_date_change
|
|
if due_on.present?
|
|
if due_on_before_last_save.nil?
|
|
track_event("due_date_added", particulars: { due_date: due_on })
|
|
else
|
|
track_event("due_date_changed", particulars: { due_date: due_on })
|
|
end
|
|
elsif due_on_before_last_save.present?
|
|
track_event("due_date_removed")
|
|
end
|
|
end
|
|
|
|
def track_title_change
|
|
if title_before_last_save.present?
|
|
track_event("title_changed", particulars: {
|
|
old_title: title_before_last_save,
|
|
new_title: title
|
|
})
|
|
end
|
|
end
|
|
|
|
def assign_initial_stage
|
|
if workflow_stage = collection.workflow&.stages&.first
|
|
self.stage = workflow_stage
|
|
save! touch: false
|
|
track_event :staged, stage_id: workflow_stage.id, stage_name: workflow_stage.name
|
|
end
|
|
end
|
|
end
|