retrospring/lib/use_case/report/create.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

72 lines
1.9 KiB
Ruby
Raw Normal View History

2025-03-08 15:09:08 +01:00
# frozen_string_literal: true
module UseCase
module Report
class Create < UseCase::Base
option :reporter_id, type: Types::Coercible::Integer
option :object_id, type: Types::Coercible::String
option :object_type, type: Types::Coercible::String
option :reason, type: Types::Coercible::String, optional: true
def call
do_checks!
report = create_report
{
status: 201,
resource: report,
}
end
private
def do_checks!
check_object_type
check_object_exists
end
def check_object_type
valid_types = %w[answer comment question user]
return if valid_types.include?(object_type.downcase)
raise Errors::BadRequest.new("Unknown object type")
end
def check_object_exists
2025-03-09 19:37:22 +01:00
object
2025-03-08 15:09:08 +01:00
end
def create_report
target_user = if object.instance_of?(::User)
object
elsif object.respond_to? :user
object.user
end
existing = ::Report.find_by(type: "Reports::#{object.class}", target_id: object.id, user_id: reporter.id, target_user_id: target_user&.id, resolved: false)
return unless existing.nil?
::Report.create(type: "Reports::#{object.class}", target_id: object.id, user_id: reporter.id, target_user_id: target_user&.id, reason: reason)
end
def object
@object ||= case object_type.strip.capitalize
when "User"
::User.find_by_screen_name!(object_id)
2025-03-08 15:09:08 +01:00
when "Question"
::Question.find(object_id)
2025-03-08 15:09:08 +01:00
when "Answer"
::Answer.find(object_id)
2025-03-08 15:09:08 +01:00
when "Comment"
::Comment.find(object_id)
2025-03-08 15:09:08 +01:00
end
end
def reporter
@reporter ||= ::User.find(reporter_id)
end
end
end
end