/*
  Сервис реализует функционал передачи сигналов
*/
syntax = "proto3";

package keyapis.signal.v1;

option java_package = "ru.keyapis.signal.v1";
option java_outer_classname = "KeyapisSignalV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_signal_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Signal.V1";
option objc_class_prefix = "KEYAPISSIGNALV1";
option php_namespace = "Keyapis\\Signal\\V1";
option ruby_package = "Keyapis::Signal::V1";
option optimize_for = LITE_RUNTIME;

// Сигнал.
// Если информация неизвестна то колонки заполняются следующим образом:
// 1/ Cтрока - как пустая строка;
// 2/ Цифра - как 0;
// 3/ Массив - как пустой массив;
// Некоторые данные в одних и тех же сигналах могут отсутствовать.
// Так как в момент создания сигнала их нет в тех сервисах в которых они выполняются.
// Все виды сигналов передаются в топиках: key.signal.*
message Signal {
  // Время возникновения сигнала.
  // В секундах от 01.01.1970 года в UTC.
  // Присутствует всегда
  int64 time = 1;
  // Название сигнала.
  // Присутствует всегда
  string name = 2;
  // Сущность
  message Entity {
    // Область размещения.
    // Обычно это идентификатор дома в стандарте ОРПОН.
    // Может отсутствовать
    string place_id = 1;
    // Место размещение.
    // Обычно это номер квартиры.
    // Может отсутствовать
    string place_label = 2;
    // Идентификатор пользователя.
    // Может отсутствовать
    string user_id = 3;
    // Лейбл пользователя.
    // Обычно это тип/роль пользователя.
    // Может отсутствовать
    string user_label = 4;
    // Идентификатор группы.
    // Обычно это идентификатор компании.
    // Может отсутствовать
    string group_id = 5;
    // Название группы.
    // Обычно это название компании.
    // Может отсутствовать
    string group_title = 6;
    // Идентификатор устройства.
    // Может отсутствовать
    string device_id = 7;
    // Лейбл устройства.
    // Может отсутствовать
    string device_label = 8;
    // Индекс реле устройства.
    // Может отсутствовать
    string device_relay_index = 9;
    // Идентификатор камеры.
    // Может отсутствовать
    string camera_id = 10;
    // Лейбл камеры.
    // Может отсутствовать
    string camera_label = 11;
    // Номер ключа.
    // Может отсутствовать
    string key = 12;
    // Код.
    // Может отсутствовать
    string code = 13;
    // ДТМФ код открытия.
    // Может отсутствовать
    string dtmf_code = 14;
    // Номер телефона.
    // Может отсутствовать
    string phone = 15;
    // Дополнительная полезная нагрузка.
    // К примеру дополнительные детали сущности.
    // Тут можно поместить ту информацию которая не вошла в схему, но будет полезна или стала нужна
    map<string, string> payload = 16;
    // Почтовый адрес.
    // Может отсутствовать
    string email = 17;
  }
  // Информация о субъекте действия с которым связан сигнал.
  // К чему сигнал относится.
  // Заполнено если такая информация присутствует в програмном модуле обрабатывающий запрос, иначе пусто.
  // Может отсутствовать
  Entity subject = 3;
  // Текстовая информация.
  // К примеру текст ошибки.
  // Может отсутствовать
  string message = 4;
  // Информация о подписке
  message Subscription {
    // Идентификатор подписки.
    // Может отсутствовать
    string id = 1;
    // Название подписки.
    // Может отсутствовать
    string title = 2;
    // Статус подписки.
    // Может отсутствовать
    string status = 3;
    // Привилегии подписок.
    // Может отсутствовать
    repeated string privileges = 4;
    // Дополнительная полезная нагрузка.
    // К примеру дополнительные детали подписки.
    // Тут можно поместить ту информацию которая не вошла в схему, но будет полезна или стала нужна
    map<string, string> payload = 5;
  }
  // Информация о подписке с которой связан сигнал.
  // Характеризует что доступно или не доступно пользователю.
  // Заполнено если такая информация присутствует в програмном модуле обрабатывающий запрос, иначе пусто.
  // Может отсутствовать
  Subscription subscription = 5;
  // Информация о выставленном счёте
  message Invoice {
    // Идентификато выставленного счёта.
    // Может отсутствовать
    string id = 1;
    // Назначение выставленного счёта.
    // Может отсутствовать
    string title = 2;
    // Общая сумма чека.
    // В рублях.
    // Может отсутствовать
    float total_amount = 3;
    // Статус выставленного счёта.
    // Может отсутствовать
    string status = 4;
    // Номер телефона на который пользователь хочет получить информацию об оплате.
    // Может отсутствовать
    string phone = 5;
    // Почта на которую пользователь хочет получить информацию об оплате.
    // Может отсутствовать
    string email = 6;
    // Идентификаторы товаров позиций на которые выставленн счёт.
    // Обычно это идентификаторы подписок.
    // Может отсутствовать
    repeated string position_ids = 7;
    // Дополнительная полезная нагрузка.
    // К примеру дополнительные детали выставленного счёта.
    // Тут можно поместить ту информацию которая не вошла в схему, но будет полезна или стала нужна
    map<string, string> payload = 8;
  }
  // Информация о выставленном счёте с которым связан сигнал.
  // Характеризует состояние оплаты.
  // Заполнено если такая информация присутствует в програмном модуле обрабатывающий запрос, иначе пусто.
  // Может отсутствовать
  Invoice invoice = 6;
  // Информация о объекте действия с которым связан сигнал.
  // К чему сигнал относится.
  // Заполнено если такая информация присутствует в програмном модуле обрабатывающий запрос, иначе пусто.
  // Может отсутствовать
  Entity object = 7;
  // Дополнительная полезная нагрузка.
  // К примеру тэги.
  // Тут можно поместить ту информацию которая не вошла в схему, но будет полезна или стала нужна
  map<string, string> payload = 8;
  // Мета информация.
  // Некоторая информация которая присутствует в запросе.
  // К примеру это http заголовки запроса: X-Request-Id, User-Agent, X-Forwarded-For и тд
  map<string, string> meta = 9;
}
