62 lines
2.7 KiB
TypeScript
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 };
|
|
}
|
|
}
|
|
} |