# 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
# This file has been @generated
import warnings
from collections.abc import AsyncIterator
from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

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
    """Стандартное приложение"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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: "str | None" = betterproto.message_field(5, wraps=betterproto.TYPE_STRING)
    """
    Заголовок.
     # Диапазон: 3..30
    """

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

    background_color: "str | None" = 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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class AppPermissions(betterproto.Message):
    """Разрешения"""

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


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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

    pass


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

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

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

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

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

    background_color: "str | None" = 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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class AppFilter(betterproto.Message):
    """Фильтр приложений"""

    text: "str | None" = 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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class AppLiteFilterAppLiteTag(betterproto.Message):
    """Тег для приложения"""

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

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class PostAppRequest(betterproto.Message):
    """Запрос сохранения приложения"""

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class PostNotificationRequest(betterproto.Message):
    """Запрос сохранения уведомления"""

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

    pass


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

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

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

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

    public_key: "str | None" = 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: "str | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Хэш от API ключа"""

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


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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class PartnerFilter(betterproto.Message):
    """Фильтр партнеров"""

    text: "str | None" = 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: "bool | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class PostPartnerRequest(betterproto.Message):
    """Запрос сохранения партнера"""

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class GetPartnerTokenResponse(betterproto.Message):
    """Ответ на запрос получения токена"""

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

    pass


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

    pass


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

    pass


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

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

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

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

    role: "str | None" = betterproto.message_field(4, wraps=betterproto.TYPE_STRING)
    """Роль"""

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

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

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

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

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

    company_name: "str | None" = 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: "str | None" = betterproto.message_field(
        16, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class NotificationTemplateSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class NotificationTemplatePartnerSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


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

    pass


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

    pass


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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)
        yield GetAppListResponse()

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

    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)
        yield GetPartnerListResponse()

    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)
        yield GetNotificationTemplateListResponse()

    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,
            ),
        }


