This commit integrates the backend API for fetching and updating report data. It also includes a normalization function to handle data consistency between the API and local storage. Co-authored-by: anthonymuncher <anthonymuncher@gmail.com>
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
# app/services/ticket_service.py
|
|
import uuid
|
|
from typing import List, Optional
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy.exc import NoResultFound
|
|
from app.models.ticket_model import User, Ticket, TicketAudit, TicketStatus, SeverityLevel
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# ----------------------
|
|
# Ticket Service
|
|
# ----------------------
|
|
class TicketService:
|
|
def __init__(self, db: Session):
|
|
self.db = db
|
|
|
|
# ------------------
|
|
# User Operations
|
|
# ------------------
|
|
def create_user(self, name: str, email: str) -> User:
|
|
user = User(name=name, email=email)
|
|
self.db.add(user)
|
|
self.db.commit()
|
|
self.db.refresh(user)
|
|
logger.info(f"Created user {user}")
|
|
return user # <-- return User object
|
|
|
|
|
|
|
|
def get_user(self, user_id: str) -> Optional[User]:
|
|
return self.db.query(User).filter(User.id == user_id).first()
|
|
|
|
# ------------------
|
|
# Ticket Operations
|
|
# ------------------
|
|
def create_ticket(
|
|
self,
|
|
user_id: str,
|
|
image_path: str,
|
|
category: str,
|
|
severity: SeverityLevel,
|
|
latitude: float,
|
|
longitude: float,
|
|
description: str = "",
|
|
) -> Ticket:
|
|
ticket = Ticket(
|
|
id=str(uuid.uuid4()),
|
|
user_id=user_id,
|
|
image_path=image_path,
|
|
category=category,
|
|
severity=severity,
|
|
latitude=latitude,
|
|
longitude=longitude,
|
|
description=description,
|
|
)
|
|
self.db.add(ticket)
|
|
self.db.commit()
|
|
self.db.refresh(ticket)
|
|
logger.info(f"Created ticket {ticket}")
|
|
return ticket
|
|
|
|
def update_ticket_status(self, ticket_id: str, new_status: TicketStatus) -> Ticket:
|
|
ticket = self.db.query(Ticket).filter(Ticket.id == ticket_id).first()
|
|
if not ticket:
|
|
raise NoResultFound(f"Ticket with id {ticket_id} not found")
|
|
|
|
# Log audit
|
|
audit = TicketAudit(
|
|
ticket_id=ticket.id,
|
|
old_status=ticket.status,
|
|
new_status=new_status,
|
|
)
|
|
self.db.add(audit)
|
|
|
|
# Update status
|
|
ticket.status = new_status
|
|
self.db.commit()
|
|
self.db.refresh(ticket)
|
|
logger.info(f"Updated ticket {ticket.id} status to {new_status}")
|
|
return ticket
|
|
|
|
def get_ticket(self, ticket_id: str) -> Optional[Ticket]:
|
|
return self.db.query(Ticket).filter(Ticket.id == ticket_id).first()
|
|
|
|
def list_tickets(
|
|
self,
|
|
user_id: Optional[str] = None,
|
|
category: Optional[str] = None,
|
|
severity: Optional[SeverityLevel] = None,
|
|
status: Optional[TicketStatus] = None
|
|
) -> List[Ticket]:
|
|
query = self.db.query(Ticket)
|
|
if user_id:
|
|
query = query.filter(Ticket.user_id == user_id)
|
|
if category:
|
|
query = query.filter(Ticket.category == category)
|
|
if severity:
|
|
query = query.filter(Ticket.severity == severity)
|
|
if status:
|
|
query = query.filter(Ticket.status == status)
|
|
return query.order_by(Ticket.created_at.desc()).all()
|