""" Endpoints for user and permissions management. """ from typing import List from fastapi import APIRouter, Body, Query, Request from pydantic import EmailStr from monday_com_orca_backend.api import permissions from .. import models as common_models from . import models router = APIRouter() @router.get( "/permissions", response_model=permissions.models.UserPermissions, responses={ 200: { "model": permissions.models.UserPermissions, "description": "Object containing user permissions for the " "specified email address.", }, 404: { "model": common_models.BaseErrorResponse, "description": "User not found", }, }, summary="Fetch user permissions", description="Fetch permissions for a single user based on their email address.", ) async def get_user_permissions( request: Request, email: EmailStr = Query(..., description="User email address") ): return permissions.get_user_permissions(str(email)) @router.post( "/permissions", response_model=common_models.BaseCollectionResponse, responses={ 200: { "model": common_models.BaseCollectionResponse, "description": "Response includes a list of users with their permissions. " "Not found users will not be included. If no users are " "found, returns an empty list.", } }, summary="Fetch permissions for multiple users", description="Fetch permissions for multiple users based on their email addresses. " "Returns a list of users with their permissions and the total count. " "If no users are found, returns an empty list.", ) async def get_users_permissions( request: Request, emails: List[EmailStr] = Body( ..., embed=True, description="A list of user email addresses to fetch permissions for.", example=["user1@example.com", "user2@example.com"], ), limit: int = Query( 200, ge=1, le=200, description="Max number of records to return (max 200)" ), offset: int = Query(0, ge=0, description="Number of records to skip"), ): found_permissions = permissions.get_users_permissions( map(str, emails), limit=limit, offset=offset ) individual_permissions = [ models.responses.UsersPermissionsObject( email=email, permissions=permissions_obj ).model_dump() for email, permissions_obj in found_permissions.items() ] return common_models.BaseCollectionResponse( data=individual_permissions, more=len(found_permissions) > limit ) @router.get( "/permissions/meta", response_model=permissions.models.PermissionsMetadata, responses={ 200: { "model": permissions.models.PermissionsMetadata, "description": "Permission system metadata, such as scope " "levels and priorities.", } }, summary="Fetch permission system metadata", description="Fetch permission system metadata, such as scope " "levels and priorities. " "Generally used for frontend to understand the permission system and handle what " "to display based on user permissions.", ) async def get_permissions_metadata( request: Request, ): response = permissions.models.PermissionsMetadata( scope_level_priorities=dict(permissions.get_scope_level_priorities()) ) return response