"""User & Organization Handler - manages Gitea users, organizations, and teams"""
import json
from typing import Any
from plugins.gitea.client import GiteaClient
def get_tool_specifications() -> list[dict[str, Any]]:
"""Return tool specifications for ToolGenerator"""
return [
# === USERS ===
{
"name": "get_user",
"method_name": "get_user",
"description": "Get information about a Gitea user by username.",
"schema": {
"type": "object",
"properties": {
"username": {
"type": "string",
"description": "Username to look up",
"minLength": 1,
}
},
"required": ["username"],
},
"scope": "read",
},
{
"name": "list_user_repos",
"method_name": "list_user_repos",
"description": "List all public repositories of a Gitea user.",
"schema": {
"type": "object",
"properties": {
"username": {"type": "string", "description": "Username", "minLength": 1},
"page": {
"type": "integer",
"description": "Page number",
"default": 1,
"minimum": 1,
},
"limit": {
"type": "integer",
"description": "Items per page (1-100)",
"default": 30,
"minimum": 1,
"maximum": 100,
},
},
"required": ["username"],
},
"scope": "read",
},
{
"name": "search_users",
"method_name": "search_users",
"description": "Search for Gitea users by query or user ID.",
"schema": {
"type": "object",
"properties": {
"q": {
"anyOf": [{"type": "string"}, {"type": "null"}],
"description": "Search query (username or full name)",
},
"uid": {
"anyOf": [{"type": "integer"}, {"type": "null"}],
"description": "User ID to search for",
},
},
},
"scope": "read",
},
# === ORGANIZATIONS ===
{
"name": "list_organizations",
"method_name": "list_organizations",
"description": "List organizations for the current authenticated user.",
"schema": {
"type": "object",
"properties": {
"page": {
"type": "integer",
"description": "Page number",
"default": 1,
"minimum": 1,
},
"limit": {
"type": "integer",
"description": "Items per page (1-100)",
"default": 30,
"minimum": 1,
"maximum": 100,
},
},
},
"scope": "read",
},
{
"name": "get_organization",
"method_name": "get_organization",
"description": "Get information about a Gitea organization by name.",
"schema": {
"type": "object",
"properties": {
"org": {"type": "string", "description": "Organization name", "minLength": 1}
},
"required": ["org"],
},
"scope": "read",
},
{
"name": "list_org_repos",
"method_name": "list_org_repos",
"description": "List all repositories of an organization.",
"schema": {
"type": "object",
"properties": {
"org": {"type": "string", "description": "Organization name", "minLength": 1},
"page": {
"type": "integer",
"description": "Page number",
"default": 1,
"minimum": 1,
},
"limit": {
"type": "integer",
"description": "Items per page (1-100)",
"default": 30,
"minimum": 1,
"maximum": 100,
},
},
"required": ["org"],
},
"scope": "read",
},
# === TEAMS ===
{
"name": "list_org_teams",
"method_name": "list_org_teams",
"description": "List all teams in an organization.",
"schema": {
"type": "object",
"properties": {
"org": {"type": "string", "description": "Organization name", "minLength": 1},
"page": {
"type": "integer",
"description": "Page number",
"default": 1,
"minimum": 1,
},
"limit": {
"type": "integer",
"description": "Items per page (1-100)",
"default": 30,
"minimum": 1,
"maximum": 100,
},
},
"required": ["org"],
},
"scope": "read",
},
{
"name": "list_team_members",
"method_name": "list_team_members",
"description": "List all members of a team.",
"schema": {
"type": "object",
"properties": {
"team_id": {"type": "integer", "description": "Team ID", "minimum": 1},
"page": {
"type": "integer",
"description": "Page number",
"default": 1,
"minimum": 1,
},
"limit": {
"type": "integer",
"description": "Items per page (1-100)",
"default": 30,
"minimum": 1,
"maximum": 100,
},
},
"required": ["team_id"],
},
"scope": "read",
},
]
async def get_user(client: GiteaClient, username: str) -> str:
"""Get user information"""
user = await client.get_user(username)
result = {"success": True, "user": user}
return json.dumps(result, indent=2)
async def list_user_repos(
client: GiteaClient, username: str, page: int = 1, limit: int = 30
) -> str:
"""List user repositories"""
repos = await client.list_user_repos(username, page=page, limit=limit)
result = {"success": True, "count": len(repos), "repositories": repos}
return json.dumps(result, indent=2)
async def search_users(client: GiteaClient, q: str | None = None, uid: int | None = None) -> str:
"""Search users"""
users = await client.search_users(query=q, uid=uid)
result = {"success": True, "count": len(users), "users": users}
return json.dumps(result, indent=2)
# Organization operations
async def list_organizations(client: GiteaClient, page: int = 1, limit: int = 30) -> str:
"""List organizations"""
orgs = await client.list_organizations(page=page, limit=limit)
result = {"success": True, "count": len(orgs), "organizations": orgs}
return json.dumps(result, indent=2)
async def get_organization(client: GiteaClient, org: str) -> str:
"""Get organization information"""
organization = await client.get_organization(org)
result = {"success": True, "organization": organization}
return json.dumps(result, indent=2)
async def list_org_repos(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
"""List organization repositories"""
repos = await client.list_org_repos(org, page=page, limit=limit)
result = {"success": True, "count": len(repos), "repositories": repos}
return json.dumps(result, indent=2)
# Team operations
async def list_org_teams(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
"""List organization teams"""
teams = await client.list_org_teams(org, page=page, limit=limit)
result = {"success": True, "count": len(teams), "teams": teams}
return json.dumps(result, indent=2)
async def list_team_members(
client: GiteaClient, team_id: int, page: int = 1, limit: int = 30
) -> str:
"""List team members"""
members = await client.list_team_members(team_id, page=page, limit=limit)
result = {"success": True, "count": len(members), "members": members}
return json.dumps(result, indent=2)