Files
danbooru/app/models/user_action.rb

123 lines
5.5 KiB
Ruby

# frozen_string_literal: true
class UserAction < ApplicationRecord
belongs_to :model, polymorphic: true
belongs_to :user
attribute :model_type, :string
attribute :model_id, :integer
attribute :user_id, :integer
attribute :event_type, :string
attribute :event_at, :time
def self.model_types
%w[ArtistVersion ArtistCommentaryVersion Ban BulkUpdateRequest Comment
CommentVote Dmail FavoriteGroup ForumPost ForumPostVote ForumTopic
ModAction ModerationReport NoteVersion Post PostAppeal PostApproval
PostDisapproval PostFlag PostReplacement PostVote SavedSearch TagAlias
TagImplication TagVersion Upload User UserEvent UserFeedback UserUpgrade
UserNameChangeRequest WikiPageVersion]
end
def self.for_user(user)
sql = <<~SQL.squish
(#{ArtistVersion.visible(user).select("'ArtistVersion'::character varying AS model_type, id AS model_id, updater_id AS user_id, 'create'::character varying AS event_type, created_at AS event_at").to_sql})
UNION ALL
(#{ArtistCommentaryVersion.visible(user).select("'ArtistCommentaryVersion', id, updater_id, 'create', created_at").to_sql})
UNION ALL
(#{Ban.visible(user).select("'Ban', id, user_id, 'subject', created_at").to_sql})
UNION ALL
(#{BulkUpdateRequest.visible(user).select("'BulkUpdateRequest', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{Comment.visible(user).select("'Comment', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{CommentVote.visible(user).select("'CommentVote', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{Dmail.visible(user).sent.select("'Dmail', id, from_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{FavoriteGroup.visible(user).select("'FavoriteGroup', id, creator_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{ForumPost.visible(user).select("'ForumPost', id, creator_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{ForumPostVote.visible(user).select("'ForumPostVote', id, creator_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{ForumTopic.visible(user).select("'ForumTopic', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{ModAction.visible(user).select("'ModAction', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{ModerationReport.visible(user).select("'ModerationReport', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{NoteVersion.visible(user).select("'NoteVersion', id, updater_id, 'create', created_at").to_sql})
UNION ALL
(#{Post.visible(user).select("'Post', id, uploader_id, 'create', created_at").to_sql})
UNION ALL
(#{PostAppeal.visible(user).select("'PostAppeal', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{PostApproval.visible(user).select("'PostApproval', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{PostDisapproval.visible(user).select("'PostDisapproval', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{PostFlag.visible(user).select("'PostFlag', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{PostReplacement.visible(user).select("'PostReplacement', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{PostVote.visible(user).select("'PostVote', id, user_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{SavedSearch.visible(user).select("'SavedSearch', id, user_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{TagAlias.visible(user).select("'TagAlias', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{TagImplication.visible(user).select("'TagImplication', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{TagVersion.visible(user).select("'TagVersion', id, updater_id, 'create', created_at").where("updater_id IS NOT NULL").order(created_at: :desc).to_sql})
UNION ALL
(#{Upload.visible(user).select("'Upload', id, uploader_id, 'create', created_at").order(created_at: :desc).to_sql})
UNION ALL
(#{User.visible(user).select("'User', id, id, 'create', created_at").to_sql})
UNION ALL
(#{UserEvent.visible(user).select("'UserEvent', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{UserFeedback.visible(user).select("'UserFeedback', id, creator_id, 'create', created_at").to_sql})
UNION ALL
(#{UserFeedback.visible(user).select("'UserFeedback', id, user_id, 'subject', created_at").to_sql})
UNION ALL (
(#{UserUpgrade.visible(user).select("'UserUpgrade', id, purchaser_id, 'create', created_at").where(status: [:complete, :refunded]).order(created_at: :desc).to_sql})
) UNION ALL
(#{UserNameChangeRequest.visible(user).select("'UserNameChangeRequest', id, user_id, 'create', created_at").to_sql})
UNION ALL
(#{WikiPageVersion.visible(user).select("'WikiPageVersion', id, updater_id, 'create', created_at").to_sql})
SQL
from("(#{sql}) user_actions")
end
def self.visible(user)
all
end
def self.search(params, current_user)
q = search_attributes(params, [:event_type, :user, :model], current_user: current_user)
case params[:order]
when "event_at_asc"
q = q.order(event_at: :asc, model_id: :asc)
else
q = q.apply_default_order(params)
end
q
end
def self.default_order
order(event_at: :desc, model_id: :desc)
end
def self.available_includes
[:user, :model]
end
def readonly?
true
end
end