import axiosClient from '../axios/axios'; import { API_ROUTES } from '@/constants/apiRoutes'; import type { AssignTicketPayload, AssignableTicketUsersResponse, AssignableTicketUsersParams, CloseTicketPayload, RequestTicketExtensionPayload, ReviewTicketExtensionPayload, SseTokenResponse, TicketAssignmentSummary, TicketAssignmentDetectionsParams, TicketAssignmentDetectionsResponse, TicketAssignmentsResponse, TicketExtensionRequestsResponse, TicketExtensionRequestsParams, TicketOverviewDetail, TicketListParams, TicketListResponse, TicketSummaryParams, TicketSummaryResponse, TicketTimelineResponse, } from '@/types'; type TicketAssignmentsApiResponse = | TicketAssignmentSummary[] | TicketAssignmentsResponse | { assignments: TicketAssignmentSummary[]; total?: number; }; export const ticketService = { getTickets: async ( params?: TicketListParams, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.BASE, { params: { skip: params?.skip ?? 0, limit: params?.limit ?? 10, chainage_id: params?.chainage_id, }, }, ); return response.data; }, getTicketSummary: async ( params?: TicketSummaryParams, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.SUMMARY, { params: { chainage_id: params?.chainage_id, }, }, ); return response.data; }, getTicketOverview: async ( ticketId: string, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.DETAIL(ticketId), ); return response.data; }, getTicketAssignmentDetections: async ( ticketId: string, params?: TicketAssignmentDetectionsParams, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.ASSIGNMENT_DETECTIONS(ticketId), { params: { assignment_status: params?.assignment_status ?? 'unassigned', class_name: params?.class_name, skip: params?.skip ?? 0, limit: params?.limit ?? 500, }, paramsSerializer: { indexes: null, }, }, ); return response.data; }, getTicketTimeline: async ( ticketId: string, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.TIMELINE(ticketId), ); return response.data; }, getAssignableUsers: async ( params?: AssignableTicketUsersParams, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.ASSIGNABLE_USERS, { params: { skip: params?.skip ?? 0, limit: params?.limit ?? 20, search_term: params?.search_term, }, }, ); return response.data; }, assignTicket: async ( ticketId: string, payload: AssignTicketPayload, ): Promise => { const response = await axiosClient.post( API_ROUTES.TICKETS.ASSIGNMENTS(ticketId), payload, ); return response.data; }, getTicketAssignments: async ( ticketId: string, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.ASSIGNMENTS(ticketId), ); const data = response.data; if (Array.isArray(data)) { return { items: data, total: data.length }; } if ('assignments' in data) { return { items: data.assignments, total: data.total ?? data.assignments.length, }; } return data; }, requestTicketExtension: async ( ticketId: string, assignmentId: number, payload: RequestTicketExtensionPayload, ): Promise => { const response = await axiosClient.post( API_ROUTES.TICKETS.REQUEST_EXTENSION(ticketId, assignmentId), payload, ); return response.data; }, getTicketExtensionRequest: async ( ticketId: string, assignmentId: number, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.TICKET_EXTENSION_REQUESTS(ticketId), { params: { assignment_id: assignmentId }, }, ); return response.data; }, getTicketExtensionRequests: async ( params: TicketExtensionRequestsParams, ): Promise => { const response = await axiosClient.get( API_ROUTES.TICKETS.EXTENSION_REQUESTS, { params }, ); return response.data; }, reviewTicketExtension: async ( ticketId: string, assignmentId: number, payload: ReviewTicketExtensionPayload, ): Promise => { const response = await axiosClient.post( API_ROUTES.TICKETS.REVIEW_EXTENSION_REQUEST(ticketId, assignmentId), payload, ); return response.data; }, closeTicket: async ( ticketId: string, payload: CloseTicketPayload, ): Promise => { const response = await axiosClient.post( API_ROUTES.TICKETS.CLOSE(ticketId), payload, ); return response.data; }, createTicketEventsToken: async ( ticketId: string, ): Promise => { const response = await axiosClient.post( API_ROUTES.TICKETS.DETAIL_EVENTS_TOKEN(ticketId), ); return response.data; }, createTenantTicketEventsToken: async (): Promise => { const response = await axiosClient.post( API_ROUTES.TICKET_EVENTS.TENANT_TOKEN, ); return response.data; }, createUserEventsToken: async (): Promise => { const response = await axiosClient.post( API_ROUTES.TICKET_EVENTS.USER_TOKEN, ); return response.data; }, };