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

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

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


class PushTokenType(betterproto.Enum):
    """Справочников типов пуш-токенов. # Тип: byte"""

    TYPE_UNKNOWN = 0
    """Не указан"""

    MOBILE_FCM = 1
    """Для Mobile Firebase Cloud Messaging"""

    MOBILE_HMS = 2
    """Для Mobile Huawei Messaging System"""

    MOBILE_APNS_TEXT = 3
    """Для Mobile Apple PushToken System для текста"""

    MOBILE_APNS_CALL = 4
    """Для Mobile Apple PushToken System для звонков"""

    PWA_FCM = 5
    """Для PWA Firebase Cloud Messaging"""

    PWA_APNS = 6
    """Для PWA Apple PushToken System"""

    MOBILE_RUSTORE = 7
    """Для Mobile RuStore"""


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

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

    ID = 1
    """По идентификатору"""

    CREATED_AT = 2
    """По времени создания"""

    CHANGED_AT = 3
    """По времени изменения"""


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

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

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

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


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

    pass


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

    pass


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

    id: int = betterproto.int32_field(1)
    """Идентификатор. # Диапазон: 0..2147483647"""

    type: "PushTokenType" = betterproto.enum_field(2)
    """Тип"""

    token: str = betterproto.string_field(3)
    """Токен. # Диапазон: 16..256"""

    user_app_id: str = betterproto.string_field(4)
    """Идентификатор устройства пользователя. # Тип: Guid"""

    user_id: Optional[int] = betterproto.message_field(5, wraps=betterproto.TYPE_INT32)
    """Идентификатор пользователя. # Диапазон: 1..2147483647"""

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

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

    app_version: str = betterproto.string_field(8)
    """Версия приложения. # Диапазон: 3..256"""


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

    user_app_id: "PushTokenValidationErrorUserAppIdInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Передан некоректный идентификатор устройства пользователя"""


@dataclass(eq=False, repr=False)
class PushTokenValidationErrorUserAppIdInvalid(betterproto.Message):
    """Причины: - Cодержит значение не Guid"""

    pass


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

    user_app_id_exists: "PushTokenSavingErrorUserAppIdExists" = (
        betterproto.message_field(1, group="reason")
    )
    """Идентификатор устройства пользователя уже используется"""

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


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

    pass


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

    pass


@dataclass(eq=False, repr=False)
class PushTokenFilter(betterproto.Message):
    """Фильтр по пуш-токенам"""

    types: List["PushTokenType"] = betterproto.enum_field(1)
    """По типам пуш-токенов"""

    user_app_ids: List[str] = betterproto.string_field(2)
    """По идентификаторам устройств пользователя. # Тип: Guid"""

    user_ids: List[int] = betterproto.int32_field(3)
    """По идентификаторам пользователя"""

    begin_created_at: datetime = betterproto.message_field(4)
    """От даты создания включительно (>=)"""

    end_created_at: datetime = betterproto.message_field(5)
    """До даты создания (<)"""

    begin_changed_at: datetime = betterproto.message_field(6)
    """От даты изменения включительно (>=)"""

    end_changed_at: datetime = betterproto.message_field(7)
    """До даты изменения (<)"""


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

    user_app_ids: "PushTokenFilterValidationErrorUserAppIdsInvalid" = (
        betterproto.message_field(1, group="reason")
    )
    """Идентификаторы устройств пользователя переданы некоректно"""


@dataclass(eq=False, repr=False)
class PushTokenFilterValidationErrorUserAppIdsInvalid(betterproto.Message):
    """Причины: - Cодержит значение не Guid"""

    pass


@dataclass(eq=False, repr=False)
class PushTokenPaging(betterproto.Message):
    """Постраничный вывод"""

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

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

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

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


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

    limit: "PushTokenPagingValidationErrorLimitInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Количество передано некорректно"""

    offset: "PushTokenPagingValidationErrorOffsetInvalid" = betterproto.message_field(
        2, group="reason"
    )
    """Сдвиг передан некорректно"""


@dataclass(eq=False, repr=False)
class PushTokenPagingValidationErrorLimitInvalid(betterproto.Message):
    """Причины: - Значение количества < 0 или > 100"""

    pass


@dataclass(eq=False, repr=False)
class PushTokenPagingValidationErrorOffsetInvalid(betterproto.Message):
    """Причины: - Значение сдвига < 0"""

    pass


