Retrospring/lib/use_case/question/create.rb

112 lines
3.4 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module UseCase
module Question
class Create < UseCase::Base
option :source_user_id, type: Types::Coercible::Integer | Types::Nil, optional: true
option :target_user_id, type: Types::Coercible::Integer
option :content, type: Types::Coercible::String
option :anonymous, type: Types::Params::Bool, default: proc { false }
option :author_identifier, type: Types::Coercible::String | Types::Nil
option :direct, type: Types::Params::Bool, default: proc { true }
def call
2022-12-26 01:59:48 -08:00
do_checks!
2022-12-26 01:59:48 -08:00
question = create_question
return if filtered?(question)
2022-07-08 11:40:32 -07:00
increment_asked_count
2022-12-26 01:59:48 -08:00
inbox = ::Inbox.create!(user: target_user, question:, new: true)
notify(inbox)
{
2022-07-23 06:33:28 -07:00
status: 201,
resource: question,
extra: {
inbox:
}
}
end
private
2022-12-26 01:59:48 -08:00
def do_checks!
check_user
check_lock
check_anonymous_rules
check_blocks
end
def check_lock
raise Errors::InboxLocked if target_user.inbox_locked?
end
def check_anonymous_rules
if !source_user_id && !anonymous
# We can not create a non-anonymous question without a source user
raise Errors::BadRequest.new("anonymous must be set to true")
end
2022-01-24 11:48:36 -08:00
# The target user does not want questions from strangers
raise Errors::Forbidden.new("no anonymous questions allowed") if !target_user.privacy_allow_anonymous_questions && anonymous
end
def check_blocks
2022-01-24 13:46:11 -08:00
return if source_user_id.blank?
raise Errors::AskingOtherBlockedSelf if target_user.blocking?(source_user)
raise Errors::AskingSelfBlockedOther if source_user.blocking?(target_user)
end
def check_user
2022-11-13 05:38:11 -08:00
raise Errors::NotAuthorized if target_user.privacy_require_user && !source_user_id
2023-01-08 05:03:54 -08:00
raise Errors::QuestionTooLong if content.length > ::Question::SHORT_QUESTION_MAX_LENGTH && !target_user.profile.allow_long_questions
end
2022-12-26 01:59:48 -08:00
def create_question
::Question.create!(
content:,
author_is_anonymous: anonymous,
author_identifier:,
user: source_user_id.nil? ? nil : source_user,
direct:
)
end
def notify(inbox)
2022-12-26 01:59:48 -08:00
webpush_app = ::Rpush::App.find_by(name: "webpush")
target_user.push_notification(webpush_app, inbox) if webpush_app
end
def increment_asked_count
unless source_user_id && !anonymous && !direct
# Only increment the asked count of the source user if the question
# is not anonymous, and is not direct, and we actually have a source user
return
end
2022-01-24 11:48:36 -08:00
source_user.increment(:asked_count)
2022-07-08 11:40:32 -07:00
source_user.save
end
def filtered?(question)
target_user.mute_rules.any? { |rule| rule.applies_to? question } ||
(anonymous && AnonymousBlock.where(identifier: question.author_identifier, user_id: [target_user.id, nil]).any?) ||
(source_user_id && anonymous && AnonymousBlock.where(target_user_id: source_user.id, user_id: [target_user.id, nil]).any?) ||
(source_user_id && target_user.muting?(source_user))
end
def source_user
@source_user ||= ::User.find(source_user_id)
end
def target_user
@target_user ||= ::User.find(target_user_id)
end
end
end
end