Files
citypulse/backend/app/services/ticket_service.py
Cursor Agent 46dea3304f Refactor: Integrate backend API and normalize data
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>
2025-09-26 10:27:39 +00:00

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()