/*
Спецификация АПИ управления сущностью User
*/
syntax = "proto3";
package deviceapis.device.v1;
import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "protoc-gen-openapiv2/options/annotations.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 UserService {
    // Метод удаления единичной сущности User по ключу
    rpc DeleteUser ( DeleteUserRequest ) returns ( DeleteUserResponse ) {
        option (google.api.http) = { delete: "/device/api/v1/user/{username}" };
    }
    // Метод получения списка сущностей User по фильтру
    rpc GetUserList ( GetUserListRequest ) returns ( GetUserListResponse ) {
        option (google.api.http) = { get: "/device/api/v1/user/list" };
    }
    // Метод замены имени пользователя
    rpc PostUserNameReplace ( PostUserNameReplaceRequest ) returns ( PostUserNameReplaceResponse ) {
        option (google.api.http) = {
            post: "/device/api/v1/user/{username}/name/replace",
            body: "*"
        };
    }
    // Метод замены пароля пользователя
    rpc PostUserPasswordReplace ( PostUserPasswordReplaceRequest ) returns ( PostUserPasswordReplaceResponse ) {
        option (google.api.http) = {
            post: "/device/api/v1/user/{username}/password/replace",
            body: "*"
        };
    }
    // Метод замены пароля пользователя.
    // Будут изменены только явно переданные в data.permission разрешения
    rpc PostUserPermissionReplace ( PostUserPermissionReplaceRequest ) returns ( PostUserPermissionReplaceResponse ) {
        option (google.api.http) = {
            post: "/device/api/v1/user/{username}/permission/replace",
            body: "*"
        };
    }
    // Метод создания/редактирования сущности User
    rpc SaveUser ( SaveUserRequest ) returns ( SaveUserResponse ) {
        option (google.api.http) = { post: "/device/api/v1/user", body: "*" };
    }
}
// Запрос удаления единичной сущности User по ключу
message DeleteUserRequest {
    // Имя пользователя
    string username = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
    ];
}
// Ответ на запрос удаления единичной сущности User по ключу
message DeleteUserResponse {
}
// Запрос получения списка сущностей User по фильтру
message GetUserListRequest {
}
// Ответ на запрос получения списка сущностей User по фильтру
message GetUserListResponse {
    // Список User
    repeated User data = 1;
}
// Запрос замены имени пользователя
message PostUserNameReplaceRequest {
    // Поле на замену
    message ReplaceTo {
        // Имя пользователя
        string target_username = 1 [
            (google.api.field_behavior) = REQUIRED,
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
        ];
    }
    // Имя пользователя
    string username = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
    ];
    // Поле на замену
    ReplaceTo data = 2 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос замены имени пользователя
message PostUserNameReplaceResponse {
}
// Запрос замены пароля пользователя
message PostUserPasswordReplaceRequest {
    // Поле на замену
    message ReplaceTo {
        // Пароль
        string password = 1 [
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"NewVeryStrongPassword\"" }
        ];
    }
    // Имя пользователя
    string username = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
    ];
    // Поле на замену
    ReplaceTo data = 2 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос замены пароля пользователя
message PostUserPasswordReplaceResponse {
}
// Запрос замены разрешений пользователя
message PostUserPermissionReplaceRequest {
    // Поле на замену
    message ReplaceTo {
        // Права доступа
        repeated User.Permission permission = 1 [
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
                example: "[{\"permission_name\":\"can_alarm\",\"is_enabled\":true},{\"permission_name\":\"can_reboot\",\"is_enabled\":false}]"
            }
        ];
    }
    // Имя пользователя
    string username = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
    ];
    // Поле на замену
    ReplaceTo data = 2 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос замены разрешений пользователя
message PostUserPermissionReplaceResponse {
}
// Запрос на создания/редактирование сущности User
message SaveUserRequest {
    // Пользователь
    User data = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос на создания/редактирование сущности User
message SaveUserResponse {
    // Тип ответа
    oneof type {
        // Пользователь
        User data = 1;
    }
}
// Пользователь
message User {
    // Права доступа
    message Permission {
        // Имя разрешения
        string permission_name = 1 [
            (google.api.field_behavior) = REQUIRED,
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"can_alarm\"" }
        ];
        // Наличие разрешения
        bool is_enabled = 2 [
            (google.api.field_behavior) = REQUIRED,
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"true\"" }
        ];
    }
    // Имя пользователя
    string username = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"johnDoe\"" }
    ];
    // Пароль.
    // Не возвращается с сервера.
    // TODO: в генерации сваггера не показывать INPUT_ONLY поля в ответах
    string password = 2 [
        (google.api.field_behavior) = INPUT_ONLY,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"***\"" }
    ];
    // Права доступа
    repeated Permission permission = 3 [
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
            example: "[{\"permission_name\":\"can_alarm\",\"is_enabled\":true},{\"permission_name\":\"can_reboot\",\"is_enabled\":false}]"
        }
    ];
}
