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])
|
@app.get("/issues/{issue_id}/children", response_model=List[schemas.IssueResponse])
|
||||||
def get_children(issue_id: int, db: Session = Depends(get_db)):
|
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()
|
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