/*
  Сервис реализует функционал управления квартирограммами.
  В настоящий момент Квартирограмма является корневым агрегатом для домов, принадлежит управляющей компании.
  На транспортном уровне определяет связи между устройствами и квартирами
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/timestamp.proto";
import "keyapis/access_control/v1/keyapis_access_control_access_control_v1.proto";
import "google/api/visibility.proto";


package keyapis.access_control.v1;

option java_package = "ru.keyapis.access_control.v1";
option java_outer_classname = "KeyapisAccessControlV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_access_control_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.AccessControl.V1";
option objc_class_prefix = "KEYAPISACCESSCONTROLV1";
option php_namespace = "Keyapis\\AccessControl\\V1";
option ruby_package = "Keyapis::AccessControl::V1";
option optimize_for = LITE_RUNTIME;

// Сервис управления квартирограммами
service FlatgrammService {
  // Метод получения облегченной квартирограммы.
  // Для пользователей типов owner, employee возвращаются только квартирограммы привязанные к компании пользователя.
  // Для пользователей типов owner, employee: в результат попадают только квартирограммы, привязанные к компании пользователя по любому из типов связи FlatgrammCompanyRelation.Type.
  // Метод доступен для: admin, manager, service, bti, ltp_first, owner, employee
  rpc GetFlatgramm(GetFlatgrammRequest) returns (GetFlatgrammResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/{id}"
    };
  }
  // Метод получения списка облегченных квартирограмм.
  // Для пользователей типов owner, employee: в результат фильтрации попадают только квартирограммы компании пользователя.
  // Для пользователей типов owner, employee: если filter.company_ids непустое и не совпадает с COMPANY_ID пользователя, метод вернет PERMISSION_DENIED = 7 (403 Forbidden).
  // Для пользователей типов owner, employee: если filter.company_ids пустое, то фильтрация по COMPANY_ID пользователя.
  // Метод доступен для: admin, manager, service, bti, ltp_first, owner, employee
  rpc GetFlatgrammList(GetFlatgrammListRequest) returns (stream GetFlatgrammListResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/list"
    };
  }
  // Метод получения количества квартирограмм.
  // Для пользователей типов owner, employee: в результат фильтрации попадают только квартирограммы компании пользователя.
  // Для пользователей типов owner, employee: если filter.company_ids непустое и не совпадает с COMPANY_ID пользователя, метод вернет PERMISSION_DENIED = 7 (403 Forbidden).
  // Для пользователей типов owner, employee: если filter.company_ids пустое, то фильтрация по COMPANY_ID пользователя.
  // Метод доступен для: admin, manager, service, bti, ltp_first, owner, employee
  rpc GetFlatgrammCount(GetFlatgrammCountRequest) returns (GetFlatgrammCountResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/count"
    };
  }
  // Метод получения списка связей квартирограмм и домофонной компании.
  // Метод доступен для: admin, service, seller
  rpc GetFlatgrammDcCompanyList (GetFlatgrammDcCompanyListRequest) returns (stream GetFlatgrammDcCompanyListResponse) {
    option deprecated = true;
    option (google.api.method_visibility).restriction = "DEPRECATED";
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/dc_company/list"
    };
  }
  // Метод получения списка связей квартирограмм и компаний.
  // Метод доступен для: admin, service, seller
  rpc GetFlatgrammCompanyRelationList (GetFlatgrammCompanyRelationListRequest) returns (stream GetFlatgrammCompanyRelationListResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/company_relation/list"
    };
  }
  // Метод получения количества связей квартирограмм и домофонной компании.
  // Метод доступен для: admin, service, seller
  rpc GetFlatgrammDcCompanyCount(GetFlatgrammDcCompanyCountRequest) returns (GetFlatgrammDcCompanyCountResponse) {
    option deprecated = true;
    option (google.api.method_visibility).restriction = "DEPRECATED";
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/dc_company/count"
    };
  }
  // Метод получения количества связей квартирограмм и компаний.
  // Метод доступен для: admin, service, seller
  rpc GetFlatgrammCompanyRelationCount(GetFlatgrammCompanyRelationCountRequest) returns (GetFlatgrammCompanyRelationCountResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/flatgramm/company_relation/count"
    };
  }
  // Метод сохранения связей квартирограмм и домофонной компании.
  // Поддерживает только создание.
  // Метод доступен для: admin, service, seller
  rpc PutFlatgrammDcCompanyAttach (PutFlatgrammDcCompanyAttachRequest) returns (PutFlatgrammDcCompanyAttachResponse) {
    option deprecated = true;
    option (google.api.method_visibility).restriction = "DEPRECATED";
    option (google.api.http) = {
      put: "/access_control/api/v1/flatgramm/{dc_company_flatgramm.flatgramm_id}/dc_company/{dc_company_flatgramm.company_id}/attach"
    };
  }
  // Метод сохранения связей квартирограммы и компании.
  // Поддерживает только создание.
  // Метод доступен для: admin, service, seller
  rpc PutFlatgrammCompanyRelationAttach (PutFlatgrammCompanyRelationAttachRequest) returns (PutFlatgrammCompanyRelationAttachResponse) {
    option (google.api.http) = {
      put: "/access_control/api/v1/flatgramm/{flatgramm_company_relation.flatgramm_id}/company_relation/{flatgramm_company_relation.company_id}/attach",
      body: "*"
    };
  }
  // Метод удаления связей квартирограмм и домофонной компании.
  // Метод доступен для: admin, service, seller
  rpc PutFlatgrammDcCompanyDetach (PutFlatgrammDcCompanyDetachRequest) returns (PutFlatgrammDcCompanyDetachResponse) {
    option deprecated = true;
    option (google.api.method_visibility).restriction = "DEPRECATED";
    option (google.api.http) = {
      put: "/access_control/api/v1/flatgramm/{dc_company_flatgramm.flatgramm_id}/dc_company/{dc_company_flatgramm.company_id}/detach"
    };
  }
  // Метод удаления связей квартирограммы и компании.
  // Метод доступен для: admin, service, seller
  rpc PutFlatgrammCompanyRelationDetach (PutFlatgrammCompanyRelationDetachRequest) returns (PutFlatgrammCompanyRelationDetachResponse) {
    option (google.api.http) = {
      put: "/access_control/api/v1/flatgramm/{flatgramm_company_relation.flatgramm_id}/company_relation/{flatgramm_company_relation.company_id}/detach",
      body: "*"
    };
  }
}

// Облегченная квартирограмма
message Flatgramm {
  // Идентификатор
  int32 id = 1;
  // Наименование
  string title = 2 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор компании - владельца
  int32 company_id = 3;
  // Дата и время создания.
  // # Тип: DateTime
  google.protobuf.Timestamp created_at = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Дата последнего изменения.
  // Заполняется и обновляется сервером.
  // Заполняется при создании и изменении.
  // Является версией объекта.
  // # Тип: DateTime
  google.protobuf.Timestamp changed_at = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Запрос на получение упрощенной квартирограммы
message GetFlatgrammRequest {
  // Идентификатор
  int32 id = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос на получение упрощенной квартирограммы
message GetFlatgrammResponse {
  // Ошибка запроса получения списка упрощенных квартирограмм
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Упрощенная квартирограмма
    Flatgramm data = 1;
    // Ошибка
    Error error = 2;
  }
}

// Запрос на получение списка упрощенных квартирограмм
message GetFlatgrammListRequest {
  // Фильтр
  FlatgrammFilter filter = 1;
  // Вариант разбиения на страницы
  oneof pagination {
    // Стандартный постраничный вывод
    FlatgrammPaging paging = 2;
  }
}

// Ответ на запрос на получение списка упрощенных квартирограмм
message GetFlatgrammListResponse {
  // Ошибка запроса получения списка упрощенных квартирограмм
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Упрощенная квартирограмма
    Flatgramm data = 1;
    // Ошибка
    Error error = 2;
  }
}

// Запрос получения количества упрощенных квартирограмм
message GetFlatgrammCountRequest {
  // Фильтр
  FlatgrammFilter filter = 1;
}

// Ответ на запрос получения количества упрощенных квартирограмм
message GetFlatgrammCountResponse {
  // Тип результата
  oneof type {
    // Всего упрощенных квартирограмм
    int32 data = 1;
  }
}

// Фильтр квартирограмм
message FlatgrammFilter {
  // По идентификаторам компаний.
  // Фильтрация среди компаний, тип связи компании и КВГ определяется по полю company_relation_types.
  // Если company_relation_types не передан, то учитываются все значения типа FlatgrammCompanyRelation.Type
  repeated int32 company_ids = 1;
  // Поиск по тексту.
  // Если значение не передано то поиск по нему не производится.
  // # Диапазон: 3..64.
  // # Поиск производится по полям:
  // # - Наименование
  string text = 2;
  // По идентификаторам компаний.
  // Фильтрация среди компаний, привязанных как домофонные компании
  repeated int32 dc_company_ids = 3 [deprecated = true, (google.api.field_visibility).restriction = "DEPRECATED"];
  // По типу связи квартирограмм и компаний
  repeated FlatgrammCompanyRelation.Type flatgramm_company_relation_types = 4;
}

// Постраничный вывод
message FlatgrammPaging {
  // Справочник типов значений сортировки.
  // # Тип: byte
  enum OrderByType {
    // Значение не указано
    ORDER_BY_TYPE_UNKNOWN = 0;
    // По идентификатору
    ID = 1;
    // По времени создания
    CREATED_AT = 2;
    // По времени изменения
    CHANGED_AT = 3;
    // По рангу для поиска по тексту.
    // Применяется когда передано поле для поиска по тексту.
    // В случае если текстовое поле не передано, применяется значение по умолчанию
    RANK = 4;
  }
  // Тип значения сортировки.
  // Если значение не передано, то будет взято значение по умолчанию.
  // # По умолчанию: CHANGED_AT
  OrderByType order_by_type = 1;
  // Справочник типов направлений сортировки.
  // # Тип: byte
  enum DirectionType {
    // Значение не указано
    DIRECTION_TYPE_UNKNOWN = 0;
    // От большего к меньшему
    DESC = 1;
    // От меньшего к большему
    ASC = 2;
  }
  // Тип направления сортировки.
  // # По умолчанию: DESC
  DirectionType direction_type = 2;
  // Количество записей на страницу.
  // Если значение 0 (не передано), то будет взято значение по умолчанию.
  // # Диапазон: 0..100.
  // # По умолчанию: 20
  int32 limit = 3;
  // Сдвиг.
  // # Диапазон: 0..2147483647
  int32 offset = 4;
}

// Запрос получения списка
message GetFlatgrammDcCompanyListRequest {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Фильтр связей квартирограмм и домофонной компании
  DcCompanyFlatgrammFilter filter = 1;
  // Вариант разбиения на страницы
  oneof pagination {
    // Пагинация
    DcCompanyFlatgrammPaging paging = 2;
  }
}

// Запрос получения списка
message GetFlatgrammCompanyRelationListRequest {
  // Фильтр связей квартирограмм и компаний
  FlatgrammCompanyRelationFilter filter = 1;
  // Вариант разбиения на страницы
  oneof pagination {
    // Пагинация
    FlatgrammCompanyRelationPaging paging = 2;
  }
}

// Запрос получения количества связей квартирограмм и домофонной компании
message GetFlatgrammDcCompanyCountRequest {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Фильтр связей квартирограмм и домофонной компании
  DcCompanyFlatgrammFilter filter = 1;
}

// Запрос получения количества связей квартирограмм и компаний
message GetFlatgrammCompanyRelationCountRequest {
  // Фильтр связей квартирограмм и компании
  FlatgrammCompanyRelationFilter filter = 1;
}

// Ответ на запрос получения количества связей квартирограмм и домофонной компании
message GetFlatgrammDcCompanyCountResponse {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
    // Всего связей квартирограмм и домофонной компании
    int32 data = 2;
  }
}

// Ответ на запрос получения количества связей квартирограмм и компаний
message GetFlatgrammCompanyRelationCountResponse {
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
    // Всего связей квартирограмм и компаний
    int32 data = 2;
  }
}

// Пагинация квартирограмм и домофонной компании
message DcCompanyFlatgrammPaging {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Справочник типов сортировки
  enum OrderByType {
    // Значение не указано
    ORDER_BY_TYPE_UNKNOWN = 0;
    // По Идентификатору домофонной компании
    COMPANY_ID = 1;
    // По Идентификатору квартирограммы
    FLATGRAMM_ID = 2;
  }
  // Тип значения сортировки.
  // По умолчанию: COMPANY_ID
  OrderByType order_by_type = 1;
  // Справочник типов направлений сортировки
  enum DirectionType {
    // Значение не указано
    DIRECTION_TYPE_UNKNOWN = 0;
    // От большего к меньшему
    DESC = 1;
    // От меньшего к большему
    ASC = 2;
  }
  // Тип направления сортировки.
  // По умолчанию: DESC
  DirectionType direction_type = 2;
  // Количество записей на страницу.
  // Минимальное значение: 1.
  // Максимальное значение: 100.
  // По умолчанию: 20.
  // Если значение 0 (не передано), то выставляем значение по умолчанию
  int32 limit = 3;
  // Сдвиг.
  // По умолчанию: 0
  int32 offset = 4;
}

// Пагинация квартирограмм и компаний
message FlatgrammCompanyRelationPaging {
  // Справочник типов сортировки
  enum OrderByType {
    // Значение не указано
    ORDER_BY_TYPE_UNKNOWN = 0;
    // По Идентификатору компании
    COMPANY_ID = 1;
    // По Идентификатору квартирограммы
    FLATGRAMM_ID = 2;
  }
  // Тип значения сортировки.
  // По умолчанию: COMPANY_ID
  OrderByType order_by_type = 1;
  // Справочник типов направлений сортировки
  enum DirectionType {
    // Значение не указано
    DIRECTION_TYPE_UNKNOWN = 0;
    // От большего к меньшему
    DESC = 1;
    // От меньшего к большему
    ASC = 2;
  }
  // Тип направления сортировки.
  // По умолчанию: DESC
  DirectionType direction_type = 2;
  // Количество записей на страницу.
  // Минимальное значение: 1.
  // Максимальное значение: 100.
  // По умолчанию: 20.
  // Если значение 0 (не передано), то выставляем значение по умолчанию
  int32 limit = 3;
  // Сдвиг.
  // По умолчанию: 0
  int32 offset = 4;
}

// Ответ на запрос получения списка связей квартирограмм и домофонной компании
message GetFlatgrammDcCompanyListResponse {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
    // Связь квартирограммы и домофонной компании
    DcCompanyFlatgramm data = 2;
  }
}

// Ответ на запрос получения списка связей квартирограмм и компаний
message GetFlatgrammCompanyRelationListResponse {
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
    // Связь квартирограммы и компании
    FlatgrammCompanyRelation data = 2;
  }
}

// Запрос сохранения связей квартирограммы и домофонной компании
message PutFlatgrammDcCompanyAttachRequest {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Связь квартирограммы и домофонной компании
  DcCompanyFlatgramm dc_company_flatgramm = 1 [(google.api.field_behavior) = REQUIRED];
}

// Запрос сохранения связей квартирограммы и компании
message PutFlatgrammCompanyRelationAttachRequest {
  // Связь квартирограммы и компании
  FlatgrammCompanyRelation flatgramm_company_relation = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос сохранения связи квартирограммы и домофонной компании
message PutFlatgrammDcCompanyAttachResponse {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Ошибка запроса сохранения связи квартирограммы и домофонной компании
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Ответ на запрос сохранения связи квартирограммы и компании
message PutFlatgrammCompanyRelationAttachResponse {
  // Ошибка запроса сохранения связи квартирограммы и компании
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос удаления связей квартирограммы и домофонной компании
message PutFlatgrammDcCompanyDetachRequest {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Связь квартирограммы и домофонной компании
  DcCompanyFlatgramm dc_company_flatgramm = 1 [(google.api.field_behavior) = REQUIRED];
}

// Запрос удаления связей квартирограммы и компании
message PutFlatgrammCompanyRelationDetachRequest {
  // Связь квартирограммы и компании
  FlatgrammCompanyRelation flatgramm_company_relation = 1 [(google.api.field_behavior) = REQUIRED];
}

// Связка квартирограммы и домофонной компании.
// Задает область ресурсов (resource scope), доступную пользователю.
// Используется для контроля доступа к квартирограмме
message DcCompanyFlatgramm {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Идентификатор домофонной компании.
  // # Диапазон: 0..2147483647
  int32 company_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор квартирограммы.
  // # Диапазон: 0..2147483647
  int32 flatgramm_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Связка квартирограммы и компании.
// Задает область ресурсов (resource scope), доступную пользователю.
// Используется для контроля доступа к квартирограмме
message FlatgrammCompanyRelation {
  // Идентификатор компании.
  // # Диапазон: 1..2147483647
  int32 company_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор квартирограммы.
  // # Диапазон: 1..2147483647
  int32 flatgramm_id = 2 [(google.api.field_behavior) = REQUIRED];
  // Тип связи компании и квартирограммы.
  // По умолчанию OWNER.
  // # Тип: byte
  enum Type {
    // Значение не указано
    TYPE_UNKNOWN = 0;
    // Управляющая компания владеет квартирограммой
    MANAGEMENT = 1;
    // Домофонная компания обслуживает квартирограмму
    DEVICE_SERVICE = 2;
  }
  // Тип связи компании и квартирограммы
  Type type = 3 [(google.api.field_behavior) = REQUIRED];
}

// Фильтр для запроса связей квартирограммы и домофонной компании.
// При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
// При передаче нескольких разных параметров фильтра они работают в выборке через И
message DcCompanyFlatgrammFilter {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // По Идентификатору домофонной компании
  repeated int32 company_ids = 1;
  // По Идентификатору квартирограммы
  repeated int32 flatgramm_ids = 2;
}

// Фильтр для запроса связей квартирограммы и компании.
// При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
// При передаче нескольких разных параметров фильтра они работают в выборке через И
message FlatgrammCompanyRelationFilter {
  // По Идентификатору квартирограммы
  repeated int32 flatgramm_ids = 1;
  // По Идентификатору компании
  repeated int32 company_ids = 2;
  // Тип назначения компании для квартирограммы
  repeated FlatgrammCompanyRelation.Type flatgramm_company_relation_types = 3;
}

// Ответ на запрос удаления связи квартирограммы и домофонной компании
message PutFlatgrammDcCompanyDetachResponse {
  option deprecated = true;
  option (google.api.message_visibility).restriction = "DEPRECATED";
  // Ошибка запроса удаления связи квартирограммы и домофонной компании
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Ответ на запрос удаления связи квартирограммы и компании
message PutFlatgrammCompanyRelationDetachResponse {
  // Ошибка запроса удаления связи квартирограммы и компании
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}
