from typing import Any
from dooray_mcp.services.client import dooray_client
from dooray_mcp.types.milestone import (
CreateMilestoneParams,
Milestone,
MilestoneListResult,
UpdateMilestoneParams,
)
async def list_milestones(
project_id: str, page: int = 0, size: int = 20, status: str | None = None
) -> MilestoneListResult:
path = f"/project/v1/projects/{project_id}/milestones"
params: dict[str, Any] = {"page": page, "size": size}
if status:
params["status"] = status
response = await dooray_client.get(path, params=params)
result = response.get("result", [])
if isinstance(result, list):
total_count = response.get("header", {}).get("totalCount", len(result))
return MilestoneListResult(totalCount=total_count, contents=result)
return MilestoneListResult.model_validate(result)
async def get_milestone(project_id: str, milestone_id: str) -> Milestone:
path = f"/project/v1/projects/{project_id}/milestones/{milestone_id}"
response = await dooray_client.get(path)
return Milestone.model_validate(response.get("result", {}))
async def create_milestone(project_id: str, params: CreateMilestoneParams) -> Milestone:
path = f"/project/v1/projects/{project_id}/milestones"
body: dict[str, Any] = {"name": params.name}
if params.start_at:
body["startAt"] = params.start_at
if params.end_at:
body["endAt"] = params.end_at
response = await dooray_client.post(path, json_data=body)
return Milestone.model_validate(response.get("result", {}))
async def update_milestone(
project_id: str, milestone_id: str, params: UpdateMilestoneParams
) -> Milestone:
path = f"/project/v1/projects/{project_id}/milestones/{milestone_id}"
body: dict[str, Any] = {}
if params.name is not None:
body["name"] = params.name
if params.status is not None:
body["status"] = params.status
if params.start_at is not None:
body["startAt"] = params.start_at
if params.end_at is not None:
body["endAt"] = params.end_at
response = await dooray_client.put(path, json_data=body)
return Milestone.model_validate(response.get("result", {}))
async def delete_milestone(project_id: str, milestone_id: str) -> bool:
path = f"/project/v1/projects/{project_id}/milestones/{milestone_id}"
await dooray_client.delete(path)
return True