From f48b8295118e0ca8e752c82983f2a696aaa80e3a Mon Sep 17 00:00:00 2001 From: Zhi Date: Sun, 22 Feb 2026 09:08:49 +0000 Subject: [PATCH] feat: issue tags management (add/remove/list-all) --- app/main.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/app/main.py b/app/main.py index 0f6ac31..32ec79a 100644 --- a/app/main.py +++ b/app/main.py @@ -728,3 +728,47 @@ def unlink_issues(child_id: int, db: Session = Depends(get_db)): @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() + + + +# ============ Issue Tags ============ + +@app.post("/issues/{issue_id}/tags") +def add_tag(issue_id: int, tag: str, db: Session = Depends(get_db)): + issue = db.query(models.Issue).filter(models.Issue.id == issue_id).first() + if not issue: + raise HTTPException(status_code=404, detail="Issue not found") + current = set(issue.tags.split(",")) if issue.tags else set() + current.add(tag.strip()) + current.discard("") + issue.tags = ",".join(sorted(current)) + db.commit() + return {"issue_id": issue_id, "tags": list(current)} + + +@app.delete("/issues/{issue_id}/tags") +def remove_tag(issue_id: int, tag: str, db: Session = Depends(get_db)): + issue = db.query(models.Issue).filter(models.Issue.id == issue_id).first() + if not issue: + raise HTTPException(status_code=404, detail="Issue not found") + current = set(issue.tags.split(",")) if issue.tags else set() + current.discard(tag.strip()) + current.discard("") + issue.tags = ",".join(sorted(current)) if current else None + db.commit() + return {"issue_id": issue_id, "tags": list(current)} + + +@app.get("/tags") +def list_all_tags(project_id: int = None, db: Session = Depends(get_db)): + """Get all unique tags across issues.""" + query = db.query(models.Issue.tags).filter(models.Issue.tags != None) + if project_id: + query = query.filter(models.Issue.project_id == project_id) + all_tags = set() + for (tags,) in query.all(): + for t in tags.split(","): + t = t.strip() + if t: + all_tags.add(t) + return {"tags": sorted(all_tags)}