/*
Сервис профилей шифрования устройства
*/
syntax = "proto3";
package deviceapis.device.v1;
import "deviceapis/device/v1/deviceapis_device_common_v1.proto";
import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/wrappers.proto";
option cc_enable_arenas = true;
option csharp_namespace = "Deviceapis.Device.V1";
option go_package = "/deviceapis_device_v1";
option java_multiple_files = false;
option java_outer_classname = "DeviceapisDeviceV1Proto";
option java_package = "ru.deviceapis.device.v1";
option java_string_check_utf8 = true;
option objc_class_prefix = "DEVICEAPISDEVICEV1";
option optimize_for = LITE_RUNTIME;
option php_namespace = "Deviceapis\\Device\\V1";
option ruby_package = "Deviceapis::Device::V1";
// Сервис профилей шифрования устройства
service EncryptionProfileService {
    // Метод удаления единичной сущности EncryptionProfile по ключу
    rpc DeleteEncryptionProfile ( DeleteEncryptionProfileRequest ) returns ( DeleteEncryptionProfileResponse ) {
        option (google.api.http) = {
            delete: "/device/api/v1/encryption_profile/{id}"
        };
    }
    // Метод удаления списка сущностей EncryptionProfile по фильтру
    rpc DeleteEncryptionProfileList ( DeleteEncryptionProfileListRequest ) returns ( DeleteEncryptionProfileListResponse ) {
        option (google.api.http) = { delete: "/device/api/v1/encryption_profile/list" };
    }
    // Метод получения единичной сущности EncryptionProfile по ключу
    rpc GetEncryptionProfile ( GetEncryptionProfileRequest ) returns ( GetEncryptionProfileResponse ) {
        option (google.api.http) = { get: "/device/api/v1/encryption_profile/{id}" };
    }
    // Метод получения списка сущностей EncryptionProfile по фильтру
    rpc GetEncryptionProfileList ( GetEncryptionProfileListRequest ) returns ( GetEncryptionProfileListResponse ) {
        option (google.api.http) = { get: "/device/api/v1/encryption_profile/list" };
    }
    // Метод создания сущности EncryptionProfile
    rpc SaveEncryptionProfile ( SaveEncryptionProfileRequest ) returns ( SaveEncryptionProfileResponse ) {
        option (google.api.http) = { post: "/device/api/v1/encryption_profile", body: "*" };
    }
}
// Запрос удаления списка сущностей EncryptionProfile по фильтру
message DeleteEncryptionProfileListRequest {
}
// Ответ на запрос удаления списка сущностей EncryptionProfile по фильтру
message DeleteEncryptionProfileListResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
            // Ошибка удаления
            EncryptionProfile.DeletingError deleting = 2;
        }
    }
    // Тип ответа
    oneof type {
        // Всего количество удаленных
        int32 data = 1;
        // Ошибка
        Error error = 2;
    }
}
// Запрос удаления единичной сущности EncryptionProfile по ключу
message DeleteEncryptionProfileRequest {
    // Идентификатор.
    // Тип: Guid
    string id = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос удаления единичной сущности EncryptionProfile по ключу
message DeleteEncryptionProfileResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
            // Ошибка удаления
            EncryptionProfile.DeletingError deleting = 2;
        }
    }
    // Тип ответа
    oneof type {
        // Всего количество удаленных
        int32 data = 1;
        // Ошибка
        Error error = 2;
    }
}
// Профиль шифрования
message EncryptionProfile {
    // Ошибка удаления
    message DeletingError {
        // Профиль шифрования используется на устройстве
        message EncryptionProfileInUse {
        }
        // Идентификатор профиля шифрования, к которому относится ошибка.
        // Тип: Guid
        string id = 1 [(google.api.field_behavior) = REQUIRED];
        // Причина ошибки
        oneof reason {
            // Профиль используется на устройстве
            EncryptionProfileInUse encryption_profile_in_use = 2;
        }
    }
    // Ошибка сохранения.
    // Эти проверки выполняются при работе с базой данных и сторонними сервисами
    message SavingError {
        // Профиль с таким наименованием уже существует
        message DuplicateName {
        }
        // Превышено допустимое количество профилей шифрования
        message TooMuchEncryptionProfiles {
        }
        // Причина ошибки
        oneof reason {
            // Профиль с таким наименованием уже существует
            DuplicateName duplicate_name = 1;
            // Превышено допустимое количество профилей шифрования
            TooMuchEncryptionProfiles too_much_encryption_profiles = 2;
        }
    }
    // Тип
    enum Type {
        // Значение не указано
        TYPE_UNKNOWN = 0;
        // Тип SL3
        SL3 = 1;
        // Тип SL1
        SL1 = 2;
    }
    // Идентификатор.
    // Тип: Guid
    string id = 1;
    // Наименование
    string title = 2 [(google.api.field_behavior) = REQUIRED];
    // Тип
    Type type = 3 [(google.api.field_behavior) = REQUIRED];
    // Номер сектора
    int32 sector_number = 4 [(google.api.field_behavior) = REQUIRED];
    // Номер блока
    int32 block_number = 5 [(google.api.field_behavior) = REQUIRED];
    // Первый байт в блоке
    int32 start_index = 6 [(google.api.field_behavior) = REQUIRED];
    // Последний байт в блоке
    int32 end_index = 7 [(google.api.field_behavior) = REQUIRED];
    // Пароль.
    // Не возвращается с сервера.
    // TODO: в генерации сваггера не показывать INPUT_ONLY поля в ответах
    string password = 8 [(google.api.field_behavior) = INPUT_ONLY];
}
// Фильтр по профилям шифрования
message EncryptionProfileFilter {
    // Поиск по тексту.
    // Если значение не передано то поиск по нему не производится.
    // Поиск производится по полям:
    // # - Наименование
    google.protobuf.StringValue text = 1;
}
// Запрос получения списка сущностей EncryptionProfile по фильтру
message GetEncryptionProfileListRequest {
    // Фильтр по профилям шифрования
    EncryptionProfileFilter filter = 1;
}
// Ответ на запрос получения списка сущностей EncryptionProfile по фильтру
message GetEncryptionProfileListResponse {
    // Список EncryptionProfile
    repeated EncryptionProfile data = 1;
}
// Запрос получения единичной сущности EncryptionProfile по ключу
message GetEncryptionProfileRequest {
    // Идентификатор.
    // Тип: Guid
    string id = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос получения единичной сущности EncryptionProfile по ключу
message GetEncryptionProfileResponse {
    // Тип ответа
    oneof type {
        // Профиль шифрования
        EncryptionProfile data = 1;
    }
}
// Запрос на создание сущности EncryptionProfile
message SaveEncryptionProfileRequest {
    // Профиль шифрования
    EncryptionProfile data = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос на создание сущности EncryptionProfile
message SaveEncryptionProfileResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
            // Ошибка сохранения
            EncryptionProfile.SavingError saving = 2;
        }
    }
    // Тип ответа
    oneof type {
        // Профиль шифрования
        EncryptionProfile data = 1;
        // Ошибка
        Error error = 2;
    }
}
