Я работаю над ботом Slack для службы поддержки, который отправляет прямое сообщение пользователю на Slack, когда его билет будет в статусе user_action_needed
. Я использую AWS Lambda для обработки входящих веб-заданий Jira. Все работает хорошо, но я думаю, что у меня проблема со всей архитектурой приложения - я уверен, что код не так удобен для чтения, имя класса, вероятно, не соответствует тому, что они делают.
Прежде всего У меня есть handler
на AWS лямбда-выражениях:
module JiraHandler
extend self
def handle(event:, _context:)
Parsers::JiraParser.new(event).call
{ statusCode: 200 }
end
end
Parsers::JiraParser
отвечает не только за анализ событий, но и вызывает другой класс, который захватывает userId
из Slack, а затем внутри GetUserId
У меня есть другой класс, который отправляет сообщение пользователю. Таким образом, в конце, если вы позвоните в класс Parsers::JiraParser
, вы получите слабое сообщение вместо проанализированных данных.
Подробности того, что я написал о каждом классе ниже:
Parsers::JiraParser
module Parsers
class JiraParser
def initialize(event)
payload = event['body']
@event = JSON.parse(payload)
end
def call
::Slack::GetUserId.new(reporter_email, reporter_name, ticket_number).call
end
# reporter_email, reporter_name, ticket_number are methods to pull data by .dig from event hash
GetUserId
class GetUserId
SLACK_LOOKUP_BY_EMAIL = 'https://slack.com/api/users.lookupByEmail'
def initialize(email, name, ticket_number)
@email = email
@name = name
@ticket_number = ticket_number
end
def call
user_id = set_slack_user.dig('user', 'id')
::Slack::SlackMessenger.new(user_id, name, ticket_number).call
end
def set_slack_user
HTTParty.get(SLACK_LOOKUP_BY_EMAIL, options)
end
SlackMessanger
module Slack
class SlackMessenger
SLACK_API_ENDPOINT = 'https://slack.com/api/chat.postMessage'
def initialize(user_id, name, ticket_number)
@user_id = user_id
@name = name
@ticket_number = ticket_number
end
def call
HTTParty.post(SLACK_API_ENDPOINT, body: params, headers: headers)
end
Я не думаю, что это хороший подход, я должен создать дополнительный класс, где все эти классы будет называться? или может мне стоит использовать монады?