Изменить архитектуру приложения Ruby на более объектно-ориентированный, читабельный - PullRequest
1 голос
/ 10 февраля 2020

Я работаю над ботом 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

Я не думаю, что это хороший подход, я должен создать дополнительный класс, где все эти классы будет называться? или может мне стоит использовать монады?

...