# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/multiapp/v1/keyapis_multiapp_app_v1.proto, keyapis/multiapp/v1/keyapis_multiapp_notification_template_v1.proto, keyapis/multiapp/v1/keyapis_multiapp_notification_v1.proto, keyapis/multiapp/v1/keyapis_multiapp_partner_v1.proto, keyapis/multiapp/v1/keyapis_multiapp_system_v1.proto
# plugin: python-betterproto
import warnings
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class AppType(betterproto.Enum):
    """Справочник типов приложений. # Тип: byte"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    STANDARD = 1
    """Стандартное приложение"""


class AppStatusType(betterproto.Enum):
    """Справочник статусов приложений. # Тип: byte"""

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    BLOCKED = 1
    """Заблокирован"""

    ACTIVE = 2
    """Активен"""

    DELETED = 3
    """Удален"""


class AppPlatformType(betterproto.Enum):
    """Справочник платформ. # Тип: byte"""

    PLATFORM_TYPE_UNKNOWN = 0
    """Значение не указано"""

    IOS = 1
    """Платформа iOS. Приложение размещается в App Store"""

    ANDROID = 2
    """
    Платформа Android. Приложение размещается в Google Play, App Gallery или
    прочих сторах
    """

    WEB = 3
    """Платформа Web. Приложение размещается по интернет адресу"""


class AppGrantType(betterproto.Enum):
    """Справочник разрешений"""

    GRANT_TYPE_UNKNOWN = 0
    """Значение не указано"""

    GET_ACCESS_TOKEN = 1
    """
    Разрешение на получение авторизационного токена посредством метода GET
    /multiapp/api/v1/partner/token
    """

    GET_ID_TOKEN = 2
    """
    Разрешение на получение идентификационного доступа посредством метода GET
    /multiapp/api/v1/partner/token
    """

    POST_NOTIF_NO_ASSIGN_CHECK = 3
    """
    Разрешение на отправку уведомлений без проверки назначений приложения
    методом POST /multiapp/api/v1/notification
    """


class AppLinkType(betterproto.Enum):
    """Справочник типов ссылок. # Тип: byte"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    INTERNAL_APP = 1
    """Ссылка для перехода на раздел текущего приложения"""

    EXTERNAL_APP = 2
    """Ссылка для перехода на стороннее приложение"""

    WEB_VIEW = 3
    """
    Ссылка для перехода на веб-вью внутренних (своих) приложений. В окне
    отсутствует адресаная строка. Для iOS используется WKWebView, для Android
    используется WebView
    """

    WEB_BROWSER = 4
    """Ссылка для перехода на веб-браузер"""

    EXTERNAL_WEB_VIEW = 5
    """
    Ссылка для перехода на веб-вью внешних (партнёрских) приложений. В окне
    присутствует адресаная строка. Для iOS используется SFSafariViewController,
    для Android используется ChromeCustomTabs
    """


class AppPermissionsAllowedTokenType(betterproto.Enum):
    """Справочник разрешенных типов токена"""

    ALLOWED_TOKEN_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """Идентификационный"""

    ACCESS = 2
    """Авторизационный"""


class AppPagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CHANGED_AT = 1
    """Дата последнего изменения"""

    CREATED_AT = 2
    """Дата создания"""

    RANK = 3
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


class AppPagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


class AppLitePagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CHANGED_AT = 1
    """Дата последнего изменения"""

    CREATED_AT = 2
    """Дата создания"""


class AppLitePagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


class PartnerPagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CHANGED_AT = 1
    """Дата последнего изменения"""

    CREATED_AT = 2
    """Дата создания"""

    RANK = 3
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


class PartnerPagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


class NotificationTemplatePagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CHANGED_AT = 1
    """Дата последнего изменения"""

    CREATED_AT = 2
    """Дата создания"""

    RANK = 3
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


class NotificationTemplatePagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


@dataclass(eq=False, repr=False)
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class App(betterproto.Message):
    """Приложение. # Описание модели"""

    id: str = betterproto.string_field(1)
    """Идентификатор. Если не передан создаётся сервером. # Тип: Guid"""

    partner_id: str = betterproto.string_field(2)
    """Идентификатор партнера. # Тип: Guid"""

    type: "AppType" = betterproto.enum_field(3)
    """Тип приложения"""

    title: str = betterproto.string_field(4)
    """
    Системное наименование. Не отображается пользователям. # Диапазон: 3..256
    """

    header: Optional[str] = betterproto.message_field(5, wraps=betterproto.TYPE_STRING)
    """Заголовок. # Диапазон: 3..30"""

    subtitle: Optional[str] = betterproto.message_field(
        6, wraps=betterproto.TYPE_STRING
    )
    """Подзаголовок. # Диапазон: 3..60"""

    background_color: Optional[str] = betterproto.message_field(
        7, wraps=betterproto.TYPE_STRING
    )
    """
    Цвет заднего плана(подложки). Все цвета должны быть в формате hex
    #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн:
    /^#[0-9a-fA-F]{8}$/
    """

    status_type: "AppStatusType" = betterproto.enum_field(8)
    """Статус приложения"""

    links: List["AppLink"] = betterproto.message_field(9)
    """Ссылки для переходов. # Диапазон: 0..100"""

    user_tags: List[str] = betterproto.string_field(10)
    """
    Список тегов пользователей. Обязательное. Описывает кто может видеть
    приложение. Тэг - максимум 5 символов, значение - максимум 19 символов,
    количество сегментов - максимум 10. # Диапазон: 1..100. # Паттерн:
    /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/
    """

    app_tags: List[str] = betterproto.string_field(11)
    """
    Список тегов приложений. Обязательное. Описывает какие клиенты могут видеть
    приложение. Тэг - максимум 5 символов, значение - максимум 19 символов,
    количество сегментов - максимум 10. # Диапазон: 1..20. # Паттерн:
    /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/
    """

    created_at: datetime = betterproto.message_field(12)
    """Дата создания. # Тип: DateTime"""

    changed_at: datetime = betterproto.message_field(13)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. При
    изменении должен совпадать со значением из БД. Является версией объекта. #
    Тип: DateTime
    """

    permissions: "AppPermissions" = betterproto.message_field(14)
    """Разрешения"""

    grant_types: List["AppGrantType"] = betterproto.enum_field(15)
    """Список разрешений"""

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("permissions"):
            warnings.warn("App.permissions is deprecated", DeprecationWarning)


@dataclass(eq=False, repr=False)
class AppLink(betterproto.Message):
    """Ссылка"""

    platform_type: "AppPlatformType" = betterproto.enum_field(1)
    """Тип платформы. Обязательное"""

    type: "AppLinkType" = betterproto.enum_field(2)
    """Тип ссылки. Обязательное"""

    url: str = betterproto.string_field(3)
    """Значение ссылки для перехода. Обязательное. # Диапазон: 12..512"""

    packages: List[str] = betterproto.string_field(4)
    """
    Список пакетов. Если пусто попытка перехода осуществляется безусловно. Если
    заполнено, то переход осуществляется только в случае если хоть один пакет
    есть на устройстве, иначе обработка переходит к следующей ссылке. #
    Диапазон: 0..20
    """


@dataclass(eq=False, repr=False)
class AppPermissions(betterproto.Message):
    """Разрешения"""

    allowed_token_types: List["AppPermissionsAllowedTokenType"] = (
        betterproto.enum_field(1)
    )
    """Список разрешенных типов токена"""


