Class: MegalabsSms::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/megalabs_sms.rb

Overview

Класс для взаимодействия с API Megalabs для отправки SMS

Constant Summary collapse

DEFAULT_ENDPOINT =
URI('https://a2p-api.megalabs.ru/sms/v1/sms')
DEFAULT_OPEN_TIMEOUT =
ClientConfig::DEFAULTS[:open_timeout]
DEFAULT_READ_TIMEOUT =
ClientConfig::DEFAULTS[:read_timeout]

Instance Method Summary collapse

Constructor Details

#initialize(api_user, api_password, **options) ⇒ Client

Конструктор, инициализирующий параметры клиента:

Parameters:

  • api_user (String)

    логин для Basic Auth

  • api_password (String)

    пароль для Basic Auth

  • options (Hash)

    доп. настройки клиента

Options Hash (**options):

  • :sleep_time (Float)

    время задержки в секундах (по умолчанию 0)

  • :success_stub (Boolean)

    эмулировать успешную отправку?

  • :error_stub (Boolean)

    эмулировать ошибку отправки?

  • :logger (Logger, nil)

    логгер для вывода сообщений (по умолчанию nil)

  • :open_timeout (Numeric)

    таймаут на открытие соединения

  • :read_timeout (Numeric)

    таймаут на чтение ответа

Raises:

  • (ArgumentError)

    если api_user или api_password отсутствуют или пусты



35
36
37
38
39
40
# File 'lib/megalabs_sms.rb', line 35

def initialize(api_user, api_password, **options)
  ClientConfig.validate_credentials!(api_user, api_password)
  options = ClientConfig.normalize(options)
  ClientConfig.validate_timeouts!(options)
  ClientConfig.apply!(self, api_user, api_password, options)
end

Instance Method Details

#build_request(from, to, message) ⇒ Net::HTTP::Post (private)

Создает HTTP-запрос для отправки SMS

Parameters:

  • from (String)

    имя отправителя

  • to (String)

    номер телефона получателя

  • message (String)

    текст сообщения

Returns:

  • (Net::HTTP::Post)

    объект HTTP-запроса



114
115
116
117
118
119
120
# File 'lib/megalabs_sms.rb', line 114

def build_request(from, to, message)
  request = Net::HTTP::Post.new(DEFAULT_ENDPOINT)
  request.basic_auth(@api_user, @api_password)
  request.content_type = 'application/json'
  request.body = build_request_body(from, to, message)
  request
end

#build_request_body(from, to, message) ⇒ String (private)

Создает тело HTTP-запроса для отправки SMS

Parameters:

  • from (String)

    имя/номер отправителя

  • to (String)

    номер телефона получателя

  • message (String)

    текст сообщения

Returns:

  • (String)

    JSON-тело запроса

Raises:

  • (ArgumentError)


131
132
133
134
135
136
137
138
139
140
# File 'lib/megalabs_sms.rb', line 131

def build_request_body(from, to, message)
  digits = to.to_s.gsub(/\D/, '')
  raise ArgumentError, 'to must contain digits' if digits.empty?

  {
    from: from,
    to: digits.to_i,
    message: message
  }.to_json
end

#handle_stub_responseBoolean (private)

Обрабатывает эмуляцию ответов

Returns:

  • (Boolean)

    true если эмулируется успех, false если эмулируется ошибка



95
96
97
98
99
100
101
102
103
# File 'lib/megalabs_sms.rb', line 95

def handle_stub_response
  if @error_stub
    log(:warn, 'Stubbed error: SMS not sent')
    false
  elsif @success_stub
    log(:info, 'Stubbed success: SMS would be sent')
    true
  end
end

#http_transportMegalabsSms::HttpTransport (private)

Возвращает транспорт для HTTP-запросов

Returns:

  • (MegalabsSms::HttpTransport)


187
188
189
190
191
192
193
194
# File 'lib/megalabs_sms.rb', line 187

def http_transport
  @http_transport ||= HttpTransport.new(
    logger: @logger,
    log_prefix: method(:log_message),
    open_timeout: @open_timeout,
    read_timeout: @read_timeout
  )
end

#log(level, message) ⇒ Object (private)

Логирует сообщение, если задан логгер

Parameters:

  • level (Symbol)

    уровень логирования

  • message (String)

    сообщение



176
177
178
179
180
# File 'lib/megalabs_sms.rb', line 176

def log(level, message)
  return unless @logger

  @logger.public_send(level, log_message(message))
end

#log_message(message) ⇒ String

Метод для форматирования сообщений логирования

Parameters:

  • message (String)

    исходное сообщение для логирования

Returns:

  • (String)

    отформатированное сообщение с префиксом модуля



49
50
51
# File 'lib/megalabs_sms.rb', line 49

def log_message(message)
  "[MegalabsSms] #{message}"
end

#send_request(request) ⇒ Boolean (private)

Отправляет HTTP-запрос

Parameters:

  • request (Net::HTTP::Post)

    объект HTTP-запроса

Returns:

  • (Boolean)

    true если запрос выполнен успешно, false в случае ошибки



149
150
151
152
153
# File 'lib/megalabs_sms.rb', line 149

def send_request(request)
  success = http_transport.send_request(DEFAULT_ENDPOINT, request)
  sleep(@sleep_time) if @sleep_time.positive?
  success
end

#send_sms(from = nil, to = nil, message = nil, **kwargs) ⇒ Boolean

Метод для отправки SMS через сервис Megalabs.

Parameters:

  • from (String) (defaults to: nil)

    имя/номер отправителя

  • to (String) (defaults to: nil)

    номер телефона получателя

  • message (String) (defaults to: nil)

    текст сообщения

  • kwargs (Hash)

    альтернативные именованные аргументы

Returns:

  • (Boolean)

    true если SMS отправлено успешно, false в случае ошибки



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/megalabs_sms.rb', line 63

def send_sms(from = nil, to = nil, message = nil, **kwargs)
  if kwargs.any?
    raise ArgumentError, 'use either keyword arguments or positional arguments, not both' if from || to || message

    from = kwargs.fetch(:from)
    to = kwargs.fetch(:to)
    message = kwargs.fetch(:message)
  end

  validate_message_args!(from, to, message)
  return handle_stub_response if stub_enabled?

  request = build_request(from, to, message)
  send_request(request)
end

#stub_enabled?Boolean (private)

Проверяет, включен ли режим эмуляции ответов

Returns:

  • (Boolean)

    true если включена эмуляция успеха или ошибки, false в противном случае



86
87
88
# File 'lib/megalabs_sms.rb', line 86

def stub_enabled?
  @error_stub || @success_stub
end

#validate_message_args!(from, to, message) ⇒ Object (private)

Проверяет входные параметры отправки

Parameters:

  • from (String)

    имя/номер отправителя

  • to (String)

    номер телефона получателя

  • message (String)

    текст сообщения

Raises:

  • (ArgumentError)

    если параметры отсутствуют или пусты



164
165
166
167
168
# File 'lib/megalabs_sms.rb', line 164

def validate_message_args!(from, to, message)
  raise ArgumentError, 'from is required' if from.nil? || from.to_s.strip.empty?
  raise ArgumentError, 'to is required' if to.nil? || to.to_s.strip.empty?
  raise ArgumentError, 'message is required' if message.nil? || message.to_s.strip.empty?
end