2022-01-23 10:25:56 -08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module UseCase
|
|
|
|
module Question
|
|
|
|
class CreateFollowers < UseCase::Base
|
|
|
|
option :source_user_id, type: Types::Coercible::Integer
|
|
|
|
option :content, type: Types::Coercible::String
|
|
|
|
option :author_identifier, type: Types::Coercible::String | Types::Nil
|
2023-12-11 14:14:58 -08:00
|
|
|
option :send_to_own_inbox, type: Types::Params::Bool, default: proc { false }
|
2022-01-23 10:25:56 -08:00
|
|
|
|
|
|
|
def call
|
2024-03-10 12:30:21 -07:00
|
|
|
check_question
|
|
|
|
|
2022-01-23 10:25:56 -08:00
|
|
|
question = ::Question.create!(
|
2023-02-13 11:14:20 -08:00
|
|
|
content:,
|
2022-01-23 10:25:56 -08:00
|
|
|
author_is_anonymous: false,
|
2023-02-13 11:14:20 -08:00
|
|
|
author_identifier:,
|
2022-07-24 13:24:24 -07:00
|
|
|
user: source_user,
|
2023-11-01 00:45:56 -07:00
|
|
|
direct: false,
|
2022-01-23 10:25:56 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
increment_asked_count
|
2023-02-13 11:13:32 -08:00
|
|
|
increment_metric
|
2022-01-23 10:25:56 -08:00
|
|
|
|
2023-11-01 00:45:56 -07:00
|
|
|
args = source_user.followers.map { |f| [f.id, question.id] }
|
2023-12-11 14:14:58 -08:00
|
|
|
SendToInboxJob.perform_async(source_user_id, question.id) if send_to_own_inbox
|
2023-12-11 10:54:56 -08:00
|
|
|
SendToInboxJob.perform_bulk(args)
|
2022-01-23 10:25:56 -08:00
|
|
|
|
|
|
|
{
|
2022-07-23 06:33:28 -07:00
|
|
|
status: 201,
|
2023-02-13 11:14:20 -08:00
|
|
|
resource: question,
|
2022-01-23 10:25:56 -08:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2024-03-10 12:30:21 -07:00
|
|
|
def check_question
|
|
|
|
raise Errors::QuestionTooLong if content.length > ::Question::LONG_QUESTION_MAX_LENGTH
|
|
|
|
end
|
|
|
|
|
2022-01-23 10:25:56 -08:00
|
|
|
def increment_asked_count
|
2023-01-02 00:24:34 -08:00
|
|
|
source_user.increment(:asked_count)
|
|
|
|
source_user.save
|
2022-01-23 10:25:56 -08:00
|
|
|
end
|
|
|
|
|
2023-02-13 11:13:32 -08:00
|
|
|
def increment_metric
|
|
|
|
Retrospring::Metrics::QUESTIONS_ASKED.increment(
|
|
|
|
labels: {
|
|
|
|
anonymous: false,
|
|
|
|
followers: true,
|
|
|
|
generated: false,
|
2023-11-01 00:45:56 -07:00
|
|
|
},
|
2023-02-13 11:13:32 -08:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2022-01-23 10:25:56 -08:00
|
|
|
def source_user
|
2023-11-01 00:45:56 -07:00
|
|
|
@source_user ||= ::User.includes(:followers).find(source_user_id)
|
2022-01-23 10:25:56 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|