Implement Admin Report Notes API

This commit is contained in:
Emelia Smith 2024-11-20 20:05:06 +01:00
parent a1ac2a73ff
commit 4a3c05a5c3
No known key found for this signature in database
5 changed files with 132 additions and 0 deletions

View file

@ -0,0 +1,70 @@
# frozen_string_literal: true
class Api::V1::Admin::Reports::NotesController < Api::BaseController
include Authorization
include AccountableConcern
PERMITTED_PARAMS = %i(
content
).freeze
before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:reports' }, only: [:index, :show]
before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:reports' }, except: [:index, :show]
before_action :set_report
before_action :set_report_note, except: [:index, :create]
rescue_from ArgumentError do |e|
render json: { error: e.to_s }, status: 422
end
def index
authorize @report, :show?
render json: @report.notes.chronological.includes(:account), each_serializer: REST::Admin::ModerationNoteSerializer
end
def show
authorize @report_note, :show?
render json: @report_note, serializer: REST::Admin::ModerationNoteSerializer
end
def create
authorize :report_note, :create?
authorize @report, :update? if truthy_param?(:resolve_report) || truthy_param?(:unresolve_report)
@report_note = current_account.report_notes.new(report_note_params.merge(report_id: @report.id))
if @report_note.save!
if truthy_param?(:resolve_report)
@report.resolve!(current_account)
log_action :resolve, @report
elsif truthy_param?(:unresolve_report)
@report.unresolve!
log_action :reopen, @report
end
render json: @report_note, serializer: REST::Admin::ModerationNoteSerializer
end
end
def destroy
authorize @report_note, :destroy?
@report_note.destroy!
render_empty
end
private
def set_report
@report = Report.find(params[:report_id])
end
def set_report_note
@report_note = ReportNote.where(report_id: params[:report_id]).find(params[:id])
end
def report_note_params
params
.slice(*PERMITTED_PARAMS)
.permit(*PERMITTED_PARAMS)
end
end

View file

@ -5,6 +5,10 @@ class ReportNotePolicy < ApplicationPolicy
role.can?(:manage_reports)
end
def show?
role.can?(:manage_reports)
end
def destroy?
owner? || (role.can?(:manage_reports) && role.overrides?(record.account.user_role))
end

View file

@ -0,0 +1,31 @@
# frozen_string_literal: true
class REST::Admin::AccountMinimalSerializer < ActiveModel::Serializer
include RoutingHelper
attributes :id, :username, :acct, :display_name, :uri, :url, :avatar, :avatar_static
def id
object.id.to_s
end
def acct
object.pretty_acct
end
def url
ActivityPub::TagManager.instance.url_for(object)
end
def uri
ActivityPub::TagManager.instance.uri_for(object)
end
def avatar
full_asset_url(object.unavailable? ? object.avatar.default_url : object.avatar_original_url)
end
def avatar_static
full_asset_url(object.unavailable? ? object.avatar.default_url : object.avatar_static_url)
end
end

View file

@ -0,0 +1,25 @@
# frozen_string_literal: true
class REST::Admin::ModerationNoteSerializer < ActiveModel::Serializer
include RoutingHelper
attributes :id, :content, :created_at, :updated_at, :target
belongs_to :account, serializer: REST::Admin::AccountMinimalSerializer
def id
object.id.to_s
end
def content
object.content.strip
end
def target
case object
when ReportNote
{ type: 'Report', id: object.report_id.to_s, url: api_v1_admin_report_url(object.report) }
when AccountModerationNote
{ type: 'Account', id: object.target_account_id.to_s, url: api_v1_admin_account_url(object.target_account) }
end
end
end

View file

@ -254,6 +254,8 @@ namespace :api, format: false do
post :reopen
post :resolve
end
resources :notes, controller: 'reports/notes', except: [:new, :edit, :update]
end
resources :domain_allows, only: [:index, :show, :create, :destroy]