targo-backend/src/customer-support/tickets/ticket.service.ts

62 lines
2.7 KiB
TypeScript

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<Result<TicketList[], string>> => {
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<TicketList[]>(
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 };
}
}
}