rebuild_dataclass(App)  # type: ignore
rebuild_dataclass(AppLink)  # type: ignore
rebuild_dataclass(AppPermissions)  # type: ignore
rebuild_dataclass(AppSavingError)  # type: ignore
rebuild_dataclass(AppLite)  # type: ignore
rebuild_dataclass(AppLiteLinkLite)  # type: ignore
rebuild_dataclass(AppFilter)  # type: ignore
rebuild_dataclass(AppLiteFilter)  # type: ignore
rebuild_dataclass(AppLiteFilterAppLiteTag)  # type: ignore
rebuild_dataclass(AppPaging)  # type: ignore
rebuild_dataclass(AppLitePaging)  # type: ignore
rebuild_dataclass(PostAppRequest)  # type: ignore
rebuild_dataclass(PostAppResponse)  # type: ignore
rebuild_dataclass(PostAppResponseError)  # type: ignore
rebuild_dataclass(GetAppResponse)  # type: ignore
rebuild_dataclass(GetAppResponseError)  # type: ignore
rebuild_dataclass(GetAppLiteResponse)  # type: ignore
rebuild_dataclass(GetAppLiteResponseError)  # type: ignore
rebuild_dataclass(GetAppListRequest)  # type: ignore
rebuild_dataclass(GetAppListResponse)  # type: ignore
rebuild_dataclass(GetAppListResponseError)  # type: ignore
rebuild_dataclass(GetAppLiteListRequest)  # type: ignore
rebuild_dataclass(GetAppLiteListResponse)  # type: ignore
rebuild_dataclass(GetAppLiteListResponseError)  # type: ignore
rebuild_dataclass(GetAppLiteCountRequest)  # type: ignore
rebuild_dataclass(GetAppLiteCountResponse)  # type: ignore
rebuild_dataclass(GetAppLiteCountResponseError)  # type: ignore
rebuild_dataclass(GetAppCountRequest)  # type: ignore
rebuild_dataclass(GetAppCountResponse)  # type: ignore
rebuild_dataclass(GetAppCountResponseError)  # type: ignore
rebuild_dataclass(GetAppCodeResponse)  # type: ignore
rebuild_dataclass(GetAppCodeResponseError)  # type: ignore
rebuild_dataclass(DeleteAppResponse)  # type: ignore
rebuild_dataclass(DeleteAppResponseError)  # type: ignore
rebuild_dataclass(Notification)  # type: ignore
rebuild_dataclass(PostNotificationRequest)  # type: ignore
rebuild_dataclass(PostNotificationResponse)  # type: ignore
rebuild_dataclass(PostNotificationResponseError)  # type: ignore
rebuild_dataclass(Partner)  # type: ignore
rebuild_dataclass(PartnerSavingError)  # type: ignore
rebuild_dataclass(PartnerFilter)  # type: ignore
rebuild_dataclass(PartnerPaging)  # type: ignore
rebuild_dataclass(PostPartnerRequest)  # type: ignore
rebuild_dataclass(PostPartnerResponse)  # type: ignore
rebuild_dataclass(PostPartnerResponseError)  # type: ignore
rebuild_dataclass(GetPartnerResponse)  # type: ignore
rebuild_dataclass(GetPartnerResponseError)  # type: ignore
rebuild_dataclass(GetPartnerListRequest)  # type: ignore
rebuild_dataclass(GetPartnerListResponse)  # type: ignore
rebuild_dataclass(GetPartnerListResponseError)  # type: ignore
rebuild_dataclass(GetPartnerCountRequest)  # type: ignore
rebuild_dataclass(GetPartnerCountResponse)  # type: ignore
rebuild_dataclass(GetPartnerCountResponseError)  # type: ignore
rebuild_dataclass(GetPartnerTokenResponse)  # type: ignore
rebuild_dataclass(GetPartnerTokenResponseError)  # type: ignore
rebuild_dataclass(PostPartnerPublicKeyResponse)  # type: ignore
rebuild_dataclass(PostPartnerPublicKeyResponseError)  # type: ignore
rebuild_dataclass(DeletePartnerResponse)  # type: ignore
rebuild_dataclass(DeletePartnerResponseError)  # type: ignore
rebuild_dataclass(GetPartnerAddressOrponResponse)  # type: ignore
rebuild_dataclass(GetPartnerAddressOrponResponseError)  # type: ignore
rebuild_dataclass(IdTokenPayload)  # type: ignore
rebuild_dataclass(NotificationTemplate)  # type: ignore
rebuild_dataclass(NotificationTemplateSavingError)  # type: ignore
rebuild_dataclass(NotificationTemplatePartnerSavingError)  # type: ignore
rebuild_dataclass(PostNotificationTemplateRequest)  # type: ignore
rebuild_dataclass(PostNotificationTemplateResponse)  # type: ignore
rebuild_dataclass(PostNotificationTemplateResponseError)  # type: ignore
rebuild_dataclass(GetNotificationTemplateResponse)  # type: ignore
rebuild_dataclass(GetNotificationTemplateResponseError)  # type: ignore
rebuild_dataclass(GetNotificationTemplateListRequest)  # type: ignore
rebuild_dataclass(GetNotificationTemplateListResponse)  # type: ignore
rebuild_dataclass(GetNotificationTemplateListResponseError)  # type: ignore
rebuild_dataclass(GetNotificationTemplateCountRequest)  # type: ignore
rebuild_dataclass(GetNotificationTemplateCountResponse)  # type: ignore
rebuild_dataclass(GetNotificationTemplateCountResponseError)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerAttachRequest)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerAttachResponse)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerAttachResponseError)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerDetachRequest)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerDetachResponse)  # type: ignore
rebuild_dataclass(PutNotificationTemplatePartnerDetachResponseError)  # type: ignore
rebuild_dataclass(DeleteNotificationTemplateResponse)  # type: ignore
rebuild_dataclass(DeleteNotificationTemplateResponseError)  # type: ignore
rebuild_dataclass(NotificationTemplateFilter)  # type: ignore
rebuild_dataclass(NotificationTemplatePaging)  # type: ignore
