# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/access_management/v1/keyapis_access_management_group_v1.proto, keyapis/access_management/v1/keyapis_access_management_system_v1.proto, keyapis/access_management/v1/keyapis_access_management_template_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 GroupPagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

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

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

    TITLE = 2
    """По наименованию"""


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

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

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

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


class GroupUserPagingOrderByType(betterproto.Enum):
    """Справочник типов сортировки"""

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

    GROUP_ID = 1
    """По Идентификатору группы"""

    USER_ID = 2
    """По Идентификатору пользователя"""


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

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

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

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


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

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

    KEY = 1
    """По ключу атрибута"""

    VALUE = 2
    """По значению атрибута"""


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

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

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

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


class GroupTemplateGroupPagingOrderByType(betterproto.Enum):
    """Справочник типов сортировки"""

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

    GROUP_ID = 1
    """По Идентификатору группы пользователя"""

    GROUP_TEMPLATE_ID = 2
    """По шаблону групп"""


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

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

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

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


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

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

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

    TITLE = 2
    """По наименованию"""


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

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

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

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


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

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


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

    data: str = betterproto.string_field(1, group="type")
    """Значение ключа доступа ApiKey. # Тип: Guid"""


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

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


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

    pass


@dataclass(eq=False, repr=False)
class Claim(betterproto.Message):
    """Атрибут пользователя"""

    key: str = betterproto.string_field(1)
    """Ключ атрибута"""

    value: str = betterproto.string_field(2)
    """Значение атрибута"""


@dataclass(eq=False, repr=False)
class UserGroup(betterproto.Message):
    """Связка пользователя с группой"""

    user_id: str = betterproto.string_field(1)
    """
    Идентификатор пользователя. Соответствует subject, sub, client_id из JWT. #
    Диапазон: 3..256
    """

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


@dataclass(eq=False, repr=False)
class Group(betterproto.Message):
    """Группа атрибутов пользователя"""

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

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

    description: str = betterproto.string_field(3)
    """Описание. # Диапазон: 3..256"""

    claims: List["Claim"] = betterproto.message_field(4)
    """
    Массив атрибутов группы. Эти атрибуты назначены пользователям, которые
    принадлежат группе. # Диапазон: 0..100
    """

    requirements: List["Claim"] = betterproto.message_field(5)
    """
    Требования, означающие принадлежность пользователя к данной группе.
    Пользователь принадлежит группе, если все атрибуты требований группы
    присутствуют у пользователя и имеют те же значения. # Диапазон: 0..10
    """

    deleted_at: datetime = betterproto.message_field(6)
    """
    Дата удаления группы из использования. Группа не участвует в определении
    разрешений пользователя, если дата deleted_at непустая и уже в прошлом
    """

    tags: List[str] = betterproto.string_field(7)
    """Теги группы. # Диапазон: 0..10"""


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

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


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

    data: "Group" = betterproto.message_field(1, group="type")
    """Группа"""

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


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

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


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

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

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


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

    data: "Group" = betterproto.message_field(1, group="type")
    """Группа"""

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


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

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


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

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


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

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

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


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

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


