From 62b915fbc18cb5af3dbc012944d5c046daf53398 Mon Sep 17 00:00:00 2001 From: Joao Ramos Date: Sun, 18 Feb 2024 18:04:54 +0000 Subject: [PATCH] Added API endpoints for agents load for the homepage --- next.config.js | 15 +++++++ src/pages/api/users/agents/[code].ts | 55 +++++++++++++++++++++++ src/pages/api/users/agents/index.ts | 65 ++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/pages/api/users/agents/[code].ts create mode 100644 src/pages/api/users/agents/index.ts diff --git a/next.config.js b/next.config.js index 771f71d2..cdba31d8 100644 --- a/next.config.js +++ b/next.config.js @@ -35,6 +35,21 @@ const nextConfig = { }, ], }, + { + source: "/api/users/agents", + headers: [ + {key: "Access-Control-Allow-Credentials", value: "false"}, + {key: "Access-Control-Allow-Origin", value: websiteUrl}, + { + key: "Access-Control-Allow-Methods", + value: "POST,OPTIONS", + }, + { + key: "Access-Control-Allow-Headers", + value: "Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date", + }, + ], + }, ]; }, }; diff --git a/src/pages/api/users/agents/[code].ts b/src/pages/api/users/agents/[code].ts new file mode 100644 index 00000000..56e9a0fd --- /dev/null +++ b/src/pages/api/users/agents/[code].ts @@ -0,0 +1,55 @@ +import { app, adminApp } from "@/firebase"; +import { AgentUser } from "@/interfaces/user"; +import { sessionOptions } from "@/lib/session"; +import { + collection, + getDocs, + getFirestore, + query, + where, +} from "firebase/firestore"; +import { getAuth } from "firebase-admin/auth"; +import { withIronSessionApiRoute } from "iron-session/next"; +import { NextApiRequest, NextApiResponse } from "next"; +import countryCodes from "country-codes-list"; +const db = getFirestore(app); +const auth = getAuth(adminApp); + +export default withIronSessionApiRoute(user, sessionOptions); + +interface Contact { + name: string; + email: string; + number: string; +} +async function get(req: NextApiRequest, res: NextApiResponse) { + const { code } = req.query as { code: string }; + + const usersQuery = query( + collection(db, "users"), + where("type", "==", "agent"), + where("demographicInformation.country", "==", code) + ); + const docsUser = await getDocs(usersQuery); + + const docs = docsUser.docs.map((doc) => doc.data() as AgentUser); + + const entries = docs.map((user: AgentUser) => { + const newUser = { + name: user.agentInformation.companyName, + email: user.email, + number: user.demographicInformation?.phone as string, + } as Contact; + return newUser; + }) as Contact[]; + + const country = countryCodes.findOne("countryCode" as any, code); + res.json({ + label: country.countryNameEn, + entries, + }); +} + +async function user(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "GET") return get(req, res); +} diff --git a/src/pages/api/users/agents/index.ts b/src/pages/api/users/agents/index.ts new file mode 100644 index 00000000..8eb3da81 --- /dev/null +++ b/src/pages/api/users/agents/index.ts @@ -0,0 +1,65 @@ +import { app, adminApp } from "@/firebase"; +import { AgentUser } from "@/interfaces/user"; +import { sessionOptions } from "@/lib/session"; +import { + collection, + getDocs, + getFirestore, + query, + where, +} from "firebase/firestore"; +import { getAuth } from "firebase-admin/auth"; +import { withIronSessionApiRoute } from "iron-session/next"; +import { NextApiRequest, NextApiResponse } from "next"; +import countryCodes from "country-codes-list"; +const db = getFirestore(app); +const auth = getAuth(adminApp); + +export default withIronSessionApiRoute(user, sessionOptions); + +interface Contact { + name: string; + email: string; + number: string; +} +async function get(req: NextApiRequest, res: NextApiResponse) { + const usersQuery = query( + collection(db, "users"), + where("type", "==", "agent") + ); + const docsUser = await getDocs(usersQuery); + + const docs = docsUser.docs.map((doc) => doc.data() as AgentUser); + + const data = docs.reduce( + (acc: Record, user: AgentUser) => { + const countryCode = user.demographicInformation?.country as string; + const currentValues = acc[countryCode] || ([] as Contact[]); + const newUser = { + name: user.agentInformation.companyName, + email: user.email, + number: user.demographicInformation?.phone as string, + } as Contact; + return { + ...acc, + [countryCode]: [...currentValues, newUser], + }; + }, + {} + ) as Record; + + const result = Object.keys(data).map((code) => { + const country = countryCodes.findOne("countryCode" as any, code); + return { + label: country.countryNameEn, + key: code, + entries: data[code], + }; + }); + + res.json(result); +} + +async function user(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "GET") return get(req, res); +}