"""Jira integration router — link, search, sync, create issues.""" import logging from typing import Optional from uuid import UUID from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.database import get_db from app.dependencies.auth import get_current_user, require_role from app.models.jira_link import JiraLinkEntityType from app.models.user import User from app.schemas.jira_schema import ( JiraIssueResult, JiraLinkCreate, JiraLinkOut, ) from app.services import jira_service, audit_service logger = logging.getLogger(__name__) router = APIRouter(prefix="/jira", tags=["jira"]) @router.get("/search", response_model=list[JiraIssueResult]) def search_issues( q: str = Query(..., min_length=2), max_results: int = Query(10, le=50), user: User = Depends(get_current_user), ): """Search Jira issues by JQL or free text.""" return jira_service.search_jira_issues(q, max_results) @router.post("/links", response_model=JiraLinkOut, status_code=201) def create_link( body: JiraLinkCreate, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): """Associate an Aegis entity with a Jira issue.""" link = jira_service.create_link( db, entity_type=body.entity_type, entity_id=body.entity_id, jira_issue_key=body.jira_issue_key, sync_direction=body.sync_direction, created_by=user.id, ) db.commit() db.refresh(link) audit_service.log_action( db, user_id=user.id, action="jira_link_created", entity_type="jira_link", entity_id=str(link.id), details={ "linked_entity_type": body.entity_type.value, "linked_entity_id": str(body.entity_id), "jira_issue_key": body.jira_issue_key, }, ) return link @router.get("/links", response_model=list[JiraLinkOut]) def list_links( entity_type: Optional[JiraLinkEntityType] = None, entity_id: Optional[UUID] = None, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): """List Jira links, optionally filtered by entity.""" return jira_service.list_links( db, entity_type=entity_type, entity_id=entity_id, ) @router.post("/links/{link_id}/sync") def sync_link( link_id: UUID, db: Session = Depends(get_db), user: User = Depends(require_role("admin")), ): """Force bidirectional sync for a specific Jira link.""" link = jira_service.get_link_or_raise(db, link_id) jira_service.sync_jira_to_aegis(db, link) db.commit() return {"message": "Sync completed", "jira_status": link.jira_status} @router.delete("/links/{link_id}", status_code=204) def delete_link( link_id: UUID, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): """Remove a Jira link.""" link = jira_service.delete_link(db, link_id) db.commit() audit_service.log_action( db, user_id=user.id, action="jira_link_deleted", entity_type="jira_link", entity_id=str(link_id), details={"jira_issue_key": link.jira_issue_key}, ) @router.post("/create-issue") def create_issue_from_entity( entity_type: JiraLinkEntityType, entity_id: UUID, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): """Auto-create a Jira issue from an Aegis entity and link them.""" result = jira_service.create_issue_and_link( db, entity_type=entity_type, entity_id=entity_id, created_by=user.id, ) db.commit() return result