""" Pydantic models for the IAM module Models follow the nomenclature of: - Sub-models: "Schema" - Mixins: "Mixin" - Models: "" ie "IAMGetGroupPermissionsResponse" """ from typing import Optional, Annotated from pydantic import EmailStr, ConfigDict, Field from src.service.schemas import ServiceIDMixin from src.organisation.schemas import OrgIDMixin from src.schemas import CustomBaseModel from user.schemas import UserIDMixin class UserSchema(CustomBaseModel): model_config = ConfigDict(from_attributes=True, extra="ignore") id: int first_name: str last_name: str email: EmailStr class PermissionSchema(CustomBaseModel): model_config = ConfigDict(from_attributes=True, extra="ignore") service_name: str resource: str action: str class GroupSchema(CustomBaseModel): id: int name: str class GroupIDMixin(CustomBaseModel): group_id: int = Field(gt=0) class PermIDMixin(CustomBaseModel): permission_id: int = Field(gt=0) class IAMGetGroupPermissionsResponse(CustomBaseModel): permissions: list[PermissionSchema] class IAMGetGroupUsersResponse(CustomBaseModel): users : list[UserSchema] class IAMPostGroupRequest(OrgIDMixin): name: str = Field(min_length=3) class IAMPostGroupResponse(CustomBaseModel): group: GroupSchema class IAMPutGroupPermissionRequest(GroupIDMixin, PermIDMixin, OrgIDMixin): pass class IAMPutGroupPermissionResponse(CustomBaseModel): group: GroupSchema permissions: list[PermissionSchema] class IAMPutGroupUserRequest(GroupIDMixin, UserIDMixin, OrgIDMixin): pass class IAMPutGroupUserResponse(CustomBaseModel): group: GroupSchema users: list[UserSchema] class IAMDeleteGroupPermissionRequest(GroupIDMixin, PermIDMixin): pass class IAMDeleteGroupPermissionResponse(CustomBaseModel): group: GroupSchema permissions: list[PermissionSchema] class IAMDeleteGroupUserRequest(GroupIDMixin, UserIDMixin): pass class IAMDeleteGroupUserResponse(CustomBaseModel): group: GroupSchema users: list[UserSchema] class IAMGetPermissionsResponse(CustomBaseModel): permissions: list[PermissionSchema] class IAMPostPermissionRequest(ServiceIDMixin): resource: str action: str class IAMPostPermissionResponse(CustomBaseModel): permission: PermissionSchema class IAMDeletePermissionRequest(PermIDMixin): pass class IAMGetPermissionsSearchRequest(OrgIDMixin): service_id: Annotated[int | None, Field(gt=0)] = None resource: Optional[str] = None action: Optional[str] = None class IAMGetPermissionsSearchResponse(CustomBaseModel): permissions: list[PermissionSchema]