from copy import deepcopy from typing import Dict, List, Optional, Union DEFAULT_STATE = { "ticket_queue": [], "ticket_counter": 1, "current_user": None, } class TicketAPI: """ A class representing the Ticket API for managing support tickets. This class provides methods for creating, retrieving, and managing support tickets within a ticketing system. It maintains a queue of tickets and handles ticket-related operations such as creation, status updates, and retrieval. Attributes: ticket_queue (List[Dict[str, Union[int, str]]]): A list of ticket dictionaries. ticket_counter (int): A counter for generating unique ticket IDs. current_user (Optional[str]): The currently authenticated user. """ def __init__(self): """ Initialize the TicketAPI instance. """ self.ticket_queue: List[Dict[str, Union[int, str]]] self.ticket_counter: int self.current_user: Optional[str] self._api_description = "This tool belongs to the ticketing system that is part of a company, which allows users to create, view, and manage support business tickets." def _load_scenario(self, scenario: dict, long_context=False) -> None: """ Load a scenario into the ticket queue. Args: scenario (Dict): A dictionary containing ticket data. """ DEFAULT_STATE_COPY = deepcopy(DEFAULT_STATE) self.ticket_queue = scenario.get("ticket_queue", DEFAULT_STATE_COPY["ticket_queue"]) self.ticket_counter = scenario.get( "ticket_counter", DEFAULT_STATE_COPY["ticket_counter"] ) self.current_user = scenario.get("current_user", DEFAULT_STATE_COPY["current_user"]) def create_ticket( self, title: str, description: str = "", priority: int = 1 ) -> Dict[str, Union[int, str]]: """ Create a ticket in the system and queue it. Args: title (str): Title of the ticket. description (str): Description of the ticket. Defaults to an empty string. priority (int): Priority of the ticket, from 1 to 5. Defaults to 1. 5 is the highest priority. Returns: id (int): Unique identifier of the ticket. title (str): Title of the ticket. description (str): Description of the ticket. status (str): Current status of the ticket. priority (int): Priority level of the ticket. """ if not self.current_user: return {"error": "User not authenticated. Please log in to create a ticket."} if priority < 1 or priority > 5: return {"error": "Invalid priority. Priority must be between 1 and 5."} ticket = { "id": self.ticket_counter, "title": title, "description": description, "status": "Open", "priority": priority, "created_by": self.current_user, } self.ticket_queue.append(ticket) self.ticket_counter += 1 return ticket def get_ticket(self, ticket_id: int) -> Dict[str, Union[int, str]]: """ Get a specific ticket by its ID. Args: ticket_id (int): ID of the ticket to retrieve. Returns: id (int): Unique identifier of the ticket. title (str): Title of the ticket. description (str): Description of the ticket. status (str): Current status of the ticket. priority (int): Priority level of the ticket. created_by (str): Username of the ticket creator. """ ticket = self._find_ticket(ticket_id) if not ticket: return {"error": f"Ticket with ID {ticket_id} not found."} return ticket def close_ticket(self, ticket_id: int) -> Dict[str, str]: """ Close a ticket. Args: ticket_id (int): ID of the ticket to be closed. Returns: status (str): Status of the close operation. """ ticket = self._find_ticket(ticket_id) if not ticket: return {"error": f"Ticket with ID {ticket_id} not found."} if ticket["status"] == "Closed": return {"error": f"Ticket with ID {ticket_id} is already closed."} ticket["status"] = "Closed" return {"status": f"Ticket {ticket_id} has been closed successfully."} def resolve_ticket(self, ticket_id: int, resolution: str) -> Dict[str, str]: """ Resolve a ticket with a resolution. Args: ticket_id (int): ID of the ticket to be resolved. resolution (str): Resolution details for the ticket. Returns: status (str): Status of the resolve operation. """ ticket = self._find_ticket(ticket_id) if not ticket: return {"error": f"Ticket with ID {ticket_id} not found."} if ticket["status"] == "Resolved": return {"error": f"Ticket with ID {ticket_id} is already resolved."} ticket["status"] = "Resolved" ticket["resolution"] = resolution return {"status": f"Ticket {ticket_id} has been resolved successfully."} def edit_ticket( self, ticket_id: int, updates: Dict[str, Optional[Union[str, int]]] ) -> Dict[str, str]: """ Modify the details of an existing ticket. Args: ticket_id (int): ID of the ticket to be changed. updates (Dict): Dictionary containing the fields to be updated. - title (str) : [Optional] New title for the ticket. - description (str): [Optional] New description for the ticket. - status (str): [Optional] New status for the ticket. - priority (int): [Optional] New priority for the ticket. Returns: status (str): Status of the update operation. """ ticket = self._find_ticket(ticket_id) if not ticket: return {"error": f"Ticket with ID {ticket_id} not found."} valid_fields = {"title", "description", "status", "priority"} invalid_fields = set(updates.keys()) - valid_fields if invalid_fields: return {"error": f"Invalid fields for update: {', '.join(invalid_fields)}"} for key, value in updates.items(): if value is not None: ticket[key] = value return {"status": f"Ticket {ticket_id} has been updated successfully."} def _find_ticket(self, ticket_id: int) -> Optional[Dict[str, Union[int, str]]]: """ Find a ticket by its ID. Args: ticket_id (int): ID of the ticket to find. Returns: id (int): Unique identifier of the ticket. title (str): Title of the ticket. description (str): Description of the ticket. status (str): Current status of the ticket. priority (int): Priority level of the ticket. created_by (str): Username of the ticket creator. """ for ticket in self.ticket_queue: if ticket["id"] == ticket_id: return ticket return None def ticket_login(self, username: str, password: str) -> Dict[str, bool]: """ Authenticate a user for ticket system. Args: username (str): Username of the user. password (str): Password of the user. Returns: success (bool): True if login was successful, False otherwise. """ # In a real system, you would validate the credentials against a database if username and password: # Simplified authentication self.current_user = username return {"success": True} return {"success": False} def ticket_get_login_status(self) -> Dict[str, bool]: """ Get the username of the currently authenticated user. Returns: username (bool): True if a user is logged in, False otherwise. """ return {"username": bool(self.current_user)} def logout(self) -> Dict[str, bool]: """ Log out the current user. Returns: success (bool): True if logout was successful, False otherwise. """ if self.current_user: self.current_user = None return {"success": True} return {"success": False} def get_user_tickets( self, status: Optional[str] = None ) -> List[Dict[str, Union[int, str]]]: """ Get all tickets created by the current user, optionally filtered by status. Args: status (str): [Optional] Status to filter tickets by. If None, return all tickets. Returns: id (int): Unique identifier of the ticket. title (str): Title of the ticket. description (str): Description of the ticket. status (str): Current status of the ticket. priority (int): Priority level of the ticket. created_by (str): Username of the ticket """ if not self.current_user: return [{"error": "User not authenticated. Please log in to view tickets."}] user_tickets = [ ticket for ticket in self.ticket_queue if ticket["created_by"] == self.current_user ] if status: user_tickets = [ ticket for ticket in user_tickets if ticket["status"].lower() == status.lower() ] return user_tickets