feat: issue status transition endpoint with webhook
This commit is contained in:
30
app/main.py
30
app/main.py
@@ -409,3 +409,33 @@ def list_webhook_logs(webhook_id: int, limit: int = 50, db: Session = Depends(ge
|
|||||||
WebhookLog.webhook_id == webhook_id
|
WebhookLog.webhook_id == webhook_id
|
||||||
).order_by(WebhookLog.created_at.desc()).limit(limit).all()
|
).order_by(WebhookLog.created_at.desc()).limit(limit).all()
|
||||||
return logs
|
return logs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ============ Issue Status Transition ============
|
||||||
|
|
||||||
|
@app.post("/issues/{issue_id}/transition", response_model=schemas.IssueResponse)
|
||||||
|
def transition_issue(issue_id: int, new_status: str, bg: BackgroundTasks, db: Session = Depends(get_db)):
|
||||||
|
"""Transition issue status with validation and webhook."""
|
||||||
|
valid_statuses = ["open", "in_progress", "resolved", "closed", "blocked"]
|
||||||
|
if new_status not in valid_statuses:
|
||||||
|
raise HTTPException(status_code=400, detail=f"Invalid status. Must be one of: {valid_statuses}")
|
||||||
|
|
||||||
|
issue = db.query(models.Issue).filter(models.Issue.id == issue_id).first()
|
||||||
|
if not issue:
|
||||||
|
raise HTTPException(status_code=404, detail="Issue not found")
|
||||||
|
|
||||||
|
old_status = issue.status
|
||||||
|
issue.status = new_status
|
||||||
|
db.commit()
|
||||||
|
db.refresh(issue)
|
||||||
|
|
||||||
|
event = "issue.closed" if new_status == "closed" else "issue.updated"
|
||||||
|
bg.add_task(fire_webhooks_sync, event, {
|
||||||
|
"issue_id": issue.id,
|
||||||
|
"title": issue.title,
|
||||||
|
"old_status": old_status,
|
||||||
|
"new_status": new_status,
|
||||||
|
}, issue.project_id, db)
|
||||||
|
|
||||||
|
return issue
|
||||||
|
|||||||
Reference in New Issue
Block a user