from ninja import Router from apps.accounts.api import require_permission from apps.solutions.models import Solution, TicketSolutionLink from apps.solutions.schemas import ( SolutionIn, SolutionOut, TicketSolutionLinkIn, TicketSolutionLinkOut, ) from apps.tickets.models import Ticket router = Router(tags=["solutions"]) @router.post("", response=SolutionOut) def create_solution(request, payload: SolutionIn): require_permission(request, "solution.manage") return Solution.objects.create( title=payload.title, problem_signature=payload.problem_signature, related_system=payload.related_system, environment_scope=payload.environment_scope, root_cause=payload.root_cause, solution=payload.solution, risk_note=payload.risk_note, status=payload.status, created_by=request.user if request.user.is_authenticated else None, ) @router.get("", response=list[SolutionOut]) def list_solutions(request, status: str | None = None): require_permission(request, "solution.view") queryset = Solution.objects.all() if status: queryset = queryset.filter(status=status) return queryset[:100] @router.get("/{solution_id}", response=SolutionOut) def get_solution(request, solution_id: int): require_permission(request, "solution.view") return Solution.objects.get(id=solution_id) @router.post("/{solution_id}/link-ticket", response=TicketSolutionLinkOut) def link_solution_to_ticket(request, solution_id: int, payload: TicketSolutionLinkIn): require_permission(request, "solution.manage") solution = Solution.objects.get(id=solution_id) ticket = Ticket.objects.get(id=payload.ticket_id) link, _ = TicketSolutionLink.objects.get_or_create( ticket=ticket, solution=solution, link_type=payload.link_type, defaults={ "agent_run_id": payload.agent_run_id, "created_by": request.user if request.user.is_authenticated else None, }, ) if payload.link_type == "adopted": solution.usage_count = solution.ticket_links.filter(link_type="adopted").count() solution.save(update_fields=["usage_count", "updated_at"]) return { "id": link.id, "ticket_id": ticket.id, "solution_id": solution.id, "link_type": link.link_type, "solution_usage_count": solution.usage_count, "created_at": link.created_at, }