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

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/descriptor.proto";
import "google/protobuf/wrappers.proto";

package keyapis.omnichat.v1;

option java_package = "ru.keyapis.omnichat.v1";
option java_outer_classname = "KeyapisOmnichatV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_omnichat_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Omnichat.V1";
option objc_class_prefix = "KEYAPISOMNICHATV1";
option php_namespace = "Keyapis\\Omnichat\\V1";
option ruby_package = "Keyapis::Omnichat::V1";
option optimize_for = LITE_RUNTIME;

// Сервис для авторизации в омничате
service CredentialsService {
  // Метод получение реквизитов для авторизации в Omnichat.
  // Метод доступен для: master, employee, owner
  rpc PostCredentials(PostCredentialsRequest) returns (PostCredentialsResponse) {
    option (google.api.http) = {
      post: "/omnichat/api/v1/credentials"
      body: "*"
    };
  }
}

// Метаданные клиента
message ClientMetadata {
  // Версия приложения.
  // # Диапазон: 1..128
  google.protobuf.StringValue app_version = 1;
  // Версия операционной системы.
  // # Диапазон: 1..128
  google.protobuf.StringValue os_version = 2;
  // Модель устройства.
  // # Диапазон: 1..128
  google.protobuf.StringValue device_model = 3;
  // Название приложения.
  // Для разных приложений мы можем использовать разные tenantId и channel_id, сопоставление хранится в конфиге сервиса
  string app_name = 4 [(google.api.field_behavior) = REQUIRED];
}

// Реквезиты для авторизации в omnichat
message Credentials {
  // Закодированные в base64 клиентские данные.
  // Состав: appVersion, os, deviceModel, tenantId, login, phone, email, group_id, address, лицевые счета
  string payload = 1 [(google.api.field_behavior) = REQUIRED];
  // HMAC-подпись от payload (клиентских данных)
  string hash = 2 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор канала в omnichat.
  // Определяется исходя из типа приложения
  int32 channel_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Запрос реквезитов для авторизации в Omnichat
message PostCredentialsRequest {
  // Метаданные клиента
  ClientMetadata client_metadata = 1 [(google.api.field_behavior) = REQUIRED]; 
}

// Ответ на запрос реквезитов для авторизации в Omnichat
message PostCredentialsResponse {
  // Ошибка запроса получения хешированной информации о пользователе
  message Error {
    // Переданное название приложения не поддерживается
    message AppNameUnsupported{}
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
      // Переданное название приложения не поддерживается
      AppNameUnsupported app_name_unsupported = 2;
    }
  }
  // Тип результата
  oneof type {
    // Реквизиты
    Credentials data = 1;
    // Ошибка
    Error error = 2;
  }
}

// Ошибки валидации.
// Эти проверки выполняются до обращения в базу данных
message ValidationError {
  // Путь к полю в формате наименования прото
  string path = 1 [(google.api.field_behavior) = REQUIRED];
  // Валидационное сообщение
  string message = 2 [(google.api.field_behavior) = REQUIRED];
}