/*
  Сервис реализует функционал управления шаблонами пользовательских групп
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "keyapis/access_management/v1/keyapis_access_management_group_v1.proto";

package keyapis.access_management.v1;

option java_package = "ru.keyapis.access_management.v1";
option java_outer_classname = "KeyapisAccessManagementV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_access_management_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.AccessManagement.V1";
option objc_class_prefix = "KEYAPISACCESSMANAGEMENTV1";
option php_namespace = "Keyapis\\AccessManagement\\V1";
option ruby_package = "Keyapis::AccessManagement::V1";
option optimize_for = LITE_RUNTIME;

// Сервис управления шаблонами пользовательских групп
service GroupTemplateService {
    // Метод получения шаблона группы.
    // Метод доступен для: admin, service, bti, seller
    rpc GetGroupTemplate (GetGroupTemplateRequest) returns (GetGroupTemplateResponse) {
        option (google.api.http) = {
            get: "/access_management/api/v1/group_template/{id}"
        };
    }
    // Метод получения списка шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    rpc GetGroupTemplateList (GetGroupTemplateListRequest) returns (stream GetGroupTemplateListResponse) {
        option (google.api.http) = {
            get: "/access_management/api/v1/group_template/list"
        };
    }
    // Метод получения количества шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    rpc GetGroupTemplateCount (GetGroupTemplateCountRequest) returns (GetGroupTemplateCountResponse) {
        option (google.api.http) = {
            get: "/access_management/api/v1/group_template/count"
        };
    }
    // Метод сохранения шаблона группы.
    // Поддерживает создание и обновление как UPSERT по GroupTemplate.id.
    // Метод доступен для: admin, service
    rpc PostGroupTemplate (PostGroupTemplateRequest) returns (PostGroupTemplateResponse) {
        option (google.api.http) = {
            post: "/access_management/api/v1/group_template"
            body: "*"
        };
    }
    // Метод удаления шаблона группы.
    // Проставляет дату удаления GroupTemplate.deleted_at.
    // Метод доступен для: admin, service
    rpc DeleteGroupTemplate (DeleteGroupTemplateRequest) returns (DeleteGroupTemplateResponse) {
        option (google.api.http) = {
            delete: "/access_management/api/v1/group_template/{id}"
        };
    }
    // Метод получения списка связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    rpc GetGroupTemplateGroupList (GetGroupTemplateGroupListRequest) returns (stream GetGroupTemplateGroupListResponse) {
        option (google.api.http) = {
            get: "/access_management/api/v1/group_template/group/list"
        };
    }
    // Метод получения количества связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    rpc GetGroupTemplateGroupCount(GetGroupTemplateGroupCountRequest) returns (GetGroupTemplateGroupCountResponse) {
        option (google.api.http) = {
            get: "/access_management/api/v1/group_template/group/count"
        };
    }
    // Метод сохранения связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    rpc PutGroupTemplateGroupAttach (PutGroupTemplateGroupAttachRequest) returns (PutGroupTemplateGroupAttachResponse) {
        option (google.api.http) = {
            put: "/access_management/api/v1/group_template/{group_template_group.group_template_id}/group/{group_template_group.group_id}/attach"
        };
    }
    // Метод удаления связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    rpc PutGroupTemplateGroupDetach (PutGroupTemplateGroupDetachRequest) returns (PutGroupTemplateGroupDetachResponse) {
        option (google.api.http) = {
            put: "/access_management/api/v1/group_template/{group_template_group.group_template_id}/group/{group_template_group.group_id}/detach"
        };
    }
}

// Шаблон группы пользователей
message GroupTemplate {
    // Идентификатор шаблона группы.
    // # Тип: Guid
    string id = 1;
    // Наименование шаблона группы.
    // # Диапазон: 3..256
    string title = 2 [(google.api.field_behavior) = REQUIRED];
    // Суффикс наименования группы.
    // # Диапазон: 3..256
    string group_title_suffix = 3 [(google.api.field_behavior) = REQUIRED];
    // Описание шаблона группы.
    // # Диапазон: 3..256
    string description = 4;
    // Массив атрибутов группы.
    // Эти атрибуты назначены пользователям, которые принадлежат группе.
    // # Диапазон: 0..100
    repeated Claim claims = 5;
    // Требования, означающие принадлежность пользователя к данной группе.
    // Пользователь принадлежит группе, если все атрибуты требований группы присутствуют у пользователя и имеют те же значения.
    // # Диапазон: 0..10
    repeated Claim requirements = 6;
    // Теги шаблона группы.
    // # Диапазон: 0..10
    repeated string tags = 7;
}

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

// Запрос получения количества связей шаблонов групп и группы пользователя
message GetGroupTemplateGroupCountRequest {
    // Фильтр связей шаблонов групп и группы пользователя
    GroupTemplateGroupFilter filter = 1;
}

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


// Пагинация шаблонов групп и группы пользователя
message GroupTemplateGroupPaging {
    // Справочник типов сортировки
    enum OrderByType {
        // Значение не указано
        ORDER_BY_TYPE_UNKNOWN = 0;
        // По Идентификатору группы пользователя
        GROUP_ID = 1;
        // По шаблону групп
        GROUP_TEMPLATE_ID = 2;
    }
    // Тип значения сортировки.
    // По умолчанию: 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 GetGroupTemplateGroupListResponse {
    // Тип результата
    oneof type {
        // Связь шаблона группы и группы пользователя
        GroupTemplateGroup data = 1;
    }
}

// Запрос сохранения связей шаблона группы и группы пользователя
message PutGroupTemplateGroupAttachRequest {
    // Связь шаблона группы и группы пользователя
    GroupTemplateGroup group_template_group = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос сохранения связи шаблона группы и группы пользователя
message PutGroupTemplateGroupAttachResponse {}

// Запрос удаления связей шаблона группы и группы пользователя
message PutGroupTemplateGroupDetachRequest {
    // Связь шаблона группы и группы пользователя
    GroupTemplateGroup group_template_group = 1 [(google.api.field_behavior) = REQUIRED];
}

// Связка шаблона группы и группы пользователя.
// Задает область ресурсов (resource scope), доступную пользователю.
// Используется для контроля доступа к шаблону группы
message GroupTemplateGroup {
    // Идентификатор группы.
    // # Тип: Guid
    string group_id = 1 [(google.api.field_behavior) = REQUIRED];
    // Идентификатор шаблона группы.
    // # Тип: Guid
    string group_template_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Фильтр для запроса связей шаблона группы и группы пользователя.
// При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
// При передаче нескольких разных параметров фильтра они работают в выборке через И
message GroupTemplateGroupFilter {
    // По Идентификатору группы пользователя
    repeated string group_ids = 1;
    // По шаблону группы
    repeated string group_template_ids = 2;
}

// Ответ на запрос удаления связи шаблона группы и группы пользователя
message PutGroupTemplateGroupDetachResponse {}


// Запрос получения шаблона группы
message GetGroupTemplateRequest {
    // Идентификатор шаблона группы.
    // # Тип: Guid
    string id = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос получения шаблона группы
message GetGroupTemplateResponse {
    // Ошибка запроса получения шаблона группы
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип результата
    oneof type {
        // Шаблон группы
        GroupTemplate data = 1;
        // Ошибка
        Error error = 2;
    }
}

// Запрос получения списка шаблонов групп
message GetGroupTemplateListRequest {
    // Фильтр
    GroupTemplateFilter filter = 1;
    // Вариант разбиения на страницы
    oneof pagination {
        // Пагинация
        GroupTemplatePaging paging = 2;
    }
}
// Ответ на запрос получения списка шаблонов групп
message GetGroupTemplateListResponse {
    // Ошибка запроса получения списка шаблонов групп
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип результата
    oneof type {
        // Шаблон группы
        GroupTemplate data = 1;
        // Ошибка
        Error error = 2;
    }
}

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

// Фильтр шаблонов групп.
// При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
// При передаче нескольких разных параметров фильтра они работают в выборке через И
message GroupTemplateFilter {
    // По тексту.
    // Если значение не передано то поиск по нему не производится.
    // # Диапазон: 3..64.
    // # Поиск производится по полям:
    // # - Наименование
    string text = 1;
    // По тегам.
    // # Диапазон: 0..10
    repeated string tags = 2;
}

// Пагинация шаблонов групп
message GroupTemplatePaging {
    // Справочник типов значений сортировки.
    // # Тип: byte
    enum OrderByType {
        // Значение не указано
        ORDER_BY_TYPE_UNKNOWN = 0;
        // По идентификатору
        ID = 1;
        // По наименованию
        TITLE = 2;
    }
    // Тип значения сортировки.
    // Если значение не передано, то будет взято значение по умолчанию.
    // # По умолчанию: ID
    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 PostGroupTemplateRequest {
    // Шаблон группы
    GroupTemplate data = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос сохранения шаблона группы
message PostGroupTemplateResponse {
    // Ошибка запроса сохранения шаблона группы
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип результата
    oneof type {
        // Шаблон группы
        GroupTemplate data = 1;
        // Ошибка
        Error error = 2;
    }
}

// Запрос удаления шаблона группы
message DeleteGroupTemplateRequest {
    // Идентификатор шаблона группы.
    // # Тип: Guid
    string id = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос удаления группы
message DeleteGroupTemplateResponse {}

