import { CityName, getDb, ObjectId, Ticket } from "../index"; import { Collection, Filter, ObjectId as MongoObjectId } from "mongodb"; /** * Generate a new ticket ID as a string * @returns A new ObjectId as a string */ export const generateTicketId = (): string => { return new ObjectId().toString(); }; export const getTicketsCollection = (): Collection => { return getDb().collection("tickets"); }; export const findTickets = async ( filter: Filter = {}, ): Promise => { return await getTicketsCollection().find(filter).toArray(); }; export const findTicketsByCallSid = async ( callSid: string, ): Promise => { return await getTicketsCollection().find({ callSid }).toArray(); }; export const getTicketById = async ( ticketId: string, ): Promise => { const ticket = await getTicketsCollection().findOne({ _id: new ObjectId(ticketId), }); return ticket ? ticket : null; }; export const createTicket = async ( ticketData: Omit, ticketId?: string, ): Promise => { const ticket: Ticket = { _id: ticketId ? new ObjectId(ticketId) : new ObjectId(), ...ticketData, createdAt: new Date(), updatedAt: new Date(), }; const { insertedId } = await getTicketsCollection().insertOne(ticket); return insertedId; }; export const updateTicket = async ( ticketId: string, data: Partial>, ): Promise => { const result = await getTicketsCollection().findOneAndUpdate( { _id: new ObjectId(ticketId) }, { $set: { ...data, updatedAt: new Date() } }, { returnDocument: "after" }, ); return result || null; }; export const deleteTicket = async (ticketId: string): Promise => { const result = await getTicketsCollection().deleteOne({ _id: new ObjectId(ticketId), }); return result.deletedCount > 0; }; export const findTicketByQuery = async (query: Partial) => { return await getTicketsCollection().findOne(query); }; /** * Update ticket files by external call number */ export const updateTicketFilesByCallNumber = async (params: { cityName: CityName; callNumber: string; image1?: string; image2?: string; image3?: string; }): Promise => { const { cityName, callNumber, image1, image2, image3 } = params; const update: any = {}; if (image1) update["externalCallFields.image1"] = image1; if (image2) update["externalCallFields.image2"] = image2; if (image3) update["externalCallFields.image3"] = image3; const result = await getTicketsCollection().updateOne( { cityName: cityName, "externalCallFields.call_number": callNumber, }, { $set: { ...update, updatedAt: new Date(), }, }, ); return result.matchedCount > 0; }; /** * Remove guestJwt from ticket by external call number */ export const clearGuestJwtByCallNumber = async (params: { cityName: CityName; callNumber: string; }): Promise => { const { cityName, callNumber } = params; const result = await getTicketsCollection().updateOne( { cityName, "externalCallFields.call_number": callNumber }, { $unset: { guestJwt: "" }, $set: { updatedAt: new Date() } }, ); return result.matchedCount > 0; };