/*
Сервис управления настройками квартир
*/
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 "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 RoomService {
    // Метод удаления настроек квартиры
    rpc DeleteRoom ( DeleteRoomRequest ) returns ( DeleteRoomResponse ) {
        option (google.api.http) = { delete: "/device/api/v1/room/{room_number}" };
    }
    // Метод удаления списка настроек квартиры.
    // При отсутствующем или пустом фильтре удаляются все квартиры
    rpc DeleteRoomList ( DeleteRoomListRequest ) returns ( DeleteRoomListResponse ) {
        option (google.api.http) = { delete: "/device/api/v1/room/list" };
    }
    // Метод получения настроек квартиры
    rpc GetRoom ( GetRoomRequest ) returns ( GetRoomResponse ) {
        option (google.api.http) = { get: "/device/api/v1/room/{room_number}" };
    }
    // Метод получения количества квартир
    rpc GetRoomCount ( GetRoomCountRequest ) returns ( GetRoomCountResponse ) {
        option (google.api.http) = { get: "/device/api/v1/room/count" };
    }
    // Метод получения списка настроек квартир
    rpc GetRoomList ( GetRoomListRequest ) returns ( GetRoomListResponse ) {
        option (google.api.http) = { get: "/device/api/v1/room/list" };
    }
    // Метод сохранения настроек квартиры.
    // Поддерживает создание и обновление
    rpc SaveRoom ( SaveRoomRequest ) returns ( SaveRoomResponse ) {
        option (google.api.http) = { post: "/device/api/v1/room", body: "*" };
    }
    // Метод сохранения списка настроек квартиры
    rpc SaveRoomList ( SaveRoomListRequest ) returns ( SaveRoomListResponse ) {
        option (google.api.http) = { post: "/device/api/v1/room/list", body: "*" };
    }
}
// Запрос удаления списка настроек квартиры
message DeleteRoomListRequest {
    // Фильтр квартир.
    // При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ
    RoomFilter filter = 1;
}
// Ответ на запрос удаления списка настроек квартиры
message DeleteRoomListResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип ответа
    oneof type {
        // Всего количество удаленных
        int32 data = 1;
        // Ошибка
        Error error = 2;
    }
}
// Запрос удаления настроек квартиры
message DeleteRoomRequest {
    // Номер квартиры
    string room_number = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"325\"" }
    ];
}
// Ответ на запрос удаления настроек квартиры
message DeleteRoomResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип ответа
    oneof type {
        // Ошибка
        Error error = 1;
    }
}
// Запрос получения количества квартир
message GetRoomCountRequest {
}
// Ответ на запрос получения количества квартир
message GetRoomCountResponse {
    // Тип ответа
    oneof type {
        // Всего количество
        int32 data = 1;
    }
}
// Запрос получения списка настроек квартир
message GetRoomListRequest {
    // Вариант разбиения на страницы
    oneof pagination {
        // Постраничный вывод
        RoomPaging paging = 1;
    }
}
// Ответ на запрос получения списка настроек квартир
message GetRoomListResponse {
    // Список Room
    repeated Room data = 1;
}
// Запрос получения настроек квартиры
message GetRoomRequest {
    // Номер квартиры
    string room_number = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"325\"" }
    ];
}
// Ответ на запрос получения настроек квартиры
message GetRoomResponse {
    // Тип ответа
    oneof type {
        // Квартира
        Room data = 1;
    }
}
// Квартира
message Room {
    // Номер квартиры
    string room_number = 1 [
        (google.api.field_behavior) = REQUIRED,
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"325\"" }
    ];
    // Номер Sip-переадресации вызова.
    // Диапазон: 5..200
    string sip_forwarding_number = 2 [
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
            example: "\"0041083630014L831\"",
            max_length: 200,
            min_length: 5
        }
    ];
    // Тип ответа
    oneof type {
        // Номер координатно-матричной аналоговой трубки.
        // Где пример значения K1E9D8 - это К1 = коммутатор 1; Е9 = единицы 9; Д8 = десятки 8.
        // Паттерн: /^[A-Za-z]\d[A-Za-z]\d[A-Za-z]\d$/
        string analog_phone_cms_number = 3 [
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"K1E9D8\"" }
        ];
        // Номер цифровой трубки.
        // Диапазон: 1..255
        int32 analog_phone_digital_number = 4 [
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"234\"" }
        ];
    }
    // Признак блокировки аналоговой (CMS) или адресно-цифровой (digital headset) трубки
    bool is_analog_phone_blocked = 5 [
        (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "false" }
    ];
}
// Фильтр квартир.
// При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ
message RoomFilter {
    // По номерам квартир.
    // При пустом массиве удалятся все квартиры
    repeated string room_numbers = 1;
}
// Постраничный вывод
message RoomPaging {
    // Количество записей на страницу.
    // Если значение 0 (не передано), то будет взято значение по умолчанию.
    // # Диапазон: 0..100.
    // # По умолчанию: 20
    int32 limit = 1;
    // Сдвиг.
    // # Диапазон: 0..2147483647
    int32 offset = 2;
}
// Запрос сохранения списка настроек квартиры
message SaveRoomListRequest {
    // Список Room
    repeated Room data = 1;
}
// Ответ на запрос сохранения списка настроек квартиры
message SaveRoomListResponse {
    // Ошибка запроса
    message Error {
        // Номер квартиры
        string room_number = 1 [
            (google.api.field_behavior) = REQUIRED,
            (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"325\"" }
        ];
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 2;
        }
    }
    // Список Room
    repeated Room data = 1;
    // Список ошибок
    repeated Error errors = 2;
}
// Запрос сохранения настроек квартиры
message SaveRoomRequest {
    // Квартира
    Room data = 1 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос сохранения настроек квартиры
message SaveRoomResponse {
    // Ошибка запроса
    message Error {
        // Причина ошибки
        oneof reason {
            // Ошибка валидации
            ValidationError validation = 1;
        }
    }
    // Тип ответа
    oneof type {
        // Квартира
        Room data = 1;
        // Ошибка
        Error error = 2;
    }
}
