from dooray_mcp.services import milestone_api
from dooray_mcp.types.common import ControllerResponse
from dooray_mcp.types.milestone import CreateMilestoneParams, UpdateMilestoneParams
async def list_milestones(
project_id: str, page: int = 0, size: int = 20, status: str | None = None
) -> ControllerResponse:
result = await milestone_api.list_milestones(project_id, page, size, status)
if not result.contents:
return ControllerResponse(content="No milestones found.")
lines = [f"Found {result.total_count} milestones:\n"]
for ms in result.contents:
lines.append(f"- **{ms.name}** (ID: {ms.id})")
lines.append(f" - Status: {ms.status or 'N/A'}")
lines.append(f" - Start: {ms.start_at or 'N/A'}")
lines.append(f" - End: {ms.end_at or 'N/A'}")
lines.append("")
return ControllerResponse(content="\n".join(lines))
async def get_milestone(project_id: str, milestone_id: str) -> ControllerResponse:
ms = await milestone_api.get_milestone(project_id, milestone_id)
lines = [
f"# {ms.name}",
"",
f"- **ID**: {ms.id}",
f"- **Status**: {ms.status or 'N/A'}",
f"- **Start**: {ms.start_at or 'N/A'}",
f"- **End**: {ms.end_at or 'N/A'}",
f"- **Created**: {ms.created_at or 'N/A'}",
f"- **Updated**: {ms.updated_at or 'N/A'}",
]
return ControllerResponse(content="\n".join(lines))
async def create_milestone(
project_id: str, name: str, start_at: str | None = None, end_at: str | None = None
) -> ControllerResponse:
params = CreateMilestoneParams(name=name, start_at=start_at, end_at=end_at)
ms = await milestone_api.create_milestone(project_id, params)
return ControllerResponse(
content=f"Milestone created successfully. (ID: {ms.id}, Name: {ms.name})"
)
async def update_milestone(
project_id: str,
milestone_id: str,
name: str | None = None,
status: str | None = None,
start_at: str | None = None,
end_at: str | None = None,
) -> ControllerResponse:
params = UpdateMilestoneParams(name=name, status=status, start_at=start_at, end_at=end_at)
ms = await milestone_api.update_milestone(project_id, milestone_id, params)
return ControllerResponse(content=f"Milestone updated successfully. (ID: {ms.id})")
async def delete_milestone(project_id: str, milestone_id: str) -> ControllerResponse:
await milestone_api.delete_milestone(project_id, milestone_id)
return ControllerResponse(content=f"Milestone deleted successfully. (ID: {milestone_id})")