from fastapi import (APIRouter, Request, status, Depends ) from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from ...db.db_connect import get_db from sqlalchemy.orm import Session, joinedload from ...models.tickets import Ticket from ...models.resolutions import Resolution, ResolutionType router = APIRouter() templates = Jinja2Templates(directory="app/frontend/templates") # route to historic tickets page @router.get("/ticket/history", response_class=HTMLResponse) def my_tickets(request: Request, db: Session = Depends(get_db)): # store user session in variable session_user = request.session.get("user") # if user session doesn't exist return to login to start user session if not session_user: return RedirectResponse(url="/login", status_code=status.HTTP_303_SEE_OTHER) # store tickets that the current user session has created, in tickets variable tickets = ( db.query(Ticket) # filter tickets by current user created tickets .filter(Ticket.requester_id == session_user.get("id")) # order in a descending order, most recent first .order_by(Ticket.created_at.desc()) .all() ) # render template with ticket context and user session context return templates.TemplateResponse( "tickets/ticket_history.html", {"request": request, "active": "tickets", "user": session_user, "tickets": tickets}, ) # route to specific ticket display page using ticket id @router.get("/tickets/{ticket_id}", response_class=HTMLResponse) def ticket_detail(request: Request, ticket_id: int, db: Session = Depends(get_db)): # user session validation session_user = request.session.get("user") if not session_user: # redirect to login if not validated return RedirectResponse(url="/login", status_code=status.HTTP_303_SEE_OTHER) # query ticket by id ticket = db.query(Ticket).filter(Ticket.id == ticket_id).first() # if ticket does not exist return not found error if not ticket: return templates.TemplateResponse( "tickets/show.html", {"request": request, "active": "tickets", "user": session_user, "not_found": True}, status_code=status.HTTP_404_NOT_FOUND, ) # retrieve user session role role = (session_user.get("role") or "").lower() # if the user is not an admin or an it agent # and the ticket creator is not the user accessing the ticket # return see other error if role not in {"admin", "it_agent"} and ticket.requester_id != session_user.get("id"): user_role = (session_user.get("role") or "end_user").lower() return RedirectResponse(url=f"/dashboard/{user_role}", status_code=status.HTTP_303_SEE_OTHER) # once validated fetch resolutions filtered by ticket id # and the resolution type being suggestion try: suggestions = ( db.query(Resolution) .filter( Resolution.ticket_id == ticket_id, Resolution.type == ResolutionType.SUGGESTION, ) # load the related author in context to the ticket .options(joinedload(Resolution.author)) # order most recent first .order_by(Resolution.created_at.desc()) .all() ) except Exception: suggestions = [] # fetch any errors or messages msg = request.query_params.get("message") err = request.query_params.get("error") # render ticket page in reference to the context variables return templates.TemplateResponse( "tickets/show.html", { "request": request, "active": "tickets", "user": session_user, "ticket": ticket, "suggestions": suggestions, "message": msg, "error": err, }, )