From 6c53a6f6580a8fdb8e99ed798b6cbdf5ff7fa022 Mon Sep 17 00:00:00 2001 From: Zhi Date: Sun, 22 Feb 2026 09:08:13 +0000 Subject: [PATCH] feat: issue relations (link/unlink parent-child, list children) --- app/main.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/main.py b/app/main.py index 3bd3f25..0f6ac31 100644 --- a/app/main.py +++ b/app/main.py @@ -693,3 +693,38 @@ def list_activity( if user_id: query = query.filter(ActivityLog.user_id == user_id) return query.order_by(ActivityLog.created_at.desc()).limit(limit).all() + + + +# ============ Issue Relations ============ + +class IssueRelation(PydanticBaseModel): + parent_id: int + child_id: int + +@app.post("/issues/link") +def link_issues(rel: IssueRelation, db: Session = Depends(get_db)): + parent = db.query(models.Issue).filter(models.Issue.id == rel.parent_id).first() + child = db.query(models.Issue).filter(models.Issue.id == rel.child_id).first() + if not parent or not child: + raise HTTPException(status_code=404, detail="Issue not found") + if rel.parent_id == rel.child_id: + raise HTTPException(status_code=400, detail="Cannot link issue to itself") + child.depends_on_id = rel.parent_id + db.commit() + return {"parent_id": rel.parent_id, "child_id": rel.child_id, "status": "linked"} + + +@app.delete("/issues/link") +def unlink_issues(child_id: int, db: Session = Depends(get_db)): + child = db.query(models.Issue).filter(models.Issue.id == child_id).first() + if not child: + raise HTTPException(status_code=404, detail="Issue not found") + child.depends_on_id = None + db.commit() + return {"child_id": child_id, "status": "unlinked"} + + +@app.get("/issues/{issue_id}/children", response_model=List[schemas.IssueResponse]) +def get_children(issue_id: int, db: Session = Depends(get_db)): + return db.query(models.Issue).filter(models.Issue.depends_on_id == issue_id).all()