@dataclass(eq=False, repr=False)
class PostPushTokenRequest(betterproto.Message):
    """Запрос на создание/изменение пуш-токена"""

    data: "PushToken" = betterproto.message_field(1)
    """Пуш-токен"""


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

    data: "PushToken" = betterproto.message_field(1, group="type")
    """Пуш-токен"""

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


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

    push_token_validation: "PushTokenValidationError" = betterproto.message_field(
        1, group="reason"
    )
    """Ошибка валидации пуш-токена"""

    push_token_saving: "PushTokenSavingError" = betterproto.message_field(
        2, group="reason"
    )
    """Ошибка сохранения пуш-токена"""

    validation: "ValidationError" = betterproto.message_field(3, group="reason")
    """Ошибка валидации пуш-токена"""

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


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

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

    paging: "PushTokenPaging" = betterproto.message_field(2, group="pagination")
    """Стандартный постраничный вывод"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего пуш-токенов"""

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


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

    push_token_filter_validation: "PushTokenFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации"""

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

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


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

    data: "PushToken" = betterproto.message_field(1, group="type")
    """Пуш-токен"""

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


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

    push_token_filter_validation: "PushTokenFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации"""

    push_token_paging_validation: "PushTokenPagingValidationError" = (
        betterproto.message_field(2, group="reason")
    )
    """Ошибка пагинации по страницам"""

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

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


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

    id: int = betterproto.int32_field(1)
    """Идентификатор. # Диапазон: 0..2147483647"""


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

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


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

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


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

    user_id: int = betterproto.int32_field(1)
    """Идентификатор пользователя. # Диапазон: 1..2147483647"""


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

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


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

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


@dataclass(eq=False, repr=False)
class DeletePushTokenUserAppIdRequest(betterproto.Message):
    """Запрос удаления пуш-токена по идентификатору устройства пользователя"""

    user_app_id: str = betterproto.string_field(1)
    """Идентификатор устройства пользователя. # Тип: Guid"""


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

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


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

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


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

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

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


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


class PushTokenServiceStub(betterproto.ServiceStub):
    async def post_push_token(
        self,
        post_push_token_request: "PostPushTokenRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostPushTokenResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/PostPushToken",
            post_push_token_request,
            PostPushTokenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_push_token_list(
        self,
        get_push_token_list_request: "GetPushTokenListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetPushTokenListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.notification.v1.PushTokenService/GetPushTokenList",
            get_push_token_list_request,
            GetPushTokenListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_push_token_count(
        self,
        get_push_token_count_request: "GetPushTokenCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPushTokenCountResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/GetPushTokenCount",
            get_push_token_count_request,
            GetPushTokenCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token(
        self,
        delete_push_token_request: "DeletePushTokenRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeletePushTokenResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushToken",
            delete_push_token_request,
            DeletePushTokenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token_user_app_id(
        self,
        delete_push_token_user_app_id_request: "DeletePushTokenUserAppIdRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeletePushTokenUserAppIdResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserAppId",
            delete_push_token_user_app_id_request,
            DeletePushTokenUserAppIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token_user_id(
        self,
        delete_push_token_user_id_request: "DeletePushTokenUserIdRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeletePushTokenUserIdResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserId",
            delete_push_token_user_id_request,
            DeletePushTokenUserIdResponse,
            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.notification.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class PushTokenServiceBase(ServiceBase):

    async def post_push_token(
        self, post_push_token_request: "PostPushTokenRequest"
    ) -> "PostPushTokenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_push_token_list(
        self, get_push_token_list_request: "GetPushTokenListRequest"
    ) -> AsyncIterator["GetPushTokenListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_push_token_count(
        self, get_push_token_count_request: "GetPushTokenCountRequest"
    ) -> "GetPushTokenCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token(
        self, delete_push_token_request: "DeletePushTokenRequest"
    ) -> "DeletePushTokenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token_user_app_id(
        self, delete_push_token_user_app_id_request: "DeletePushTokenUserAppIdRequest"
    ) -> "DeletePushTokenUserAppIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token_user_id(
        self, delete_push_token_user_id_request: "DeletePushTokenUserIdRequest"
    ) -> "DeletePushTokenUserIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_push_token(
        self,
        stream: "grpclib.server.Stream[PostPushTokenRequest, PostPushTokenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_push_token(request)
        await stream.send_message(response)

    async def __rpc_get_push_token_list(
        self,
        stream: "grpclib.server.Stream[GetPushTokenListRequest, GetPushTokenListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_push_token_list,
            stream,
            request,
        )

    async def __rpc_get_push_token_count(
        self,
        stream: "grpclib.server.Stream[GetPushTokenCountRequest, GetPushTokenCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_push_token_count(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenRequest, DeletePushTokenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token_user_app_id(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenUserAppIdRequest, DeletePushTokenUserAppIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token_user_app_id(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token_user_id(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenUserIdRequest, DeletePushTokenUserIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token_user_id(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.notification.v1.PushTokenService/PostPushToken": grpclib.const.Handler(
                self.__rpc_post_push_token,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPushTokenRequest,
                PostPushTokenResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/GetPushTokenList": grpclib.const.Handler(
                self.__rpc_get_push_token_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPushTokenListRequest,
                GetPushTokenListResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/GetPushTokenCount": grpclib.const.Handler(
                self.__rpc_get_push_token_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPushTokenCountRequest,
                GetPushTokenCountResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushToken": grpclib.const.Handler(
                self.__rpc_delete_push_token,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenRequest,
                DeletePushTokenResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserAppId": grpclib.const.Handler(
                self.__rpc_delete_push_token_user_app_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenUserAppIdRequest,
                DeletePushTokenUserAppIdResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserId": grpclib.const.Handler(
                self.__rpc_delete_push_token_user_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenUserIdRequest,
                DeletePushTokenUserIdResponse,
            ),
        }
