import { Injectable } from "@nestjs/common"; import { Result } from "src/common/errors/result-error.factory"; import { PrismaMariaDbService } from "prisma/mariadb/prisma-mariadb.service"; import { TicketList } from "src/customer-support/tickets/dtos/ticket-list.dto"; import { sortOrders, sortTypes } from "src/customer-support/tickets/dtos/ticket.dto"; import { Prisma } from "prisma/mariadb/generated/prisma/client/mariadb/client"; @Injectable() export class TicketService { constructor(private readonly prisma: PrismaMariaDbService) { } getListOfAllTicketByFilters = async ( status: string[], offset: number = 0, limit: number = 25, sortOrder: string = 'last_update', sortType: 'DESC' | 'ASC' = 'DESC', email?: string ): Promise> => { try { const staff = await this.prisma.staff.findFirst({ where: { email }, }); if (!staff) return { success: false, error: 'EMPLOYEE_NOT_FOUND' } if (!sortOrders.includes(sortOrder) || !sortTypes.includes(sortType)) return { success: false, error: 'INVALID_FILTER' } const statusList = Prisma.join(status); const rawticketList = await this.prisma.$queryRaw( Prisma.sql` SELECT t.id AS id, t.status AS status, CONCAT(s.first_name,' ',s.last_name) AS assignTo, a.address1 AS deliveryAddress, t.subject AS subject, d.name AS department, t.parent AS parentTicketId, DATE_FORMAT(FROM_UNIXTIME(t.due_date / 1000), '%d/%m/%y') AS dueDate, DATE_FORMAT(FROM_UNIXTIME(t.last_update / 1000), '%d/%m/%y') AS updatedAt, CASE WHEN t.date_closed IS NOT NULL THEN DATE_FORMAT(FROM_UNIXTIME(t.date_closed / 1000), '%d/%m/%y') ELSE NULL END AS completedAt FROM staff s LEFT JOIN ticket t ON t.assign_to = s.id LEFT JOIN account a ON t.account_id = a.id LEFT JOIN ticket_dept d ON t.dept_id = d.id WHERE s.email = ${email} AND t.status IN (${statusList}) ORDER BY ${Prisma.raw(sortOrder)} ${Prisma.raw(sortType)} LIMIT ${limit} OFFSET ${offset}; `); return { success: true, data: rawticketList } } catch (error) { return { success: false, error: 'TICKET_LIST_NOT_FOUND, ' + error }; } } }