import {app} from "@/firebase"; import {collection, doc, getDoc, getDocs, getFirestore, query, where} from "firebase/firestore"; import {CorporateUser, Group, User} from "@/interfaces/user"; import {getGroupsForUser} from "./groups.be"; import {uniq, uniqBy} from "lodash"; import {getUserCodes} from "./codes.be"; import moment from "moment"; const db = getFirestore(app); export async function getUsers() { const snapshot = await getDocs(collection(db, "users")); return snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id, registrationDate: moment(doc.data().registrationDate).toISOString(), })) as unknown as User[]; } export async function getUser(id: string) { const userDoc = await getDoc(doc(db, "users", id)); return {...userDoc.data(), id, registrationDate: moment(userDoc.data()?.registrationDate).toISOString()} as unknown as User; } export async function getSpecificUsers(ids: string[]) { if (ids.length === 0) return []; const snapshot = await getDocs(query(collection(db, "users"), where("id", "in", ids))); const groups = snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id, registrationDate: moment(doc.data().registrationDate).toISOString(), })) as unknown as User[]; return groups; } export async function getUserBalance(user: User) { const codes = await getUserCodes(user.id); if (user.type !== "corporate" && user.type !== "mastercorporate") return codes.length; const groups = await getGroupsForUser(user.id); const participants = uniq(groups.flatMap((x) => x.participants)); if (user.type === "corporate") return participants.length + codes.filter((x) => !participants.includes(x.userId || "")).length; const participantUsers = await Promise.all(participants.map(getUser)); const corporateUsers = participantUsers.filter((x) => x.type === "corporate") as CorporateUser[]; return ( corporateUsers.reduce((acc, curr) => acc + curr.corporateInformation?.companyInformation?.userAmount || 0, 0) + corporateUsers.length + codes.filter((x) => !participants.includes(x.userId || "") && !corporateUsers.map((u) => u.id).includes(x.userId || "")).length ); }