# frozen_string_literal: true module Admin class TagsController < BaseController before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all] before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all] before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all] def index authorize :tag, :index? @tags = filtered_tags.page(params[:page]) @form = Form::TagBatch.new end def batch @form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing flash[:alert] = I18n.t('admin.accounts.no_account_selected') ensure redirect_to admin_tags_path(filter_params) end def approve_all Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'approve').save redirect_to admin_tags_path(filter_params) end def reject_all Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'reject').save redirect_to admin_tags_path(filter_params) end def show authorize @tag, :show? end def update authorize @tag, :update? if @tag.update(tag_params.merge(reviewed_at: Time.now.utc)) redirect_to admin_tag_path(@tag.id), notice: I18n.t('admin.tags.updated_msg') else render :show end end private def set_tag @tag = Tag.find(params[:id]) end def set_usage_by_domain @usage_by_domain = @tag.statuses .with_public_visibility .excluding_silenced_accounts .where(Status.arel_table[:id].gteq(Mastodon::Snowflake.id_at(Time.now.utc.beginning_of_day))) .joins(:account) .group('accounts.domain') .reorder('statuses_count desc') .pluck('accounts.domain, count(*) AS statuses_count') end def set_counters @accounts_today = @tag.history.first[:accounts] @accounts_week = Redis.current.pfcount(*current_week_days.map { |day| "activity:tags:#{@tag.id}:#{day}:accounts" }) end def filtered_tags TagFilter.new(filter_params).results end def filter_params params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) end def tag_params params.require(:tag).permit(:name, :trendable, :usable, :listable) end def current_week_days now = Time.now.utc.beginning_of_day.to_date (Date.commercial(now.cwyear, now.cweek)..now).map do |date| date.to_time(:utc).beginning_of_day.to_i end end def form_tag_batch_params params.require(:form_tag_batch).permit(:action, tag_ids: []) end def action_from_button if params[:approve] 'approve' elsif params[:reject] 'reject' end end end end