# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/user/v1/keyapis_user_system_v1.proto, keyapis/user/v1/keyapis_user_user_v1.proto
# plugin: python-betterproto
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 UserType(betterproto.Enum):
    """Справочник типов пользователей. # Тип: byte"""

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

    OWNER = 1
    """Владелец УК"""

    EMPLOYEE = 2
    """Сотрудник УК"""

    MASTER = 3
    """Мастер житель"""

    SLAVE = 4
    """Подчиненный житель"""

    ADMIN = 5
    """Администратор"""

    SELLER = 6
    """Сотрудники ГАП"""

    MRF = 7
    """МРФ"""

    BACKOFFICE = 8
    """ГРЗУК"""

    SERVICE = 9
    """Сервис"""

    ROOT = 10
    """Супер админ"""

    BTI = 11
    """Сотрудник БТИ"""

    LTP_FIRST = 12
    """Сотрудник 1 ЛТП"""

    EXTERNAL_SELLER = 13
    """Сотрудник ГАП"""

    APPLICATION = 14
    """Приложение"""

    MANAGER = 15
    """Администратор точек продаж"""

    DEVICE_ADMIN = 16
    """Администратор устройств"""


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

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

    NEW = 1
    """Не активный пользователь"""

    DEMO = 2
    """Демо пользователь"""

    ACTIVE = 3
    """Активный пользователь"""

    BLOCKED = 4
    """Архивный пользователь"""


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

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

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

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

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

    EMAIL = 4
    """По электронной почте"""

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

    DESCRIPTION = 6
    """По описанию (collate-agnostic ordering)"""


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

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

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

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


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

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


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

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


@dataclass(eq=False, repr=False)
class DeleteUserSessionsResponseError(betterproto.Message):
    """Ошибка запроса"""

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