@dataclass(eq=False, repr=False)
class GroupFilter(betterproto.Message):
    """Фильтр групп"""

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

    requirements: Dict[str, str] = betterproto.map_field(
        2, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По requirements группы. Возвращаем группы, у которых
    Group.requirements.key=GroupFilter.requirements[n].key И
    Group.requirements.value=GroupFilter.requirements[n].value. При пустом
    GroupFilter.requirements[n].value возвращаем все группы, у которых
    Group.requirements.key=GroupFilter.requirements[n].key. При передаче
    нескольких элементов map они работают в выборке через И
    """

    claims: Dict[str, str] = betterproto.map_field(
        3, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По claims группы. Возвращаем группы, у которых
    Group.claim.key=GroupFilter.claims[n].key И
    Group.claims.value=GroupFilter.claims[n].value. При пустом
    GroupFilter.claims[n].value возвращаем все группы, у которых
    Group.claims.key=GroupFilter.claims[n].key. При передаче нескольких
    элементов map они работают в выборке через И
    """

    tags: List[str] = betterproto.string_field(4)
    """По тегам. # Диапазон: 0..10"""

    hide_deleted: Optional[bool] = betterproto.message_field(
        5, wraps=betterproto.TYPE_BOOL
    )
    """
    Скрывать удалённые элементы. Если значение — true, возвращаются только
    записи, у которых deleted_at = null или deleted_at > текущего времени. Если
    значение — false или не задано, возвращаются все записи, включая удалённые
    """


@dataclass(eq=False, repr=False)
class GroupPaging(betterproto.Message):
    """Пагинация групп"""

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

    direction_type: "GroupPagingDirectionType" = 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 PostGroupRequest(betterproto.Message):
    """Запрос сохранения группы"""

    data: "Group" = betterproto.message_field(1)
    """Группа"""


@dataclass(eq=False, repr=False)
class PostGroupByTemplateRequest(betterproto.Message):
    """Запрос создания группы по шаблону"""

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

    group_title: str = betterproto.string_field(2)
    """
    Наименование создаваемой по шаблону группы. В наименование группы будет
    добавлен суффикс GroupTemplate.group_title_suffix. # Диапазон: 3..256
    """

    group_requirements: List["Claim"] = betterproto.message_field(3)
    """
    Специфичные для создаваемой по шаблону группы Claim requirements, они будут
    добавлены к requirements создаваемой по шаблону группы. # Диапазон: 0..10
    """


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

    data: "Group" = betterproto.message_field(1, group="type")
    """Группа"""

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


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

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


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

    data: "Group" = betterproto.message_field(1, group="type")
    """Группа"""

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


@dataclass(eq=False, repr=False)
class PostGroupByTemplateResponseError(betterproto.Message):
    """Ошибка запроса создания группы"""

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

    group_template_not_found_error: "GroupTemplateNotFoundError" = (
        betterproto.message_field(2, group="reason")
    )
    """Шаблон не найден"""


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

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


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

    pass


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

    user_group: "UserGroup" = betterproto.message_field(1)
    """Связь пользователя и группы"""


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

    pass


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

    user_group: "UserGroup" = betterproto.message_field(1)
    """Связь пользователя и группы"""


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

    filter: "GroupUserFilter" = betterproto.message_field(1)
    """Фильтр связей пользователей и групп"""

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


@dataclass(eq=False, repr=False)
class GroupUserPaging(betterproto.Message):
    """Пагинация связей пользователей и групп"""

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

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class GroupUserFilter(betterproto.Message):
    """
    Фильтр для запроса связей пользователей и групп. При передаче массива в
    параметр фильтра элементы массива работают в выборке через ИЛИ. При
    передаче нескольких разных параметров фильтра они работают в выборке через
    И
    """

    group_ids: List[str] = betterproto.string_field(1)
    """По Идентификаторам группы"""

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


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

    data: "UserGroup" = betterproto.message_field(1, group="type")
    """Связь пользователя и группы"""


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

    filter: "GroupUserFilter" = betterproto.message_field(1)
    """Фильтр связей пользователей и групп"""


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

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


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

    pass


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

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего уникальных атрибутов пользователя"""


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

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""


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

    data: bool = betterproto.bool_field(1, group="type")
    """Флаг наличия"""

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


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

    claim_filter_empty: "GetGroupClaimExistResponseErrorClaimFilterEmptyError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка пустого фильтра по атрибутам пользователя"""


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

    pass


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

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""

    paging: "GroupClaimPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация по атрибутам пользователя"""


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

    data: "Claim" = betterproto.message_field(1, group="type")
    """Атрибут пользователя"""


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

    user_id: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По идентификатору пользователя. Соответствует subject, sub, client_id из
    JWT. Для пользователя Ключа это user_id Ключа
    """

    claims: Dict[str, str] = betterproto.map_field(
        2, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По назначенным атрибутам пользователя. Фильтр ограничивает возвращаемые
    атрибуты данным списком. Возвращаем атрибуты групп, у которых
    Claim.key=claims[n].key И (Claim.value=claims[n].value ИЛИ claims[n].value
    пустой). При пустом GroupClaimFilter.claims не ограничиваем выдачу, отдаем
    все Claims, назначенные пользователю
    """

    user_data: "GroupClaimFilterUserData" = betterproto.message_field(3)
    """
    По условию принадлежности к группе. Пользователь принадлежит группе, если
    user_data полностью удовлетворяет требованиям группы, то есть user_data
    содержит в себе Group.requirements целиком
    """

    api_key_hash: str = betterproto.string_field(4)
    """Хешированное SHA256 значение ключа доступа ApiKey"""


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

    claims: Dict[str, str] = betterproto.map_field(
        1, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """Атрибуты пользователя, claims которого мы хотим получить"""


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

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

    direction_type: "GroupClaimPagingDirectionType" = 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 ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

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

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


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

    group_template_id: str = betterproto.string_field(1)
    """Идентификатор шаблона группы, который не найден"""

    message: str = betterproto.string_field(2)
    """Сообщение"""


@dataclass(eq=False, repr=False)
class GroupTemplate(betterproto.Message):
    """Шаблон группы пользователей"""

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

    title: str = betterproto.string_field(2)
    """Наименование шаблона группы. # Диапазон: 3..256"""

    group_title_suffix: str = betterproto.string_field(3)
    """Суффикс наименования группы. # Диапазон: 3..256"""

    description: str = betterproto.string_field(4)
    """Описание шаблона группы. # Диапазон: 3..256"""

    claims: List["Claim"] = betterproto.message_field(5)
    """
    Массив атрибутов группы. Эти атрибуты назначены пользователям, которые
    принадлежат группе. # Диапазон: 0..100
    """

    requirements: List["Claim"] = betterproto.message_field(6)
    """
    Требования, означающие принадлежность пользователя к данной группе.
    Пользователь принадлежит группе, если все атрибуты требований группы
    присутствуют у пользователя и имеют те же значения. # Диапазон: 0..10
    """

    tags: List[str] = betterproto.string_field(7)
    """Теги шаблона группы. # Диапазон: 0..10"""


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

    filter: "GroupTemplateGroupFilter" = betterproto.message_field(1)
    """Фильтр связей шаблонов групп и группы пользователя"""

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


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

    filter: "GroupTemplateGroupFilter" = betterproto.message_field(1)
    """Фильтр связей шаблонов групп и группы пользователя"""


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего связей шаблонов групп и группы пользователя"""


@dataclass(eq=False, repr=False)
class GroupTemplateGroupPaging(betterproto.Message):
    """Пагинация шаблонов групп и группы пользователя"""

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

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


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

    data: "GroupTemplateGroup" = betterproto.message_field(1, group="type")
    """Связь шаблона группы и группы пользователя"""


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

    group_template_group: "GroupTemplateGroup" = betterproto.message_field(1)
    """Связь шаблона группы и группы пользователя"""


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

    pass


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

    group_template_group: "GroupTemplateGroup" = betterproto.message_field(1)
    """Связь шаблона группы и группы пользователя"""


@dataclass(eq=False, repr=False)
class GroupTemplateGroup(betterproto.Message):
    """
    Связка шаблона группы и группы пользователя. Задает область ресурсов
    (resource scope), доступную пользователю. Используется для контроля доступа
    к шаблону группы
    """

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

    group_template_id: str = betterproto.string_field(2)
    """Идентификатор шаблона группы. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GroupTemplateGroupFilter(betterproto.Message):
    """
    Фильтр для запроса связей шаблона группы и группы пользователя. При
    передаче массива в параметр фильтра элементы массива работают в выборке
    через ИЛИ. При передаче нескольких разных параметров фильтра они работают в
    выборке через И
    """

    group_ids: List[str] = betterproto.string_field(1)
    """По Идентификатору группы пользователя"""

    group_template_ids: List[str] = betterproto.string_field(2)
    """По шаблону группы"""


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

    pass


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

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


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

    data: "GroupTemplate" = betterproto.message_field(1, group="type")
    """Шаблон группы"""

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


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

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


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

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

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


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

    data: "GroupTemplate" = betterproto.message_field(1, group="type")
    """Шаблон группы"""

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


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

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


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

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


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

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

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


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

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


@dataclass(eq=False, repr=False)
class GroupTemplateFilter(betterproto.Message):
    """
    Фильтр шаблонов групп. При передаче массива в параметр фильтра элементы
    массива работают в выборке через ИЛИ. При передаче нескольких разных
    параметров фильтра они работают в выборке через И
    """

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

    tags: List[str] = betterproto.string_field(2)
    """По тегам. # Диапазон: 0..10"""


@dataclass(eq=False, repr=False)
class GroupTemplatePaging(betterproto.Message):
    """Пагинация шаблонов групп"""

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

    direction_type: "GroupTemplatePagingDirectionType" = 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 PostGroupTemplateRequest(betterproto.Message):
    """Запрос сохранения шаблона группы"""

    data: "GroupTemplate" = betterproto.message_field(1)
    """Шаблон группы"""


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

    data: "GroupTemplate" = betterproto.message_field(1, group="type")
    """Шаблон группы"""

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


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

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


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

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


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

    pass


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

    pass


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

    pass


class GroupServiceStub(betterproto.ServiceStub):
    async def get_group(
        self,
        get_group_request: "GetGroupRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroup",
            get_group_request,
            GetGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_list(
        self,
        get_group_list_request: "GetGroupListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetGroupListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupList",
            get_group_list_request,
            GetGroupListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_count(
        self,
        get_group_count_request: "GetGroupCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupCount",
            get_group_count_request,
            GetGroupCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group(
        self,
        post_group_request: "PostGroupRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PostGroup",
            post_group_request,
            PostGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_group(
        self,
        delete_group_request: "DeleteGroupRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/DeleteGroup",
            delete_group_request,
            DeleteGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group_by_template(
        self,
        post_group_by_template_request: "PostGroupByTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostGroupByTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PostGroupByTemplate",
            post_group_by_template_request,
            PostGroupByTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_user_attach(
        self,
        put_group_user_attach_request: "PutGroupUserAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupUserAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupUserAttach",
            put_group_user_attach_request,
            PutGroupUserAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_user_detach(
        self,
        put_group_user_detach_request: "PutGroupUserDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupUserDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupUserDetach",
            put_group_user_detach_request,
            PutGroupUserDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_user_list(
        self,
        get_group_user_list_request: "GetGroupUserListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetGroupUserListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupUserList",
            get_group_user_list_request,
            GetGroupUserListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_user_count(
        self,
        get_group_user_count_request: "GetGroupUserCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupUserCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupUserCount",
            get_group_user_count_request,
            GetGroupUserCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_claim_list(
        self,
        get_group_claim_list_request: "GetGroupClaimListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetGroupClaimListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimList",
            get_group_claim_list_request,
            GetGroupClaimListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_claim_count(
        self,
        get_group_claim_count_request: "GetGroupClaimCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupClaimCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimCount",
            get_group_claim_count_request,
            GetGroupClaimCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_claim_exist(
        self,
        get_group_claim_exist_request: "GetGroupClaimExistRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupClaimExistResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimExist",
            get_group_claim_exist_request,
            GetGroupClaimExistResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_api_key_create(
        self,
        put_group_api_key_create_request: "PutGroupApiKeyCreateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupApiKeyCreateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyCreate",
            put_group_api_key_create_request,
            PutGroupApiKeyCreateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_api_key_delete(
        self,
        put_group_api_key_delete_request: "PutGroupApiKeyDeleteRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupApiKeyDeleteResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyDelete",
            put_group_api_key_delete_request,
            PutGroupApiKeyDeleteResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class GroupTemplateServiceStub(betterproto.ServiceStub):
    async def get_group_template(
        self,
        get_group_template_request: "GetGroupTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplate",
            get_group_template_request,
            GetGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_template_list(
        self,
        get_group_template_list_request: "GetGroupTemplateListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetGroupTemplateListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateList",
            get_group_template_list_request,
            GetGroupTemplateListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_template_count(
        self,
        get_group_template_count_request: "GetGroupTemplateCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupTemplateCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateCount",
            get_group_template_count_request,
            GetGroupTemplateCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group_template(
        self,
        post_group_template_request: "PostGroupTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PostGroupTemplate",
            post_group_template_request,
            PostGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_group_template(
        self,
        delete_group_template_request: "DeleteGroupTemplateRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/DeleteGroupTemplate",
            delete_group_template_request,
            DeleteGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_template_group_list(
        self,
        get_group_template_group_list_request: "GetGroupTemplateGroupListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetGroupTemplateGroupListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupList",
            get_group_template_group_list_request,
            GetGroupTemplateGroupListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_template_group_count(
        self,
        get_group_template_group_count_request: "GetGroupTemplateGroupCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetGroupTemplateGroupCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupCount",
            get_group_template_group_count_request,
            GetGroupTemplateGroupCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_template_group_attach(
        self,
        put_group_template_group_attach_request: "PutGroupTemplateGroupAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupTemplateGroupAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupAttach",
            put_group_template_group_attach_request,
            PutGroupTemplateGroupAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_template_group_detach(
        self,
        put_group_template_group_detach_request: "PutGroupTemplateGroupDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutGroupTemplateGroupDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupDetach",
            put_group_template_group_detach_request,
            PutGroupTemplateGroupDetachResponse,
            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.access_management.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class GroupServiceBase(ServiceBase):

    async def get_group(
        self, get_group_request: "GetGroupRequest"
    ) -> "GetGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_list(
        self, get_group_list_request: "GetGroupListRequest"
    ) -> AsyncIterator["GetGroupListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_count(
        self, get_group_count_request: "GetGroupCountRequest"
    ) -> "GetGroupCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group(
        self, post_group_request: "PostGroupRequest"
    ) -> "PostGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_group(
        self, delete_group_request: "DeleteGroupRequest"
    ) -> "DeleteGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group_by_template(
        self, post_group_by_template_request: "PostGroupByTemplateRequest"
    ) -> "PostGroupByTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_user_attach(
        self, put_group_user_attach_request: "PutGroupUserAttachRequest"
    ) -> "PutGroupUserAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_user_detach(
        self, put_group_user_detach_request: "PutGroupUserDetachRequest"
    ) -> "PutGroupUserDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_user_list(
        self, get_group_user_list_request: "GetGroupUserListRequest"
    ) -> AsyncIterator["GetGroupUserListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_user_count(
        self, get_group_user_count_request: "GetGroupUserCountRequest"
    ) -> "GetGroupUserCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_claim_list(
        self, get_group_claim_list_request: "GetGroupClaimListRequest"
    ) -> AsyncIterator["GetGroupClaimListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_claim_count(
        self, get_group_claim_count_request: "GetGroupClaimCountRequest"
    ) -> "GetGroupClaimCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_claim_exist(
        self, get_group_claim_exist_request: "GetGroupClaimExistRequest"
    ) -> "GetGroupClaimExistResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_api_key_create(
        self, put_group_api_key_create_request: "PutGroupApiKeyCreateRequest"
    ) -> "PutGroupApiKeyCreateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_api_key_delete(
        self, put_group_api_key_delete_request: "PutGroupApiKeyDeleteRequest"
    ) -> "PutGroupApiKeyDeleteResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_group(
        self, stream: "grpclib.server.Stream[GetGroupRequest, GetGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group(request)
        await stream.send_message(response)

    async def __rpc_get_group_list(
        self, stream: "grpclib.server.Stream[GetGroupListRequest, GetGroupListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_list,
            stream,
            request,
        )

    async def __rpc_get_group_count(
        self,
        stream: "grpclib.server.Stream[GetGroupCountRequest, GetGroupCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_count(request)
        await stream.send_message(response)

    async def __rpc_post_group(
        self, stream: "grpclib.server.Stream[PostGroupRequest, PostGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group(request)
        await stream.send_message(response)

    async def __rpc_delete_group(
        self, stream: "grpclib.server.Stream[DeleteGroupRequest, DeleteGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_group(request)
        await stream.send_message(response)

    async def __rpc_post_group_by_template(
        self,
        stream: "grpclib.server.Stream[PostGroupByTemplateRequest, PostGroupByTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group_by_template(request)
        await stream.send_message(response)

    async def __rpc_put_group_user_attach(
        self,
        stream: "grpclib.server.Stream[PutGroupUserAttachRequest, PutGroupUserAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_user_attach(request)
        await stream.send_message(response)

    async def __rpc_put_group_user_detach(
        self,
        stream: "grpclib.server.Stream[PutGroupUserDetachRequest, PutGroupUserDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_user_detach(request)
        await stream.send_message(response)

    async def __rpc_get_group_user_list(
        self,
        stream: "grpclib.server.Stream[GetGroupUserListRequest, GetGroupUserListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_user_list,
            stream,
            request,
        )

    async def __rpc_get_group_user_count(
        self,
        stream: "grpclib.server.Stream[GetGroupUserCountRequest, GetGroupUserCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_user_count(request)
        await stream.send_message(response)

    async def __rpc_get_group_claim_list(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimListRequest, GetGroupClaimListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_claim_list,
            stream,
            request,
        )

    async def __rpc_get_group_claim_count(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimCountRequest, GetGroupClaimCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_claim_count(request)
        await stream.send_message(response)

    async def __rpc_get_group_claim_exist(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimExistRequest, GetGroupClaimExistResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_claim_exist(request)
        await stream.send_message(response)

    async def __rpc_put_group_api_key_create(
        self,
        stream: "grpclib.server.Stream[PutGroupApiKeyCreateRequest, PutGroupApiKeyCreateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_api_key_create(request)
        await stream.send_message(response)

    async def __rpc_put_group_api_key_delete(
        self,
        stream: "grpclib.server.Stream[PutGroupApiKeyDeleteRequest, PutGroupApiKeyDeleteResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_api_key_delete(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_management.v1.GroupService/GetGroup": grpclib.const.Handler(
                self.__rpc_get_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupRequest,
                GetGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupList": grpclib.const.Handler(
                self.__rpc_get_group_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupListRequest,
                GetGroupListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupCount": grpclib.const.Handler(
                self.__rpc_get_group_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupCountRequest,
                GetGroupCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PostGroup": grpclib.const.Handler(
                self.__rpc_post_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupRequest,
                PostGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/DeleteGroup": grpclib.const.Handler(
                self.__rpc_delete_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteGroupRequest,
                DeleteGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PostGroupByTemplate": grpclib.const.Handler(
                self.__rpc_post_group_by_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupByTemplateRequest,
                PostGroupByTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupUserAttach": grpclib.const.Handler(
                self.__rpc_put_group_user_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupUserAttachRequest,
                PutGroupUserAttachResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupUserDetach": grpclib.const.Handler(
                self.__rpc_put_group_user_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupUserDetachRequest,
                PutGroupUserDetachResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupUserList": grpclib.const.Handler(
                self.__rpc_get_group_user_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupUserListRequest,
                GetGroupUserListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupUserCount": grpclib.const.Handler(
                self.__rpc_get_group_user_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupUserCountRequest,
                GetGroupUserCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimList": grpclib.const.Handler(
                self.__rpc_get_group_claim_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupClaimListRequest,
                GetGroupClaimListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimCount": grpclib.const.Handler(
                self.__rpc_get_group_claim_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupClaimCountRequest,
                GetGroupClaimCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimExist": grpclib.const.Handler(
                self.__rpc_get_group_claim_exist,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupClaimExistRequest,
                GetGroupClaimExistResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyCreate": grpclib.const.Handler(
                self.__rpc_put_group_api_key_create,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupApiKeyCreateRequest,
                PutGroupApiKeyCreateResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyDelete": grpclib.const.Handler(
                self.__rpc_put_group_api_key_delete,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupApiKeyDeleteRequest,
                PutGroupApiKeyDeleteResponse,
            ),
        }


class GroupTemplateServiceBase(ServiceBase):

    async def get_group_template(
        self, get_group_template_request: "GetGroupTemplateRequest"
    ) -> "GetGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_list(
        self, get_group_template_list_request: "GetGroupTemplateListRequest"
    ) -> AsyncIterator["GetGroupTemplateListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_count(
        self, get_group_template_count_request: "GetGroupTemplateCountRequest"
    ) -> "GetGroupTemplateCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group_template(
        self, post_group_template_request: "PostGroupTemplateRequest"
    ) -> "PostGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_group_template(
        self, delete_group_template_request: "DeleteGroupTemplateRequest"
    ) -> "DeleteGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_group_list(
        self, get_group_template_group_list_request: "GetGroupTemplateGroupListRequest"
    ) -> AsyncIterator["GetGroupTemplateGroupListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_group_count(
        self,
        get_group_template_group_count_request: "GetGroupTemplateGroupCountRequest",
    ) -> "GetGroupTemplateGroupCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_template_group_attach(
        self,
        put_group_template_group_attach_request: "PutGroupTemplateGroupAttachRequest",
    ) -> "PutGroupTemplateGroupAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_template_group_detach(
        self,
        put_group_template_group_detach_request: "PutGroupTemplateGroupDetachRequest",
    ) -> "PutGroupTemplateGroupDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_group_template(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateRequest, GetGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template(request)
        await stream.send_message(response)

    async def __rpc_get_group_template_list(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateListRequest, GetGroupTemplateListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_template_list,
            stream,
            request,
        )

    async def __rpc_get_group_template_count(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateCountRequest, GetGroupTemplateCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template_count(request)
        await stream.send_message(response)

    async def __rpc_post_group_template(
        self,
        stream: "grpclib.server.Stream[PostGroupTemplateRequest, PostGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group_template(request)
        await stream.send_message(response)

    async def __rpc_delete_group_template(
        self,
        stream: "grpclib.server.Stream[DeleteGroupTemplateRequest, DeleteGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_group_template(request)
        await stream.send_message(response)

    async def __rpc_get_group_template_group_list(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateGroupListRequest, GetGroupTemplateGroupListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_template_group_list,
            stream,
            request,
        )

    async def __rpc_get_group_template_group_count(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateGroupCountRequest, GetGroupTemplateGroupCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template_group_count(request)
        await stream.send_message(response)

    async def __rpc_put_group_template_group_attach(
        self,
        stream: "grpclib.server.Stream[PutGroupTemplateGroupAttachRequest, PutGroupTemplateGroupAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_template_group_attach(request)
        await stream.send_message(response)

    async def __rpc_put_group_template_group_detach(
        self,
        stream: "grpclib.server.Stream[PutGroupTemplateGroupDetachRequest, PutGroupTemplateGroupDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_template_group_detach(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplate": grpclib.const.Handler(
                self.__rpc_get_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateRequest,
                GetGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateList": grpclib.const.Handler(
                self.__rpc_get_group_template_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupTemplateListRequest,
                GetGroupTemplateListResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateCount": grpclib.const.Handler(
                self.__rpc_get_group_template_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateCountRequest,
                GetGroupTemplateCountResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PostGroupTemplate": grpclib.const.Handler(
                self.__rpc_post_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupTemplateRequest,
                PostGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/DeleteGroupTemplate": grpclib.const.Handler(
                self.__rpc_delete_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteGroupTemplateRequest,
                DeleteGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupList": grpclib.const.Handler(
                self.__rpc_get_group_template_group_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupTemplateGroupListRequest,
                GetGroupTemplateGroupListResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupCount": grpclib.const.Handler(
                self.__rpc_get_group_template_group_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateGroupCountRequest,
                GetGroupTemplateGroupCountResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupAttach": grpclib.const.Handler(
                self.__rpc_put_group_template_group_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupTemplateGroupAttachRequest,
                PutGroupTemplateGroupAttachResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupDetach": grpclib.const.Handler(
                self.__rpc_put_group_template_group_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupTemplateGroupDetachRequest,
                PutGroupTemplateGroupDetachResponse,
            ),
        }


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