@dataclass(eq=False, repr=False)
class AppSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

    conflict: "AppSavingErrorConflict" = betterproto.message_field(1, group="reason")
    """Конфликт версий"""

    partner_is_not_exist: "AppSavingErrorPartnerIsNotExist" = betterproto.message_field(
        2, group="reason"
    )
    """Переданный партнер не существует"""

    partner_is_deleted: "AppSavingErrorPartnerIsDeleted" = betterproto.message_field(
        3, group="reason"
    )
    """Переданный партнер удален"""


@dataclass(eq=False, repr=False)
class AppSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False)
class AppSavingErrorPartnerIsNotExist(betterproto.Message):
    """
    Переданный партнер не существует. Причины: - В базе нет партнера с
    переданным partner_id
    """

    pass


@dataclass(eq=False, repr=False)
class AppSavingErrorPartnerIsDeleted(betterproto.Message):
    """
    Переданный партнер удален. Причины: - В базе удален партнер с переданным
    partner_id
    """

    pass


@dataclass(eq=False, repr=False)
class AppLite(betterproto.Message):
    """Облегчённое приложение"""

    id: str = betterproto.string_field(1)
    """Идентификатор. # Тип: Guid"""

    title: str = betterproto.string_field(2)
    """Наименование. Не отображается пользователям. # Диапазон: 3..256"""

    header: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING)
    """Заголовок. # Диапазон: 3..30"""

    subtitle: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Подзаголовок. # Диапазон: 3..60"""

    background_color: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """
    Цвет заднего плана(подложки). Все цвета должны быть в формате hex
    #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн:
    /^#[0-9a-fA-F]{8}$/
    """

    status_type: "AppStatusType" = betterproto.enum_field(6)
    """Статус приложения"""

    links: List["AppLiteLinkLite"] = betterproto.message_field(7)
    """Ссылки для переходов"""


@dataclass(eq=False, repr=False)
class AppLiteLinkLite(betterproto.Message):
    """Упрощённая ссылка"""

    platform_type: "AppPlatformType" = betterproto.enum_field(1)
    """Тип платформы. Обязательное"""

    type: "AppLinkType" = betterproto.enum_field(2)
    """Тип ссылки. Обязательное"""

    url: str = betterproto.string_field(3)
    """Значение ссылки для перехода. Обязательное"""

    packages: List[str] = betterproto.string_field(4)
    """
    Список пакетов. Если пусто попытка перехода осуществляется безусловно. Если
    заполнено, то переход осуществляется только в случае если хоть один пакет
    есть на устройстве, иначе обработка переходит к следующей ссылке
    """


@dataclass(eq=False, repr=False)
class AppFilter(betterproto.Message):
    """Фильтр приложений"""

    text: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Диапазон: 3..64. # Поиск производится по полям: # - Системное наименование;
    # - Заголовок; # - Подзаголовок; # - Список тегов пользователей; # - Список
    тегов приложений
    """

    types: List["AppType"] = betterproto.enum_field(2)
    """По типам приложений"""

    partner_ids: List[str] = betterproto.string_field(3)
    """По идентификаторам партнера. # Тип: Guid"""

    status_types: List["AppStatusType"] = betterproto.enum_field(4)
    """
    По статусам приложений. Если переданы все типы, то фильтр игнорируется(так
    как нужно вернуть всё)
    """

    user_tags: List[str] = betterproto.string_field(5)
    """
    По пользовательским тегам. Тэг - максимум 5 символов, значение - максимум
    19 символов, количество сегментов - максимум 10. # Диапазон: 0..20. #
    Паттерн:
    /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/
    """

    app_tags: List[str] = betterproto.string_field(6)
    """
    По тегам приложений. Тэг - максимум 5 символов, значение - максимум 19
    символов, количество сегментов - максимум 10. # Диапазон: 0..20. # Паттерн:
    /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/
    """


@dataclass(eq=False, repr=False)
class AppLiteFilter(betterproto.Message):
    """Упрощённый фильтр по приложениям"""

    types: List["AppType"] = betterproto.enum_field(1)
    """По типам приложений"""

    user_tags: List[str] = betterproto.string_field(2)
    """
    По тегам пользователя. Тэг - максимум 5 символов, значение - максимум 19
    символов, количество сегментов - максимум 10. # Диапазон: 1..20. # Паттерн:
    /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/
    """

    app_lite_tag: "AppLiteFilterAppLiteTag" = betterproto.message_field(3)
    """Тег для приложения"""


@dataclass(eq=False, repr=False)
class AppLiteFilterAppLiteTag(betterproto.Message):
    """Тег для приложения"""

    platform_type: "AppPlatformType" = betterproto.enum_field(1)
    """Тип платформы"""

    app_name: Optional[str] = betterproto.message_field(
        2, wraps=betterproto.TYPE_STRING
    )
    """
    Название приложения, которое работает с данным сервисом. Для МП и PWA
    значение "1". # Паттерн: /^[0-9A-Z-]{1,19}$/
    """


@dataclass(eq=False, repr=False)
class AppPaging(betterproto.Message):
    """Пагинация приложений"""

    order_by_type: "AppPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: CHANGED_AT
    """

    direction_type: "AppPagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


@dataclass(eq=False, repr=False)
class AppLitePaging(betterproto.Message):
    """Пагинация упрощенных приложений"""

    order_by_type: "AppLitePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: CREATED_AT
    """

    direction_type: "AppLitePagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


@dataclass(eq=False, repr=False)
class PostAppRequest(betterproto.Message):
    """Запрос сохранения приложения"""

    data: "App" = betterproto.message_field(1)
    """Приложение"""


@dataclass(eq=False, repr=False)
class PostAppResponse(betterproto.Message):
    """Ответ на запрос сохранения приложения"""

    data: "App" = betterproto.message_field(1, group="type")
    """Приложение"""

    error: "PostAppResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostAppResponseError(betterproto.Message):
    """Ошибка запроса сохранения приложения"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "AppSavingError" = betterproto.message_field(2, group="reason")
    """Ошибка сохранения"""


@dataclass(eq=False, repr=False)
class GetAppRequest(betterproto.Message):
    """Запрос получения приложения"""

    id: str = betterproto.string_field(1)
    """Идентификатор приложения. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetAppResponse(betterproto.Message):
    """Ответ на запрос получения приложения"""

    data: "App" = betterproto.message_field(1, group="type")
    """Приложение"""

    error: "GetAppResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppResponseError(betterproto.Message):
    """Ошибка запроса получения приложения"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppLiteRequest(betterproto.Message):
    """Запрос получения упрощённого приложения"""

    id: str = betterproto.string_field(1)
    """Идентификатор приложения. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetAppLiteResponse(betterproto.Message):
    """Ответ на запрос получения упрощённого приложения"""

    data: "AppLite" = betterproto.message_field(1, group="type")
    """Упрощённое приложение"""

    error: "GetAppLiteResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppLiteResponseError(betterproto.Message):
    """Ошибка запроса получения упрощённого приложения"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppListRequest(betterproto.Message):
    """Запрос получения списка приложений"""

    filter: "AppFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "AppPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetAppListResponse(betterproto.Message):
    """Ответ на запрос получения списка приложений"""

    data: "App" = betterproto.message_field(1, group="type")
    """Приложение"""

    error: "GetAppListResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppListResponseError(betterproto.Message):
    """Ошибка запроса получения списка приложений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppLiteListRequest(betterproto.Message):
    """Запрос получения списка упрощённого приложений"""

    filter: "AppLiteFilter" = betterproto.message_field(1)
    """Упрощённый фильтр"""

    paging: "AppLitePaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetAppLiteListResponse(betterproto.Message):
    """Ответ на запрос получения списка упрощённых приложений"""

    data: "AppLite" = betterproto.message_field(1, group="type")
    """Упрощённое приложение"""

    error: "GetAppLiteListResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppLiteListResponseError(betterproto.Message):
    """Ошибка запроса получения списка приложений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppLiteCountRequest(betterproto.Message):
    """Запрос получения количества упрощённых приложений"""

    filter: "AppLiteFilter" = betterproto.message_field(1)
    """Упрощённый фильтр"""


@dataclass(eq=False, repr=False)
class GetAppLiteCountResponse(betterproto.Message):
    """Ответ на запрос получения количества упрощённых приложений"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего упрощенных приложений"""

    error: "GetAppLiteCountResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppLiteCountResponseError(betterproto.Message):
    """Ошибка запроса получения списка приложений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppCountRequest(betterproto.Message):
    """Запрос получения количества приложений"""

    filter: "AppFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetAppCountResponse(betterproto.Message):
    """Ответ на запрос получения количества приложений"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего приложений"""

    error: "GetAppCountResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества приложений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetAppCodeRequest(betterproto.Message):
    """Запрос на получение кода для перехода в приложение"""

    id: str = betterproto.string_field(1)
    """Идентификатор приложения. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetAppCodeResponse(betterproto.Message):
    """Ответ на запрос на получение кода для перехода в приложение"""

    data: str = betterproto.string_field(1, group="type")
    """Код"""

    error: "GetAppCodeResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetAppCodeResponseError(betterproto.Message):
    """Ошибка запроса получения ссылки на приложение"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    partner_key_does_not_exist: "GetAppCodeResponseErrorPartnerKeyDoesNotExist" = (
        betterproto.message_field(2, group="reason")
    )
    """Ошибка наличия публичного ключа у партнера"""

    app_is_inactive: "GetAppCodeResponseErrorAppIsInactive" = betterproto.message_field(
        3, group="reason"
    )
    """Приложение не в статусе ACTIVE"""


