Class: MegalabsSms::Client

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

Overview

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

Instance Method Summary collapse

Constructor Details

#initialize(api_user, api_password, sleep_time: 0, success_stub: false, error_stub: false) ⇒ Client

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

Parameters:

  • api_user (String)

    логин для Basic Auth

  • api_password (String)

    пароль для Basic Auth

  • sleep_time (Float) (defaults to: 0)

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

  • success_stub (Boolean) (defaults to: false)

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

  • error_stub (Boolean) (defaults to: false)

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

Raises:

  • (ArgumentError)

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



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/megalabs_sms.rb', line 24

def initialize(api_user,
               api_password,
               sleep_time: 0,
               success_stub: false,
               error_stub: false)
  raise ArgumentError, 'api_user is required' if api_user.nil? || api_user.strip.empty?
  raise ArgumentError, 'api_password is required' if api_password.nil? || api_password.strip.empty?

  @api_user = api_user
  @api_password = api_password
  @sleep_time = sleep_time
  @success_stub = success_stub
  @error_stub = error_stub
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-запроса



101
102
103
104
105
106
107
108
# File 'lib/megalabs_sms.rb', line 101

def build_request(from, to, message)
  uri = URI('https://a2p-api.megalabs.ru/sms/v1/sms')
  request = Net::HTTP::Post.new(uri)
  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) ⇒ Net::HTTP::Post (private)

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

Parameters:

  • from (String)

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

  • to (String)

    <description>

  • message (String)

    <description>

Returns:

  • (Net::HTTP::Post)

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



119
120
121
122
123
124
125
# File 'lib/megalabs_sms.rb', line 119

def build_request_body(from, to, message)
  {
    from: from,
    to: to.gsub(/\D/, '').to_i,
    message: message
  }.to_json
end

#handle_stub_responseBoolean (private)

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

Returns:

  • (Boolean)

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



82
83
84
85
86
87
88
89
90
# File 'lib/megalabs_sms.rb', line 82

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

#log_message(message) ⇒ String

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

Parameters:

  • message (String)

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

Returns:

  • (String)

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



46
47
48
# File 'lib/megalabs_sms.rb', line 46

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

#perform_http_request(uri, request) ⇒ Boolean (private)

Выполняет HTTP-запрос

Parameters:

  • uri (URI)

    URI-адрес для запроса

  • request (Net::HTTP::Post)

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

Returns:

  • (Boolean)

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



149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/megalabs_sms.rb', line 149

def perform_http_request(uri, request)
  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
    http.request(request)
  end

  if response.is_a?(Net::HTTPSuccess)
    process_http_response(response.body)
  else
    log_message("Failed to send: #{response}") && false
  end
rescue StandardError => e
  log_message("Exception occurred: #{e.message}")
  false
end

#process_http_response(raw_body) ⇒ Boolean (private)

Обрабатывает тело ответа HTTP и возвращает корректное сообщение. Если статус ответа не соответствует ожидаемому, возвращает сообщение об ошибке.

Parameters:

  • raw_body (String)

    оригинальный ответ от HTTP-запроса

Returns:

  • (Boolean)

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



172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/megalabs_sms.rb', line 172

def process_http_response(raw_body)
  body = raw_body.dup.force_encoding('UTF-8')
  parsed = JSON.parse(body)
  result = parsed.dig('result', 'status')
  success = result&.fetch('code', nil)&.zero? && result&.fetch('description', '')&.downcase == 'ok'
  if success
    log_message("Successfully sent: #{body}") && true
  else
    log_message("Failed to send: #{body}") && false
  end
rescue JSON::ParserError => e
  log_message("Failed to parse JSON: #{e.message}")
  false
end

#send_request(request) ⇒ Boolean (private)

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

Parameters:

  • request (Net::HTTP::Post)

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

Returns:

  • (Boolean)

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



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

def send_request(request)
  uri = URI('https://a2p-api.megalabs.ru/sms/v1/sms')
  success = perform_http_request(uri, request)
  sleep(@sleep_time) if @sleep_time.positive?
  success
end

#send_sms(from, to, message) ⇒ Boolean

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

Parameters:

  • from (String)

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

  • to (String)

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

  • message (String)

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

Returns:

  • (Boolean)

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



59
60
61
62
63
64
# File 'lib/megalabs_sms.rb', line 59

def send_sms(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 в противном случае



73
74
75
# File 'lib/megalabs_sms.rb', line 73

def stub_enabled?
  @error_stub || @success_stub
end