from typing import Annotated, Any from arcade.sdk import ToolContext, tool from arcade.sdk.auth import Asana from arcade_asana.constants import USER_OPT_FIELDS from arcade_asana.models import AsanaClient from arcade_asana.utils import ( get_next_page, get_unique_workspace_id_or_raise_error, remove_none_values, ) @tool(requires_auth=Asana(scopes=["default"])) async def list_users( context: ToolContext, workspace_id: Annotated[ str | None, "The workspace ID to list users from. Defaults to None. If no workspace ID is provided, " "it will use the current user's workspace , if there's only one. If the user has multiple " "workspaces, it will raise an error.", ] = None, limit: Annotated[ int, "The maximum number of users to retrieve. Min is 1, max is 100. Defaults to 100.", ] = 100, next_page_token: Annotated[ str | None, "The token to retrieve the next page of users. Defaults to None (start from the first page " "of users)", ] = None, ) -> Annotated[ dict[str, Any], "List users in Asana", ]: """List users in Asana""" limit = max(1, min(100, limit)) if not workspace_id: workspace_id = await get_unique_workspace_id_or_raise_error(context) client = AsanaClient(context.get_auth_token_or_empty()) response = await client.get( "/users", params=remove_none_values({ "workspace": workspace_id, "limit": limit, "offset": next_page_token, "opt_fields": USER_OPT_FIELDS, }), ) return { "users": response["data"], "count": len(response["data"]), "next_page": get_next_page(response), } @tool(requires_auth=Asana(scopes=["default"])) async def get_user_by_id( context: ToolContext, user_id: Annotated[str, "The user ID to get."], ) -> Annotated[dict[str, Any], "The user information."]: """Get a user by ID""" client = AsanaClient(context.get_auth_token_or_empty()) response = await client.get(f"/users/{user_id}", params={"opt_fields": USER_OPT_FIELDS}) return {"user": response}