@dataclass(eq=False, repr=False)
class GetAppCodeResponseErrorPartnerKeyDoesNotExist(betterproto.Message):
    """Ошибка наличия публичного ключа у партнера"""

    pass


@dataclass(eq=False, repr=False)
class GetAppCodeResponseErrorAppIsInactive(betterproto.Message):
    """Приложение не в статусе ACTIVE"""

    pass


@dataclass(eq=False, repr=False)
class DeleteAppRequest(betterproto.Message):
    """Запрос удаления приложения"""

    id: str = betterproto.string_field(1)
    """Идентификатор приложения. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class DeleteAppResponse(betterproto.Message):
    """Ответ на запрос удаления приложения"""

    error: "DeleteAppResponseError" = betterproto.message_field(1, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class DeleteAppResponseError(betterproto.Message):
    """Ошибка запроса получения упрощённого приложения"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False)
class Notification(betterproto.Message):
    """Уведомление"""

    app_id: str = betterproto.string_field(1)
    """Идентификатор приложения. # Тип: Guid"""

    orpon: int = betterproto.int64_field(2)
    """ОРПОН. # Диапазон 1..9223372036854775807"""

    room_numbers: List[str] = betterproto.string_field(3)
    """Номер квартиры. # Диапазон: 1..150"""

    template_id: str = betterproto.string_field(4)
    """Идентификатор шаблона. # Тип: Guid"""

    values: Dict[str, str] = betterproto.map_field(
        5, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """Значения для подстановки в текст шаблона"""

    payload: Dict[str, str] = betterproto.map_field(
        6, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """Полезная нагрузка"""


@dataclass(eq=False, repr=False)
class PostNotificationRequest(betterproto.Message):
    """Запрос сохранения уведомления"""

    data: "Notification" = betterproto.message_field(1)
    """Уведомление"""


@dataclass(eq=False, repr=False)
class PostNotificationResponse(betterproto.Message):
    """Ответ на запрос сохранения уведомления"""

    error: "PostNotificationResponseError" = betterproto.message_field(1, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostNotificationResponseError(betterproto.Message):
    """Ошибка запроса сохранения уведомления"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    values: "PostNotificationResponseErrorValuesError" = betterproto.message_field(
        2, group="reason"
    )
    """Значения для подстановки не соответствуют шаблону уведомления"""

    app_blocked: "PostNotificationResponseErrorAppBlockedError" = (
        betterproto.message_field(3, group="reason")
    )
    """Приложение находится в статусе "Заблокировано"""

    app_assignment: "PostNotificationResponseErrorAppAssignmentError" = (
        betterproto.message_field(4, group="reason")
    )
    """Ошибка связанная с назначениями приложения"""


@dataclass(eq=False, repr=False)
class PostNotificationResponseErrorValuesError(betterproto.Message):
    """Значения для подстановки не соответствуют шаблону уведомления"""

    pass


@dataclass(eq=False, repr=False)
class PostNotificationResponseErrorAppBlockedError(betterproto.Message):
    """Приложение находится в статусе "Заблокировано"""

    pass


@dataclass(eq=False, repr=False)
class PostNotificationResponseErrorAppAssignmentError(betterproto.Message):
    """
    Ошибка свзяанная с назначениями приложения. Причины: - Приложение назначено
    не только по ОРПОНу или ОРПОНу и номеру квартиры; - Приложение не назначено
    на переданные orpon и room_number
    """

    pass


@dataclass(eq=False, repr=False)
class Partner(betterproto.Message):
    """Партнер. # Описание модели"""

    id: str = betterproto.string_field(1)
    """Идентификатор. Если не передан создаётся сервером. # Тип: Guid"""

    name: str = betterproto.string_field(2)
    """Наименование. # Диапазон: 2..256"""

    api_key: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING)
    """API ключ. # Тип: Guid?"""

    public_key: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Публичный ключ"""

    created_at: datetime = betterproto.message_field(5)
    """Дата создания партнера. # Тип: DateTime"""

    changed_at: datetime = betterproto.message_field(6)
    """Дата обновления партнера. # Тип: DateTime"""

    deleted_at: datetime = betterproto.message_field(7)
    """Дата удаления партнера. # Тип: DateTime?"""

    api_key_hash: Optional[str] = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Хэш от API ключа"""

    api_key_masked: Optional[str] = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """API ключ маскированный"""


@dataclass(eq=False, repr=False)
class PartnerSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

    conflict: "PartnerSavingErrorConflict" = betterproto.message_field(
        1, group="reason"
    )
    """Конфликт версий"""

    api_key_exists: "PartnerSavingErrorApiKeyExists" = betterproto.message_field(
        2, group="reason"
    )
    """API-key уже существует"""

    partner_is_deleted: "PartnerSavingErrorPartnerIsDeleted" = (
        betterproto.message_field(3, group="reason")
    )
    """Партнёр удалён"""


@dataclass(eq=False, repr=False)
class PartnerSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False)
class PartnerSavingErrorApiKeyExists(betterproto.Message):
    """
    API-key уже существует. Может появиться только в случае создания партнера.
    Причины: - В базе уже хранится такой api_key, он должен быть уникален для
    каждого партнера
    """

    pass


@dataclass(eq=False, repr=False)
class PartnerSavingErrorPartnerIsDeleted(betterproto.Message):
    """
    Партнёр удалён. Причины: - Переданный публичный ключ принадлежит удалённому
    партнеру
    """

    pass


@dataclass(eq=False, repr=False)
class Token(betterproto.Message):
    """Ответ на запрос токена"""

    id_token: str = betterproto.string_field(1)
    """ID токен в формате nested JWT"""

    access_token: str = betterproto.string_field(2)
    """Авторизационный токен"""

    type_of_access_token: str = betterproto.string_field(3)
    """Тип авторизационного токена"""

    refresh_token: str = betterproto.string_field(4)
    """
    Токен, используемый для получения нового Access Token после истечения срока
    действия текущего токена доступа
    """

    expires_in: int = betterproto.int32_field(5)
    """Время (в секундах), через которое истечет срок действия Access Token"""


@dataclass(eq=False, repr=False)
class PartnerFilter(betterproto.Message):
    """Фильтр партнеров"""

    text: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Диапазон: 3..64. # Поиск производится по полям: # - Наименование
    """

    begin_changed_at: datetime = betterproto.message_field(2)
    """От даты обновления партнера включительно (больше или равно)"""

    end_changed_at: datetime = betterproto.message_field(3)
    """До даты обновления партнера (меньше)"""

    template_ids: List[str] = betterproto.string_field(4)
    """По идентификаторам доступных шаблонов. # Тип: Guid"""

    is_show_deleted: Optional[bool] = betterproto.message_field(
        5, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False)
class PartnerPaging(betterproto.Message):
    """Пагинация партнеров"""

    order_by_type: "PartnerPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: CHANGED_AT
    """

    direction_type: "PartnerPagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


@dataclass(eq=False, repr=False)
class PostPartnerRequest(betterproto.Message):
    """Запрос сохранения партнера"""

    data: "Partner" = betterproto.message_field(1)
    """Партнер"""


@dataclass(eq=False, repr=False)
class PostPartnerResponse(betterproto.Message):
    """Ответ на запрос сохранения партнера"""

    data: "Partner" = betterproto.message_field(1, group="type")
    """Партнер"""

    error: "PostPartnerResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostPartnerResponseError(betterproto.Message):
    """Ошибка запроса сохранения партнера"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "PartnerSavingError" = betterproto.message_field(2, group="reason")
    """Ошибка сохранения"""

    missing_api_key_on_creation: "PostPartnerResponseErrorMissingApiKeyOnCreation" = (
        betterproto.message_field(3, group="reason")
    )
    """Api-Key обязателен при создании партнера"""


@dataclass(eq=False, repr=False)
class PostPartnerResponseErrorMissingApiKeyOnCreation(betterproto.Message):
    """Api-Key обязателен при создании партнера"""

    pass


@dataclass(eq=False, repr=False)
class GetPartnerRequest(betterproto.Message):
    """Запрос получения партнера"""

    id: str = betterproto.string_field(1)
    """Идентификатор партнера. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetPartnerResponse(betterproto.Message):
    """Ответ на запрос получения партнера"""

    data: "Partner" = betterproto.message_field(1, group="type")
    """Партнер"""

    error: "GetPartnerResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetPartnerResponseError(betterproto.Message):
    """Ошибка запроса получения партнера"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetPartnerListRequest(betterproto.Message):
    """Запрос получения списка партнеров"""

    filter: "PartnerFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "PartnerPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetPartnerListResponse(betterproto.Message):
    """Ответ на запрос получения списка партнеров"""

    data: "Partner" = betterproto.message_field(1, group="type")
    """Партнер"""

    error: "GetPartnerListResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetPartnerListResponseError(betterproto.Message):
    """Ошибка запроса получения списка партнеров"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetPartnerCountRequest(betterproto.Message):
    """Запрос получения количества партнеров"""

    filter: "PartnerFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetPartnerCountResponse(betterproto.Message):
    """Ответ на запрос получения количества партнеров"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего партнеров"""

    error: "GetPartnerCountResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetPartnerCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества партнеров"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetPartnerTokenRequest(betterproto.Message):
    """Запрос получения токена"""

    code: str = betterproto.string_field(1)
    """Код. # Тип: Guid"""

    response: str = betterproto.string_field(2)
    """
    Тип ответа. # Допустимые значения: "id_token", "token", "id_token token"
    """

    nonce: str = betterproto.string_field(3)
    """Ваучер"""


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponse(betterproto.Message):
    """Ответ на запрос получения токена"""

    data: "Token" = betterproto.message_field(1, group="type")
    """Токен"""

    error: "GetPartnerTokenResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseError(betterproto.Message):
    """Ошибка"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    user_not_found: "GetPartnerTokenResponseErrorUserNotFoundError" = (
        betterproto.message_field(2, group="reason")
    )
    """Ошибка: пользователь не найден"""

    token_generation_error: "GetPartnerTokenResponseErrorTokenGenerationError" = (
        betterproto.message_field(3, group="reason")
    )
    """Ошибка: формирования токена"""

    code_not_found_or_expired_error: (
        "GetPartnerTokenResponseErrorCodeNotFoundOrExpiredError"
    ) = betterproto.message_field(4, group="reason")
    """Ошибка: некорректный код"""

    response_type_is_not_supported: (
        "GetPartnerTokenResponseErrorResponseTypeIsNotSupported"
    ) = betterproto.message_field(5, group="reason")
    """Переданный тип ответа не поддерживается"""

    permission_denied: "GetPartnerTokenResponseErrorPermissionDenied" = (
        betterproto.message_field(6, group="reason")
    )
    """Доступ запрещен"""


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseErrorUserNotFoundError(betterproto.Message):
    """
    Данные пользователя для формирования идентификационного токена не найдены.
    Причины: - Пользователь с таким идентификатором отсутсвует в БД ключа; -
    Ошибка взаимодействия с сервисом Домохозяйств
    """

    pass


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseErrorTokenGenerationError(betterproto.Message):
    """
    Ошибка формирования токена. Причины: - Ошибка в сервисе KMS. - Ошибка в
    сервисе Identity
    """

    pass


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseErrorCodeNotFoundOrExpiredError(betterproto.Message):
    """
    Некорректный код. Причины: - Передан неверный код; - Превышен допустимый
    временной интервал между запросом на формирование кода и запросом на
    получение идентификационного токена
    """

    pass


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseErrorResponseTypeIsNotSupported(betterproto.Message):
    """Переданный тип ответа не поддерживается"""

    pass


@dataclass(eq=False, repr=False)
class GetPartnerTokenResponseErrorPermissionDenied(betterproto.Message):
    """
    Доступ запрещен. Причины: - У запрашивающего приложения нет разрешения на
    выбранный тип ответа
    """

    pass


@dataclass(eq=False, repr=False)
class PostPartnerPublicKeyRequest(betterproto.Message):
    """Запрос сохранения публичного ключа партнера"""

    public_key: str = betterproto.string_field(1)
    """Публичный ключ"""


@dataclass(eq=False, repr=False)
class PostPartnerPublicKeyResponse(betterproto.Message):
    """Ответ на запрос сохранения публичного ключа партнера"""

    data: "Partner" = betterproto.message_field(1, group="type")
    """Партнер"""

    error: "PostPartnerPublicKeyResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostPartnerPublicKeyResponseError(betterproto.Message):
    """Ошибка запроса сохранения публичного ключа партнера"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "PartnerSavingError" = betterproto.message_field(2, group="reason")
    """Ошибка сохранения"""


@dataclass(eq=False, repr=False)
class DeletePartnerRequest(betterproto.Message):
    """Запрос на удаление партнёра"""

    id: str = betterproto.string_field(1)
    """Идентификатор партнёра. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class DeletePartnerResponse(betterproto.Message):
    """Ответ на запрос удаления партнёра"""

    error: "DeletePartnerResponseError" = betterproto.message_field(1, group="type")
    """Ошибка при удалении"""


@dataclass(eq=False, repr=False)
class DeletePartnerResponseError(betterproto.Message):
    """Ошибка удаления партнёра"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    linked_app_exists: "DeletePartnerResponseErrorLinkedAppExists" = (
        betterproto.message_field(2, group="reason")
    )
    """У партнера есть хотя бы одно приложение"""


@dataclass(eq=False, repr=False)
class DeletePartnerResponseErrorLinkedAppExists(betterproto.Message):
    """У партнера есть хотя бы одно приложение"""

    pass


@dataclass(eq=False, repr=False)
class GetPartnerAddressOrponRequest(betterproto.Message):
    """Запрос получения адреса по ОРПОНу"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН. # Диапазон: 1..9223372036854775807"""


@dataclass(eq=False, repr=False)
class GetPartnerAddressOrponResponse(betterproto.Message):
    """Ответ на запрос получения адреса по ОРПОНу"""

    data: str = betterproto.string_field(1, group="type")
    """Адрес"""

    error: "GetPartnerAddressOrponResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetPartnerAddressOrponResponseError(betterproto.Message):
    """Ошибка"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    permission_denied: "GetPartnerAddressOrponResponseErrorPermissionDenied" = (
        betterproto.message_field(2, group="reason")
    )
    """Доступ запрещен"""


@dataclass(eq=False, repr=False)
class GetPartnerAddressOrponResponseErrorPermissionDenied(betterproto.Message):
    """
    Доступ запрещен. Причины: - У партнера нет разрешения на переданный ОРПОН
    """

    pass


@dataclass(eq=False, repr=False)
class IdTokenPayload(betterproto.Message):
    """Идентификационный токен"""

    jti: str = betterproto.string_field(1)
    """Идентификатор токена"""

    nonce: str = betterproto.string_field(2)
    """Ваучер"""

    sub: str = betterproto.string_field(3)
    """Идентификатор пользователя, для которого выдан токен"""

    role: Optional[str] = betterproto.message_field(4, wraps=betterproto.TYPE_STRING)
    """Роль"""

    phone_number: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """Номер телефона"""

    email: Optional[str] = betterproto.message_field(6, wraps=betterproto.TYPE_STRING)
    """Электронная почта"""

    orpon: Optional[str] = betterproto.message_field(7, wraps=betterproto.TYPE_STRING)
    """Идентифкатор ОРПОН"""

    room: Optional[str] = betterproto.message_field(8, wraps=betterproto.TYPE_STRING)
    """Номер квартиры"""

    company_id: Optional[str] = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """Идентифкатор компании"""

    company_name: Optional[str] = betterproto.message_field(
        10, wraps=betterproto.TYPE_STRING
    )
    """Наименование компании"""

    auth_time: str = betterproto.string_field(11)
    """Время авторизации пользователя unix timestamp"""

    exp: str = betterproto.string_field(12)
    """Срок истечения действия токен unix timestamp"""

    iss: str = betterproto.string_field(13)
    """Сервис, выдавший токен"""

    aud: str = betterproto.string_field(14)
    """Url сервиса, для которого выпустили токен"""

    app_id: str = betterproto.string_field(15)
    """Идентификатор приложения партнёра"""

    kladr_id: Optional[str] = betterproto.message_field(
        16, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР"""


@dataclass(eq=False, repr=False)
class NotificationTemplate(betterproto.Message):
    """Шаблон уведомления. # Описание модели"""

    id: str = betterproto.string_field(1)
    """Идентификатор. Если не передан создаётся сервером. # Тип: Guid"""

    template_header: str = betterproto.string_field(2)
    """
    Заголовок шаблона. Поддерживает mustache теги в формате: {{название
    переменной|тип данных}}. Название переменной в теге может содержать
    латинские буквы (в верхнем или нижнем регистре), цифры и символ "_". Тип
    данных может быть указан в верхнем или нижнем регистре, пробелы не
    допускаются, допустимые типы данных указаны в таблице. Символы "{" и "}"
    являются служебными и могут использоваться только для формирования Mustache
    тегов. # Диапазон: 3..128
    """

    template_text: str = betterproto.string_field(3)
    """
    Тело шаблона. Поддерживает mustache теги в формате: {{название
    переменной|тип данных}}. Название переменной в теге может содержать
    латинские буквы (в верхнем или нижнем регистре), цифры и символ "_". Тип
    данных может быть указан в верхнем или нижнем регистре, пробелы не
    допускаются, допустимые типы данных указаны в таблице. Символы "{" и "}"
    являются служебными и могут использоваться только для формирования Mustache
    тегов. # Диапазон: 3..512
    """

    created_at: datetime = betterproto.message_field(4)
    """Дата создания. # Тип: DateTime"""

    changed_at: datetime = betterproto.message_field(5)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. При
    изменении должен совпадать со значением из БД. Является версией объекта. #
    Тип: DateTime
    """

    deleted_at: datetime = betterproto.message_field(6)
    """Дата удаления. # Тип: DateTime?"""

    title: str = betterproto.string_field(7)
    """Системное наименование. # Диапазон: 3..256"""


@dataclass(eq=False, repr=False)
class NotificationTemplateSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

    conflict: "NotificationTemplateSavingErrorConflict" = betterproto.message_field(
        1, group="reason"
    )
    """Конфликт версий"""


@dataclass(eq=False, repr=False)
class NotificationTemplateSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False)
class NotificationTemplatePartner(betterproto.Message):
    """Связь шаблона уведомлений и партнера. # Описание модели"""

    notification_template_id: str = betterproto.string_field(1)
    """Идентификатор шаблона уведомления. # Тип: Guid"""

    partner_id: str = betterproto.string_field(2)
    """Идентификатор партнера. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class NotificationTemplatePartnerSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

    partner_is_deleted: "NotificationTemplatePartnerSavingErrorPartnerIsDeleted" = (
        betterproto.message_field(1, group="reason")
    )
    """Партнер удален"""

    template_is_deleted: "NotificationTemplatePartnerSavingErrorTemplateIsDeleted" = (
        betterproto.message_field(2, group="reason")
    )
    """Шаблон удален"""


@dataclass(eq=False, repr=False)
class NotificationTemplatePartnerSavingErrorPartnerIsDeleted(betterproto.Message):
    """Партнер удален"""

    pass


@dataclass(eq=False, repr=False)
class NotificationTemplatePartnerSavingErrorTemplateIsDeleted(betterproto.Message):
    """Шаблон удален"""

    pass


@dataclass(eq=False, repr=False)
class PostNotificationTemplateRequest(betterproto.Message):
    """Запрос сохранения приложения"""

    data: "NotificationTemplate" = betterproto.message_field(1)
    """Приложение"""


@dataclass(eq=False, repr=False)
class PostNotificationTemplateResponse(betterproto.Message):
    """Ответ на запрос сохранения шаблона уведомления"""

    data: "NotificationTemplate" = betterproto.message_field(1, group="type")
    """Шаблон уведомления"""

    error: "PostNotificationTemplateResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostNotificationTemplateResponseError(betterproto.Message):
    """Ошибка запроса сохранения шаблона уведомления"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "NotificationTemplateSavingError" = betterproto.message_field(
        2, group="reason"
    )
    """Ошибка сохранения"""

    incorrect_data_type: (
        "PostNotificationTemplateResponseErrorIncorrectDataTypeError"
    ) = betterproto.message_field(3, group="reason")
    """Некорректный тип данных для переменной в шаблоне"""

    incorrect_variable_name_error: (
        "PostNotificationTemplateResponseErrorIncorrectVariableNameError"
    ) = betterproto.message_field(4, group="reason")
    """Некорректное наименование переменной в шаблоне"""

    incorrect_tag_format_error: (
        "PostNotificationTemplateResponseErrorIncorrectTagFormatError"
    ) = betterproto.message_field(5, group="reason")
    """Некорректный формат Mustache тегов"""


@dataclass(eq=False, repr=False)
class PostNotificationTemplateResponseErrorIncorrectDataTypeError(betterproto.Message):
    """
    Некорректный тип данных для переменной в шаблоне. Список допустимых типов
    данных: - Number; - Date; - Phone; - Time
    """

    pass


@dataclass(eq=False, repr=False)
class PostNotificationTemplateResponseErrorIncorrectVariableNameError(
    betterproto.Message
):
    """Некорректное наименование переменной в шаблоне"""

    pass


@dataclass(eq=False, repr=False)
class PostNotificationTemplateResponseErrorIncorrectTagFormatError(betterproto.Message):
    """Некорректный формат Mustache тегов"""

    pass


@dataclass(eq=False, repr=False)
class GetNotificationTemplateRequest(betterproto.Message):
    """Запрос получения шаблона уведомления"""

    id: str = betterproto.string_field(1)
    """Идентификатор шаблона уведомления. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateResponse(betterproto.Message):
    """Ответ на запрос получения шаблона уведомления"""

    data: "NotificationTemplate" = betterproto.message_field(1, group="type")
    """Шаблон уведомления"""

    error: "GetNotificationTemplateResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateResponseError(betterproto.Message):
    """Ошибка запроса получения шаблона уведомления"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateListRequest(betterproto.Message):
    """Запрос получения списка шаблонов уведомлений"""

    filter: "NotificationTemplateFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "NotificationTemplatePaging" = betterproto.message_field(
        2, group="pagination"
    )
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateListResponse(betterproto.Message):
    """Ответ на запрос получения списка шаблонов уведомлений"""

    data: "NotificationTemplate" = betterproto.message_field(1, group="type")
    """Шаблон уведомления"""

    error: "GetNotificationTemplateListResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateListResponseError(betterproto.Message):
    """Ошибка запроса получения списка шаблонов уведомлений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateCountRequest(betterproto.Message):
    """Запрос получения количества шаблонов уведомлений"""

    filter: "NotificationTemplateFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateCountResponse(betterproto.Message):
    """Ответ на запрос получения количества шаблонов уведомлений"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего шаблонов уведомлений"""

    error: "GetNotificationTemplateCountResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetNotificationTemplateCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества шаблонов уведомлений"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerAttachRequest(betterproto.Message):
    """Запрос создания связи шаблона уведомления и партнера"""

    notification_template_partner: "NotificationTemplatePartner" = (
        betterproto.message_field(1)
    )
    """Связь шаблона уведомления и партнера"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerAttachResponse(betterproto.Message):
    """Ответ на запрос создания связи шаблона уведомления и партнера"""

    error: "PutNotificationTemplatePartnerAttachResponseError" = (
        betterproto.message_field(1, group="type")
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerAttachResponseError(betterproto.Message):
    """Ошибка запроса на создание шаблона уведомления и партнера"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "NotificationTemplatePartnerSavingError" = betterproto.message_field(
        2, group="reason"
    )
    """Ошибка сохранения"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerDetachRequest(betterproto.Message):
    """Запрос удаления связи шаблона уведомления и партнера"""

    notification_template_partner: "NotificationTemplatePartner" = (
        betterproto.message_field(1)
    )
    """Связь шаблона уведомления и партнера"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerDetachResponse(betterproto.Message):
    """Ответ на запрос удаление связи шаблона уведомления и партнера"""

    error: "PutNotificationTemplatePartnerDetachResponseError" = (
        betterproto.message_field(1, group="type")
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PutNotificationTemplatePartnerDetachResponseError(betterproto.Message):
    """Ошибка запроса на удаление шаблона уведомления и партнера"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class DeleteNotificationTemplateRequest(betterproto.Message):
    """Запрос на удаление шаблона уведомления"""

    id: str = betterproto.string_field(1)
    """Идентификатор шаблона уведомления. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class DeleteNotificationTemplateResponse(betterproto.Message):
    """Ответ на запрос удаления шаблона уведомления"""

    error: "DeleteNotificationTemplateResponseError" = betterproto.message_field(
        1, group="type"
    )
    """Ошибка при удалении"""


@dataclass(eq=False, repr=False)
class DeleteNotificationTemplateResponseError(betterproto.Message):
    """Ошибка удаления шаблона уведомления"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class NotificationTemplateFilter(betterproto.Message):
    """Фильтр шаблонов уведомлений"""

    text: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Диапазон: 3..64. # Поиск производится по полям: # - Заголовок шаблона; # -
    Тело шаблона; # - Системное наименование
    """

    partner_ids: List[str] = betterproto.string_field(2)
    """По идентификаторам партнера. # Тип: Guid"""

    is_show_deleted: Optional[bool] = betterproto.message_field(
        3, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False)
class NotificationTemplatePaging(betterproto.Message):
    """Пагинация шаблонов уведомлений"""

    order_by_type: "NotificationTemplatePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: CHANGED_AT
    """

    direction_type: "NotificationTemplatePagingDirectionType" = betterproto.enum_field(
        2
    )
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class AppServiceStub(betterproto.ServiceStub):
    async def post_app(
        self,
        post_app_request: "PostAppRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostAppResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/PostApp",
            post_app_request,
            PostAppResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_app(
        self,
        get_app_request: "GetAppRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAppResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/GetApp",
            get_app_request,
            GetAppResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_app_lite(
        self,
        get_app_lite_request: "GetAppLiteRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAppLiteResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/GetAppLite",
            get_app_lite_request,
            GetAppLiteResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_app_list(
        self,
        get_app_list_request: "GetAppListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetAppListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.multiapp.v1.AppService/GetAppList",
            get_app_list_request,
            GetAppListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_app_lite_list(
        self,
        get_app_lite_list_request: "GetAppLiteListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetAppLiteListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.multiapp.v1.AppService/GetAppLiteList",
            get_app_lite_list_request,
            GetAppLiteListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_app_lite_count(
        self,
        get_app_lite_count_request: "GetAppLiteCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAppLiteCountResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/GetAppLiteCount",
            get_app_lite_count_request,
            GetAppLiteCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_app_count(
        self,
        get_app_count_request: "GetAppCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAppCountResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/GetAppCount",
            get_app_count_request,
            GetAppCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_app_code(
        self,
        get_app_code_request: "GetAppCodeRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAppCodeResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/GetAppCode",
            get_app_code_request,
            GetAppCodeResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_app(
        self,
        delete_app_request: "DeleteAppRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteAppResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.AppService/DeleteApp",
            delete_app_request,
            DeleteAppResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class NotificationServiceStub(betterproto.ServiceStub):
    async def post_notification(
        self,
        post_notification_request: "PostNotificationRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostNotificationResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationService/PostNotification",
            post_notification_request,
            PostNotificationResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PartnerServiceStub(betterproto.ServiceStub):
    async def post_partner(
        self,
        post_partner_request: "PostPartnerRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostPartnerResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/PostPartner",
            post_partner_request,
            PostPartnerResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_partner(
        self,
        get_partner_request: "GetPartnerRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPartnerResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/GetPartner",
            get_partner_request,
            GetPartnerResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_partner_list(
        self,
        get_partner_list_request: "GetPartnerListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetPartnerListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.multiapp.v1.PartnerService/GetPartnerList",
            get_partner_list_request,
            GetPartnerListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_partner_count(
        self,
        get_partner_count_request: "GetPartnerCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPartnerCountResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/GetPartnerCount",
            get_partner_count_request,
            GetPartnerCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_partner_token(
        self,
        get_partner_token_request: "GetPartnerTokenRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPartnerTokenResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/GetPartnerToken",
            get_partner_token_request,
            GetPartnerTokenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_partner_public_key(
        self,
        post_partner_public_key_request: "PostPartnerPublicKeyRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostPartnerPublicKeyResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/PostPartnerPublicKey",
            post_partner_public_key_request,
            PostPartnerPublicKeyResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_partner(
        self,
        delete_partner_request: "DeletePartnerRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeletePartnerResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/DeletePartner",
            delete_partner_request,
            DeletePartnerResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_partner_address_orpon(
        self,
        get_partner_address_orpon_request: "GetPartnerAddressOrponRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPartnerAddressOrponResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.PartnerService/GetPartnerAddressOrpon",
            get_partner_address_orpon_request,
            GetPartnerAddressOrponResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class NotificationTemplateServiceStub(betterproto.ServiceStub):
    async def post_notification_template(
        self,
        post_notification_template_request: "PostNotificationTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostNotificationTemplateResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/PostNotificationTemplate",
            post_notification_template_request,
            PostNotificationTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_notification_template(
        self,
        get_notification_template_request: "GetNotificationTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetNotificationTemplateResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplate",
            get_notification_template_request,
            GetNotificationTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_notification_template(
        self,
        delete_notification_template_request: "DeleteNotificationTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteNotificationTemplateResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/DeleteNotificationTemplate",
            delete_notification_template_request,
            DeleteNotificationTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_notification_template_list(
        self,
        get_notification_template_list_request: "GetNotificationTemplateListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetNotificationTemplateListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplateList",
            get_notification_template_list_request,
            GetNotificationTemplateListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_notification_template_count(
        self,
        get_notification_template_count_request: "GetNotificationTemplateCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetNotificationTemplateCountResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplateCount",
            get_notification_template_count_request,
            GetNotificationTemplateCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_notification_template_partner_attach(
        self,
        put_notification_template_partner_attach_request: "PutNotificationTemplatePartnerAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutNotificationTemplatePartnerAttachResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/PutNotificationTemplatePartnerAttach",
            put_notification_template_partner_attach_request,
            PutNotificationTemplatePartnerAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_notification_template_partner_detach(
        self,
        put_notification_template_partner_detach_request: "PutNotificationTemplatePartnerDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutNotificationTemplatePartnerDetachResponse":
        return await self._unary_unary(
            "/keyapis.multiapp.v1.NotificationTemplateService/PutNotificationTemplatePartnerDetach",
            put_notification_template_partner_detach_request,
            PutNotificationTemplatePartnerDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.multiapp.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class AppServiceBase(ServiceBase):

    async def post_app(self, post_app_request: "PostAppRequest") -> "PostAppResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app(self, get_app_request: "GetAppRequest") -> "GetAppResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_lite(
        self, get_app_lite_request: "GetAppLiteRequest"
    ) -> "GetAppLiteResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_list(
        self, get_app_list_request: "GetAppListRequest"
    ) -> AsyncIterator["GetAppListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_lite_list(
        self, get_app_lite_list_request: "GetAppLiteListRequest"
    ) -> AsyncIterator["GetAppLiteListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_lite_count(
        self, get_app_lite_count_request: "GetAppLiteCountRequest"
    ) -> "GetAppLiteCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_count(
        self, get_app_count_request: "GetAppCountRequest"
    ) -> "GetAppCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_app_code(
        self, get_app_code_request: "GetAppCodeRequest"
    ) -> "GetAppCodeResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_app(
        self, delete_app_request: "DeleteAppRequest"
    ) -> "DeleteAppResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_app(
        self, stream: "grpclib.server.Stream[PostAppRequest, PostAppResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_app(request)
        await stream.send_message(response)

    async def __rpc_get_app(
        self, stream: "grpclib.server.Stream[GetAppRequest, GetAppResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_app(request)
        await stream.send_message(response)

    async def __rpc_get_app_lite(
        self, stream: "grpclib.server.Stream[GetAppLiteRequest, GetAppLiteResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_app_lite(request)
        await stream.send_message(response)

    async def __rpc_get_app_list(
        self, stream: "grpclib.server.Stream[GetAppListRequest, GetAppListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_app_list,
            stream,
            request,
        )

    async def __rpc_get_app_lite_list(
        self,
        stream: "grpclib.server.Stream[GetAppLiteListRequest, GetAppLiteListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_app_lite_list,
            stream,
            request,
        )

    async def __rpc_get_app_lite_count(
        self,
        stream: "grpclib.server.Stream[GetAppLiteCountRequest, GetAppLiteCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_app_lite_count(request)
        await stream.send_message(response)

    async def __rpc_get_app_count(
        self, stream: "grpclib.server.Stream[GetAppCountRequest, GetAppCountResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_app_count(request)
        await stream.send_message(response)

    async def __rpc_get_app_code(
        self, stream: "grpclib.server.Stream[GetAppCodeRequest, GetAppCodeResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_app_code(request)
        await stream.send_message(response)

    async def __rpc_delete_app(
        self, stream: "grpclib.server.Stream[DeleteAppRequest, DeleteAppResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_app(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.multiapp.v1.AppService/PostApp": grpclib.const.Handler(
                self.__rpc_post_app,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostAppRequest,
                PostAppResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetApp": grpclib.const.Handler(
                self.__rpc_get_app,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAppRequest,
                GetAppResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppLite": grpclib.const.Handler(
                self.__rpc_get_app_lite,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAppLiteRequest,
                GetAppLiteResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppList": grpclib.const.Handler(
                self.__rpc_get_app_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetAppListRequest,
                GetAppListResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppLiteList": grpclib.const.Handler(
                self.__rpc_get_app_lite_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetAppLiteListRequest,
                GetAppLiteListResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppLiteCount": grpclib.const.Handler(
                self.__rpc_get_app_lite_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAppLiteCountRequest,
                GetAppLiteCountResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppCount": grpclib.const.Handler(
                self.__rpc_get_app_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAppCountRequest,
                GetAppCountResponse,
            ),
            "/keyapis.multiapp.v1.AppService/GetAppCode": grpclib.const.Handler(
                self.__rpc_get_app_code,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAppCodeRequest,
                GetAppCodeResponse,
            ),
            "/keyapis.multiapp.v1.AppService/DeleteApp": grpclib.const.Handler(
                self.__rpc_delete_app,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteAppRequest,
                DeleteAppResponse,
            ),
        }


class NotificationServiceBase(ServiceBase):

    async def post_notification(
        self, post_notification_request: "PostNotificationRequest"
    ) -> "PostNotificationResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_notification(
        self,
        stream: "grpclib.server.Stream[PostNotificationRequest, PostNotificationResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_notification(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.multiapp.v1.NotificationService/PostNotification": grpclib.const.Handler(
                self.__rpc_post_notification,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostNotificationRequest,
                PostNotificationResponse,
            ),
        }


class PartnerServiceBase(ServiceBase):

    async def post_partner(
        self, post_partner_request: "PostPartnerRequest"
    ) -> "PostPartnerResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_partner(
        self, get_partner_request: "GetPartnerRequest"
    ) -> "GetPartnerResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_partner_list(
        self, get_partner_list_request: "GetPartnerListRequest"
    ) -> AsyncIterator["GetPartnerListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_partner_count(
        self, get_partner_count_request: "GetPartnerCountRequest"
    ) -> "GetPartnerCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_partner_token(
        self, get_partner_token_request: "GetPartnerTokenRequest"
    ) -> "GetPartnerTokenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_partner_public_key(
        self, post_partner_public_key_request: "PostPartnerPublicKeyRequest"
    ) -> "PostPartnerPublicKeyResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_partner(
        self, delete_partner_request: "DeletePartnerRequest"
    ) -> "DeletePartnerResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_partner_address_orpon(
        self, get_partner_address_orpon_request: "GetPartnerAddressOrponRequest"
    ) -> "GetPartnerAddressOrponResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_partner(
        self, stream: "grpclib.server.Stream[PostPartnerRequest, PostPartnerResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_partner(request)
        await stream.send_message(response)

    async def __rpc_get_partner(
        self, stream: "grpclib.server.Stream[GetPartnerRequest, GetPartnerResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_partner(request)
        await stream.send_message(response)

    async def __rpc_get_partner_list(
        self,
        stream: "grpclib.server.Stream[GetPartnerListRequest, GetPartnerListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_partner_list,
            stream,
            request,
        )

    async def __rpc_get_partner_count(
        self,
        stream: "grpclib.server.Stream[GetPartnerCountRequest, GetPartnerCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_partner_count(request)
        await stream.send_message(response)

    async def __rpc_get_partner_token(
        self,
        stream: "grpclib.server.Stream[GetPartnerTokenRequest, GetPartnerTokenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_partner_token(request)
        await stream.send_message(response)

    async def __rpc_post_partner_public_key(
        self,
        stream: "grpclib.server.Stream[PostPartnerPublicKeyRequest, PostPartnerPublicKeyResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_partner_public_key(request)
        await stream.send_message(response)

    async def __rpc_delete_partner(
        self,
        stream: "grpclib.server.Stream[DeletePartnerRequest, DeletePartnerResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_partner(request)
        await stream.send_message(response)

    async def __rpc_get_partner_address_orpon(
        self,
        stream: "grpclib.server.Stream[GetPartnerAddressOrponRequest, GetPartnerAddressOrponResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_partner_address_orpon(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.multiapp.v1.PartnerService/PostPartner": grpclib.const.Handler(
                self.__rpc_post_partner,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPartnerRequest,
                PostPartnerResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/GetPartner": grpclib.const.Handler(
                self.__rpc_get_partner,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPartnerRequest,
                GetPartnerResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/GetPartnerList": grpclib.const.Handler(
                self.__rpc_get_partner_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPartnerListRequest,
                GetPartnerListResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/GetPartnerCount": grpclib.const.Handler(
                self.__rpc_get_partner_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPartnerCountRequest,
                GetPartnerCountResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/GetPartnerToken": grpclib.const.Handler(
                self.__rpc_get_partner_token,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPartnerTokenRequest,
                GetPartnerTokenResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/PostPartnerPublicKey": grpclib.const.Handler(
                self.__rpc_post_partner_public_key,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPartnerPublicKeyRequest,
                PostPartnerPublicKeyResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/DeletePartner": grpclib.const.Handler(
                self.__rpc_delete_partner,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePartnerRequest,
                DeletePartnerResponse,
            ),
            "/keyapis.multiapp.v1.PartnerService/GetPartnerAddressOrpon": grpclib.const.Handler(
                self.__rpc_get_partner_address_orpon,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPartnerAddressOrponRequest,
                GetPartnerAddressOrponResponse,
            ),
        }


class NotificationTemplateServiceBase(ServiceBase):

    async def post_notification_template(
        self, post_notification_template_request: "PostNotificationTemplateRequest"
    ) -> "PostNotificationTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_notification_template(
        self, get_notification_template_request: "GetNotificationTemplateRequest"
    ) -> "GetNotificationTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_notification_template(
        self, delete_notification_template_request: "DeleteNotificationTemplateRequest"
    ) -> "DeleteNotificationTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_notification_template_list(
        self,
        get_notification_template_list_request: "GetNotificationTemplateListRequest",
    ) -> AsyncIterator["GetNotificationTemplateListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_notification_template_count(
        self,
        get_notification_template_count_request: "GetNotificationTemplateCountRequest",
    ) -> "GetNotificationTemplateCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_notification_template_partner_attach(
        self,
        put_notification_template_partner_attach_request: "PutNotificationTemplatePartnerAttachRequest",
    ) -> "PutNotificationTemplatePartnerAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_notification_template_partner_detach(
        self,
        put_notification_template_partner_detach_request: "PutNotificationTemplatePartnerDetachRequest",
    ) -> "PutNotificationTemplatePartnerDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_notification_template(
        self,
        stream: "grpclib.server.Stream[PostNotificationTemplateRequest, PostNotificationTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_notification_template(request)
        await stream.send_message(response)

    async def __rpc_get_notification_template(
        self,
        stream: "grpclib.server.Stream[GetNotificationTemplateRequest, GetNotificationTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_notification_template(request)
        await stream.send_message(response)

    async def __rpc_delete_notification_template(
        self,
        stream: "grpclib.server.Stream[DeleteNotificationTemplateRequest, DeleteNotificationTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_notification_template(request)
        await stream.send_message(response)

    async def __rpc_get_notification_template_list(
        self,
        stream: "grpclib.server.Stream[GetNotificationTemplateListRequest, GetNotificationTemplateListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_notification_template_list,
            stream,
            request,
        )

    async def __rpc_get_notification_template_count(
        self,
        stream: "grpclib.server.Stream[GetNotificationTemplateCountRequest, GetNotificationTemplateCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_notification_template_count(request)
        await stream.send_message(response)

    async def __rpc_put_notification_template_partner_attach(
        self,
        stream: "grpclib.server.Stream[PutNotificationTemplatePartnerAttachRequest, PutNotificationTemplatePartnerAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_notification_template_partner_attach(request)
        await stream.send_message(response)

    async def __rpc_put_notification_template_partner_detach(
        self,
        stream: "grpclib.server.Stream[PutNotificationTemplatePartnerDetachRequest, PutNotificationTemplatePartnerDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_notification_template_partner_detach(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.multiapp.v1.NotificationTemplateService/PostNotificationTemplate": grpclib.const.Handler(
                self.__rpc_post_notification_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostNotificationTemplateRequest,
                PostNotificationTemplateResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplate": grpclib.const.Handler(
                self.__rpc_get_notification_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetNotificationTemplateRequest,
                GetNotificationTemplateResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/DeleteNotificationTemplate": grpclib.const.Handler(
                self.__rpc_delete_notification_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteNotificationTemplateRequest,
                DeleteNotificationTemplateResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplateList": grpclib.const.Handler(
                self.__rpc_get_notification_template_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetNotificationTemplateListRequest,
                GetNotificationTemplateListResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/GetNotificationTemplateCount": grpclib.const.Handler(
                self.__rpc_get_notification_template_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetNotificationTemplateCountRequest,
                GetNotificationTemplateCountResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/PutNotificationTemplatePartnerAttach": grpclib.const.Handler(
                self.__rpc_put_notification_template_partner_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutNotificationTemplatePartnerAttachRequest,
                PutNotificationTemplatePartnerAttachResponse,
            ),
            "/keyapis.multiapp.v1.NotificationTemplateService/PutNotificationTemplatePartnerDetach": grpclib.const.Handler(
                self.__rpc_put_notification_template_partner_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutNotificationTemplatePartnerDetachRequest,
                PutNotificationTemplatePartnerDetachResponse,
            ),
        }
