feat: issue tags management (add/remove/list-all)
This commit is contained in:
44
app/main.py
44
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)}
|
||||
|
||||
Reference in New Issue
Block a user