diff --git a/src/hooks/useTickets.tsx b/src/hooks/useTickets.tsx index 9a5ba240..8b518c08 100644 --- a/src/hooks/useTickets.tsx +++ b/src/hooks/useTickets.tsx @@ -1,17 +1,17 @@ -import { Ticket } from "@/interfaces/ticket"; +import { TicketWithCorporate } from "@/interfaces/ticket"; import { Code, Group, User } from "@/interfaces/user"; import axios from "axios"; import { useEffect, useState, useCallback } from "react"; export default function useTickets() { - const [tickets, setTickets] = useState([]); + const [tickets, setTickets] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); const getData = useCallback(() => { setIsLoading(true); axios - .get(`/api/tickets`) + .get(`/api/tickets`) .then((response) => setTickets(response.data)) .finally(() => setIsLoading(false)); }, []); diff --git a/src/interfaces/ticket.ts b/src/interfaces/ticket.ts index 1ffa7d50..ba633061 100644 --- a/src/interfaces/ticket.ts +++ b/src/interfaces/ticket.ts @@ -32,3 +32,7 @@ export const TicketStatusLabel: { [key in TicketStatus]: string } = { "in-progress": "In Progress", completed: "Completed", }; + +export interface TicketWithCorporate extends Ticket { + corporate?: string; +} \ No newline at end of file diff --git a/src/pages/api/tickets/index.ts b/src/pages/api/tickets/index.ts index 04f0b6b7..d7daa365 100644 --- a/src/pages/api/tickets/index.ts +++ b/src/pages/api/tickets/index.ts @@ -1,7 +1,7 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction import { sendEmail } from "@/email"; import { app } from "@/firebase"; -import { Ticket, TicketTypeLabel } from "@/interfaces/ticket"; +import { Ticket, TicketTypeLabel, TicketWithCorporate } from "@/interfaces/ticket"; import { sessionOptions } from "@/lib/session"; import { collection, @@ -9,11 +9,14 @@ import { getDocs, getFirestore, setDoc, + where, + query, } from "firebase/firestore"; import { withIronSessionApiRoute } from "iron-session/next"; import moment from "moment"; import type { NextApiRequest, NextApiResponse } from "next"; import ShortUniqueId from "short-unique-id"; +import { Group, CorporateUser } from "@/interfaces/user"; const db = getFirestore(app); @@ -44,12 +47,38 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { async function get(req: NextApiRequest, res: NextApiResponse) { const snapshot = await getDocs(collection(db, "tickets")); - res.status(200).json( - snapshot.docs.map((doc) => ({ - id: doc.id, - ...doc.data(), - })) - ); + const docs = snapshot.docs.map((doc) => ({ + id: doc.id, + ...doc.data(), + })) as Ticket[]; + + // fetch all groups for these users + + const reporters = [...new Set(docs.map((d) => d.reporter.id).filter((id) => id))]; + + const groupsSnapshot = await getDocs(query(collection(db, "groups"), where("participants", "array-contains-any", reporters))); + const groups = groupsSnapshot.docs.map((doc) => doc.data()) as Group[]; + + // based on the admin of each group, verify if it exists and it's of type corporate + const groupsAdmins = [...new Set(groups.map((g) => g.admin).filter((id) => id))]; + const adminsSnapshot = await getDocs(query(collection(db, "users"), where("id", "in", groupsAdmins), where("type", "==", "corporate"))); + const admins = adminsSnapshot.docs.map((doc) => doc.data()); + + const docsWithAdmins = docs.map((d) => { + const group = groups.find((g) => g.participants.includes(d.reporter.id)); + const admin = admins.find((a) => a.id === group?.admin) as CorporateUser; + + if(admin) { + return { + ...d, + corporate: admin.corporateInformation?.companyInformation?.name, + }; + } + + return d; + }) as TicketWithCorporate[]; + + res.status(200).json(docsWithAdmins); } async function post(req: NextApiRequest, res: NextApiResponse) { diff --git a/src/pages/tickets.tsx b/src/pages/tickets.tsx index 1a80b7f8..47bfd768 100644 --- a/src/pages/tickets.tsx +++ b/src/pages/tickets.tsx @@ -11,6 +11,7 @@ import { TicketStatusLabel, TicketType, TicketTypeLabel, + TicketWithCorporate, } from "@/interfaces/ticket"; import { sessionOptions } from "@/lib/session"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; @@ -28,7 +29,7 @@ import { useEffect, useState } from "react"; import { BsArrowDown, BsArrowUp } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; -const columnHelper = createColumnHelper(); +const columnHelper = createColumnHelper(); export const getServerSideProps = withIronSessionSsr(({ req, res }) => { const user = req.session.user; @@ -173,6 +174,10 @@ export default function Tickets() { header: "Assignee", cell: (info) => users.find((x) => x.id === info.getValue())?.name || "", }), + columnHelper.accessor("corporate", { + header: "Corporate", + cell: (info) => info.getValue(), + }), ]; const getAssigneeValue = () => {