Разработать веб-сервис имитирующий отправку сообщений в мессенжеры (такие как Telegram, или Viber)
Сервис должен:
- планировать отправку сообщений на заданное время;
- сообщать о невалидных параметрах (в т.ч. неизвестных мессендерах);
- учитывать возможность сбоев при работе с одним или несколькими параметрами;
- иметь возможность отправить одно сообщение нескольким получателям (в т.ч. в разные мессенджеры);
- иметь защиту от несанкционированного доступа.
Для разработки использовать Ruby on Rails
.
Вместо библиотек, для работы с мессенжерами использовать заглушки. Интерфес этих библиотек разработать самому.
Требований к интерфейсу сервиса нет. Реализовать наиболее удобный.
Create Web-service that simulates sending message to instant messengers (such as Telegram, or Viber).
Service must:
- to schedule message sending for a given time;
- to validate incoming parameters (including messengers);
- to consider the possibility of failures when working with one or more parameters;
- to be able to send one message to several recipients (including to different IMs);
- to have protection from unauthorized access.
Use Ruby on Rails
as platform.
Use stubs as messengers immitation. Interfaces of stubs aren't specified.
No service interface requirements.
- Создайте
conf/redis.yml
(пример:conf/redis.example.yml
).connection_string
- url для подключения кRedis
. - Создайте
conf/auth.yml
(пример:conf/auth.example.yml
).name
- логин,password
- пароль для доступа к сервису.
В остальном:
Web-приложение запускается и работает как обычное Rails-приложение.
Sidekiq - как обычый сервер Sidekiq
.
- Create
conf / redis.yml
(example:conf / redis.example.yml
).connection_string
is url to connect toRedis
. - Create
conf / auth.yml
(example:conf / auth.example.yml
).name
is login,password
is password for accessing the service.
After that, the Web app starts and runs as a normal Rails application. Sidekiq - as normal Sidekiq
server.
Сервис исполбзует базовую HTTP-авторизацию. Логин и пароль соответствуют указанным в conf/auth.yml
.
У сервиса единственная точка входа: /plan
. Принимает POST
-запросы. Принимаются запросы как с Content-Type: application/x-www-form-urlencoded
, так и с Content-Type: application/json
Структура запроса:
message: "my_message"
send_at: "shedule_time"
receivers: array_of_receivers
Где:
my_message
- текст сообщения.
send_at
- строка с датой в фроматер rfc3339. Если время уже наступило - сообщение будет отправлено сразу.
receivers
- массив получателей, каждый из которых содержит:
im: "messanger_name"
identifier: "user_identifier"
Где:
messanger_name
- строка с названием мессенджера-получатея. Для тестов добавлены мессенджеры с названиями im1
и im2
.
user_identifier
- строка с идентификатором пользовалея внутри мессенджера. Валидным является любое значение кроме пустой строки и invalid_identifier
.
Все параметры обязательны. Необходим хотя бы один получатель.
Пример запроса:
POST /plain
Host: oneretarget.com
Content-Type: application/json
{
"message": "Hello there!",
"send_at": "2118-01-31 14:00:00+03:00",
"receivers": [
{ "im": "im1", "identifier": "user1" },
{ "im": "im2", "identifier": "user2" },
]
}
Запланирует на 31.01.2018, 14:00 (МСК) отправку сообщения "Hello there!" пользователю мессенджера im1
с идентификатором user1
и пользователю мессенджера im2
с идентификатором user2
.
Сообщения вместо отправки будут выводиться в поток вывода Sidekiq'а.
В случае неудачной попытки (например в случае потери связи) будет добавлено сообщение в лог log/sending_#{Rails.env}.log
и через некоторое время произойдёт повторная попытка.
Максимум - 25 попыток. Подробности
Чтобы съимитировать такую ситуацию нужно использовать отправить "unprocessable".
The service uses basic HTTP authorization. Login and password will be taken from conf / auth.yml
.
The service has the only entry point: / plan
. It accepts POST
-requests.
Query with headers Content-Type: application / x-www-form-urlencoded
and Content-Type: application / json
are allowed.
Request structure:
message: "my_message"
send_at: "shedule_time"
receivers: array_of_receivers
Where:
my_message
- message text.
send_at
- time in rfc3339 format. If date is in past - service tries to send message without delay.
receivers
- array of receivers each one contains:
im: "messanger_name"
identifier: "user_identifier"
Where:
messanger_name
- IM's name. For testing im1
and im2
are added.
user_identifier
- receiver's identifier identifier for messenger. For testing every values except blank string and invalid_identifier
are valid.
All parameters are required. At least one receiver have to be present.
Request example:
POST /plain
Host: oneretarget.com
Content-Type: application/json
{
"message": "Hello there!",
"send_at": "2118-01-31 14:00:00+01:00",
"receivers": [
{ "im": "im1", "identifier": "user1" },
{ "im": "im2", "identifier": "user2" },
]
}
Will schedule message "Hello there!" on 31/01/2118 2:00 pm (CET) for users user1
in messenger im1
and user user2
in im2
If message sending will fail (e.g. link was missed), message will be added to log log/sending_#{Rails.env}.log
.
After short time next attempt will be made.
Maximum 25 attempts. Details
To simulate failure use "unprocessable" as message.