diff --git a/app/api/routers/misc.py b/app/api/routers/misc.py index d321ed5..8f0fb42 100644 --- a/app/api/routers/misc.py +++ b/app/api/routers/misc.py @@ -214,6 +214,89 @@ def milestone_items(milestone_id: int, db: Session = Depends(get_db)): return {"tasks": tasks, "supports": supports, "meetings": meetings} +@router.post("/milestones/{milestone_id}/tasks", status_code=status.HTTP_201_CREATED, tags=["Milestones"]) +def create_milestone_task(milestone_id: int, issue_data: dict, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user_or_apikey)): + ms = db.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).first() + if not ms: + raise HTTPException(status_code=404, detail="Milestone not found") + + # Check if milestone is progressing + if ms.status and hasattr(ms.status, 'value') and ms.status.value == "progressing": + raise HTTPException(status_code=400, detail="Cannot add items to a milestone that is in_progress") + + # Get project_id from milestone + project_id = ms.project_id + + issue = models.Issue( + title=issue_data.get("title"), + description=issue_data.get("description"), + issue_type="task", + status=models.IssueStatus.OPEN, + priority=models.IssuePriority.MEDIUM, + project_id=project_id, + milestone_id=milestone_id, + reporter_id=current_user.id, + ) + db.add(issue) + db.commit() + db.refresh(issue) + return issue + + +@router.post("/milestones/{milestone_id}/supports", status_code=status.HTTP_201_CREATED, tags=["Milestones"]) +def create_milestone_support(milestone_id: int, issue_data: dict, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user_or_apikey)): + ms = db.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).first() + if not ms: + raise HTTPException(status_code=404, detail="Milestone not found") + + if ms.status and hasattr(ms.status, 'value') and ms.status.value == "progressing": + raise HTTPException(status_code=400, detail="Cannot add items to a milestone that is in_progress") + + project_id = ms.project_id + + issue = models.Issue( + title=issue_data.get("title"), + description=issue_data.get("description"), + issue_type="support", + status=models.IssueStatus.OPEN, + priority=models.IssuePriority.MEDIUM, + project_id=project_id, + milestone_id=milestone_id, + reporter_id=current_user.id, + ) + db.add(issue) + db.commit() + db.refresh(issue) + return issue + + +@router.post("/milestones/{milestone_id}/meetings", status_code=status.HTTP_201_CREATED, tags=["Milestones"]) +def create_milestone_meeting(milestone_id: int, issue_data: dict, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user_or_apikey)): + ms = db.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).first() + if not ms: + raise HTTPException(status_code=404, detail="Milestone not found") + + if ms.status and hasattr(ms.status, 'value') and ms.status.value == "progressing": + raise HTTPException(status_code=400, detail="Cannot add items to a milestone that is in_progress") + + project_id = ms.project_id + + issue = models.Issue( + title=issue_data.get("title"), + description=issue_data.get("description"), + issue_type="meeting", + status=models.IssueStatus.OPEN, + priority=models.IssuePriority.MEDIUM, + project_id=project_id, + milestone_id=milestone_id, + reporter_id=current_user.id, + ) + db.add(issue) + db.commit() + db.refresh(issue) + return issue + + # ============ Notifications ============ class NotificationResponse(BaseModel):