@dataclass(eq=False, repr=False)
class User(betterproto.Message):
    """Пользователь"""

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

    type: "UserType" = betterproto.enum_field(2)
    """Тип пользователя"""

    status_type: "UserStatusType" = betterproto.enum_field(3)
    """Статус пользователя"""

    login: Optional[str] = betterproto.message_field(4, wraps=betterproto.TYPE_STRING)
    """Логин. # Диапазон: 3..64"""

    email: Optional[str] = betterproto.message_field(5, wraps=betterproto.TYPE_STRING)
    """Электронная почта. # Диапазон: 4..256"""

    phone_number: Optional[str] = betterproto.message_field(
        6, wraps=betterproto.TYPE_STRING
    )
    """Номер телефона. # Диапазон: 5..14"""

    company_id: Optional[int] = betterproto.message_field(
        7, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор компании. # Диапазон: 1..2147483647"""

    mrf_id: Optional[int] = betterproto.message_field(8, wraps=betterproto.TYPE_INT32)
    """Идентификатор МРФ"""

    rf_id: Optional[int] = betterproto.message_field(9, wraps=betterproto.TYPE_INT32)
    """Идентификатор РФ"""

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

    changed_at: datetime = betterproto.message_field(11)
    """Дата изменения. # Тип: DateTime"""

    activated_at: datetime = betterproto.message_field(12)
    """Дата активации. # Тип: DateTime"""

    blocked_at: datetime = betterproto.message_field(13)
    """Дата активации. # Тип: DateTime"""

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

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

    invoice_email: Optional[str] = betterproto.message_field(
        16, wraps=betterproto.TYPE_STRING
    )
    """Электронная почта для чеков. # Диапазон: 4..256"""

    vc_user_id: Optional[int] = betterproto.message_field(
        17, wraps=betterproto.TYPE_INT32
    )
    """
    Идентификатор пользователя в Видеонаблюдении. Вычисляется на стороне
    сервера при создании пользователя
    """

    description: Optional[str] = betterproto.message_field(
        18, wraps=betterproto.TYPE_STRING
    )
    """Описание"""

    ustore_user_id: Optional[int] = betterproto.message_field(
        19, wraps=betterproto.TYPE_INT32
    )
    """
    Идентификатор пользователя в сервисе ustore. Вычисляется на стороне сервера
    при создании пользователя
    """

    env_url: Optional[str] = betterproto.message_field(
        20, wraps=betterproto.TYPE_STRING
    )
    """Адрес окружения для внутренних пользователей"""


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

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

    user_type_forbidden: "UserSavingErrorUserTypeForbidden" = betterproto.message_field(
        2, group="reason"
    )
    """Нельзя удалять пользователя с данным типом"""

    user_status_forbidden: "UserSavingErrorUserStatusForbidden" = (
        betterproto.message_field(3, group="reason")
    )
    """Нельзя удалять пользователя в текущем статусе"""

    mrf_id_is_required_for_user_type: "UserSavingErrorMrfIdRequiredForUserType" = (
        betterproto.message_field(4, group="reason")
    )
    """Идентификатор МРФ обязателен"""

    creator_must_be_admin: "UserSavingErrorCreatorMustBeAdmin" = (
        betterproto.message_field(5, group="reason")
    )
    """Создатель пользователя должен иметь роль Admin"""

    rf_id_does_not_match_mrf_id: "UserSavingErrorRfIdDoesNotMatchMrfId" = (
        betterproto.message_field(6, group="reason")
    )
    """Идентификатор РФ не соответствует идентификатору МРФ"""

    email_is_already_taken: "UserSavingErrorEmailIsAlreadyTaken" = (
        betterproto.message_field(7, group="reason")
    )
    """Email уже занят"""

    entity_not_found: "UserSavingErrorEntityNotFound" = betterproto.message_field(
        8, group="reason"
    )
    """Связанная с пользователем сущность не найдена"""


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

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorUserTypeForbidden(betterproto.Message):
    """
    Нельзя удалять пользователя с данным типом. Доступные типы: - Жилец
    (мастер)
    """

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorUserStatusForbidden(betterproto.Message):
    """
    Нельзя удалять пользователя в текущем статусе. В каких статусах можно
    удалить пользователя: - demo
    """

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorMrfIdRequiredForUserType(betterproto.Message):
    """Для данного типа пользователя идентификатор МРФ обязателен"""

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorCreatorMustBeAdmin(betterproto.Message):
    """Создатель пользователя должен иметь роль Admin"""

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorRfIdDoesNotMatchMrfId(betterproto.Message):
    """Идентификатор РФ не соответствует идентификатору МРФ"""

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorEmailIsAlreadyTaken(betterproto.Message):
    """Email уже занят"""

    pass


@dataclass(eq=False, repr=False)
class UserSavingErrorEntityNotFound(betterproto.Message):
    """
    Связанная с пользователем сущность не найдена. Например: компания по
    company_id, пользователь по owner_user_id
    """

    field: str = betterproto.string_field(1)
    """Поле"""


@dataclass(eq=False, repr=False)
class UserCode(betterproto.Message):
    """Идентификационный код пользователя"""

    code: int = betterproto.int32_field(1)
    """
    Идентификационный код. Если поле не заполнено, генерируется автоматически.
    # Диапазон: 10000..99999
    """

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

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

    creator_user_id: int = betterproto.int32_field(4)
    """Идентификатор создателя кода"""

    creator_user_type: "UserType" = betterproto.enum_field(5)
    """Тип создателя кода"""


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

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


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

    data: "User" = betterproto.message_field(1, group="type")
    """Пользователь"""

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


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

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


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

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

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


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

    data: "User" = betterproto.message_field(1, group="type")
    """Пользователь"""

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


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

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


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего пользователей"""

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


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

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


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

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


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

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


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

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

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


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

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


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

    data: "UserCode" = betterproto.message_field(1, group="type")
    """Идентификационный код"""

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


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

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

    user_code_not_found: "GetUserCodeResponseErrorUserCodeNotFound" = (
        betterproto.message_field(2, group="reason")
    )
    """У пользователя отсутствует идентификационный код"""


@dataclass(eq=False, repr=False)
class GetUserCodeResponseErrorUserCodeNotFound(betterproto.Message):
    """У пользователя отсутствует идентификационный код"""

    pass


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

    user_code: "UserCode" = betterproto.message_field(1)
    """Идентификационный код пользователя"""


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

    data: "UserCode" = betterproto.message_field(1, group="type")
    """Идентификационный код пользователя"""

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


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

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


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

    company_ids: List[int] = betterproto.int32_field(1)
    """По идентификаторам компаний"""

    user_types: List["UserType"] = betterproto.enum_field(2)
    """По типам"""

    user_status_types: List["UserStatusType"] = betterproto.enum_field(3)
    """По статусам"""

    emails: List[str] = betterproto.string_field(4)
    """По электронной почте"""

    phone_numbers: List[str] = betterproto.string_field(5)
    """По номеру телефона"""

    logins: List[str] = betterproto.string_field(6)
    """По логину"""

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

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


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

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

    direction_type: "UserPagingDirectionType" = 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 PostUserRequest(betterproto.Message):
    """Запрос на создание пользователя"""

    data: "User" = betterproto.message_field(1)
    """Пользователь"""


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

    data: "User" = betterproto.message_field(1, group="type")
    """Пользователь"""

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


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

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

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


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

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

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


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

    pass


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

    pass


class UserServiceStub(betterproto.ServiceStub):
    async def get_user(
        self,
        get_user_request: "GetUserRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetUserResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/GetUser",
            get_user_request,
            GetUserResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_user_list(
        self,
        get_user_list_request: "GetUserListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetUserListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.user.v1.UserService/GetUserList",
            get_user_list_request,
            GetUserListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_user_count(
        self,
        get_user_count_request: "GetUserCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetUserCountResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/GetUserCount",
            get_user_count_request,
            GetUserCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_user(
        self,
        delete_user_request: "DeleteUserRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteUserResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/DeleteUser",
            delete_user_request,
            DeleteUserResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_user_sessions(
        self,
        delete_user_sessions_request: "DeleteUserSessionsRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteUserSessionsResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/DeleteUserSessions",
            delete_user_sessions_request,
            DeleteUserSessionsResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_user_code(
        self,
        get_user_code_request: "GetUserCodeRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetUserCodeResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/GetUserCode",
            get_user_code_request,
            GetUserCodeResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_user_code_create(
        self,
        post_user_code_create_request: "PostUserCodeCreateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostUserCodeCreateResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/PostUserCodeCreate",
            post_user_code_create_request,
            PostUserCodeCreateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_user(
        self,
        post_user_request: "PostUserRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostUserResponse":
        return await self._unary_unary(
            "/keyapis.user.v1.UserService/PostUser",
            post_user_request,
            PostUserResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


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.user.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class UserServiceBase(ServiceBase):

    async def get_user(self, get_user_request: "GetUserRequest") -> "GetUserResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_user_list(
        self, get_user_list_request: "GetUserListRequest"
    ) -> AsyncIterator["GetUserListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_user_count(
        self, get_user_count_request: "GetUserCountRequest"
    ) -> "GetUserCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_user(
        self, delete_user_request: "DeleteUserRequest"
    ) -> "DeleteUserResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_user_sessions(
        self, delete_user_sessions_request: "DeleteUserSessionsRequest"
    ) -> "DeleteUserSessionsResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_user_code(
        self, get_user_code_request: "GetUserCodeRequest"
    ) -> "GetUserCodeResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_user_code_create(
        self, post_user_code_create_request: "PostUserCodeCreateRequest"
    ) -> "PostUserCodeCreateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_user(
        self, post_user_request: "PostUserRequest"
    ) -> "PostUserResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_user(
        self, stream: "grpclib.server.Stream[GetUserRequest, GetUserResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_user(request)
        await stream.send_message(response)

    async def __rpc_get_user_list(
        self, stream: "grpclib.server.Stream[GetUserListRequest, GetUserListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_user_list,
            stream,
            request,
        )

    async def __rpc_get_user_count(
        self, stream: "grpclib.server.Stream[GetUserCountRequest, GetUserCountResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_user_count(request)
        await stream.send_message(response)

    async def __rpc_delete_user(
        self, stream: "grpclib.server.Stream[DeleteUserRequest, DeleteUserResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_user(request)
        await stream.send_message(response)

    async def __rpc_delete_user_sessions(
        self,
        stream: "grpclib.server.Stream[DeleteUserSessionsRequest, DeleteUserSessionsResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_user_sessions(request)
        await stream.send_message(response)

    async def __rpc_get_user_code(
        self, stream: "grpclib.server.Stream[GetUserCodeRequest, GetUserCodeResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_user_code(request)
        await stream.send_message(response)

    async def __rpc_post_user_code_create(
        self,
        stream: "grpclib.server.Stream[PostUserCodeCreateRequest, PostUserCodeCreateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_user_code_create(request)
        await stream.send_message(response)

    async def __rpc_post_user(
        self, stream: "grpclib.server.Stream[PostUserRequest, PostUserResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_user(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.user.v1.UserService/GetUser": grpclib.const.Handler(
                self.__rpc_get_user,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetUserRequest,
                GetUserResponse,
            ),
            "/keyapis.user.v1.UserService/GetUserList": grpclib.const.Handler(
                self.__rpc_get_user_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetUserListRequest,
                GetUserListResponse,
            ),
            "/keyapis.user.v1.UserService/GetUserCount": grpclib.const.Handler(
                self.__rpc_get_user_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetUserCountRequest,
                GetUserCountResponse,
            ),
            "/keyapis.user.v1.UserService/DeleteUser": grpclib.const.Handler(
                self.__rpc_delete_user,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteUserRequest,
                DeleteUserResponse,
            ),
            "/keyapis.user.v1.UserService/DeleteUserSessions": grpclib.const.Handler(
                self.__rpc_delete_user_sessions,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteUserSessionsRequest,
                DeleteUserSessionsResponse,
            ),
            "/keyapis.user.v1.UserService/GetUserCode": grpclib.const.Handler(
                self.__rpc_get_user_code,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetUserCodeRequest,
                GetUserCodeResponse,
            ),
            "/keyapis.user.v1.UserService/PostUserCodeCreate": grpclib.const.Handler(
                self.__rpc_post_user_code_create,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostUserCodeCreateRequest,
                PostUserCodeCreateResponse,
            ),
            "/keyapis.user.v1.UserService/PostUser": grpclib.const.Handler(
                self.__rpc_post_user,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostUserRequest,
                PostUserResponse,
            ),
        }


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.user.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }
