import {app} from "@/firebase"; import {CorporateUser, Group, MasterCorporateUser, StudentUser, TeacherUser, User} from "@/interfaces/user"; import client from "@/lib/mongodb"; import moment from "moment"; import {getUser} from "./users.be"; import {getSpecificUsers} from "./users.be"; const db = client.db(process.env.MONGODB_DB); export const updateExpiryDateOnGroup = async (participantID: string, corporateID: string) => { const corporate = await db.collection("users").findOne({id: corporateID}); const participant = await db.collection("users").findOne({id: participantID}); if (!corporate || !participant) return; if (corporate.type !== "corporate" || (participant.type !== "student" && participant.type !== "teacher")) return; if (!corporate.subscriptionExpirationDate || !participant.subscriptionExpirationDate) return await db.collection("users").updateOne({id: participant.id}, {$set: {subscriptionExpirationDate: null}}); const corporateDate = moment(corporate.subscriptionExpirationDate); const participantDate = moment(participant.subscriptionExpirationDate); if (corporateDate.isAfter(participantDate)) return await db.collection("users").updateOne({id: participant.id}, {$set: {subscriptionExpirationDate: corporateDate.toISOString()}}); return; }; export const getUserCorporate = async (id: string) => { const user = await getUser(id); if (!user) return undefined; if (["admin", "developer"].includes(user.type)) return undefined; if (user.type === "mastercorporate") return user; const groups = await getParticipantGroups(id); const admins = await Promise.all(groups.map((x) => x.admin).map(getUser)); const corporates = admins .filter((x) => (user.type === "corporate" ? x?.type === "mastercorporate" : x?.type === "corporate")) .filter((x) => !!x) as User[]; if (corporates.length === 0) return undefined; return corporates.shift() as CorporateUser | MasterCorporateUser; }; export const getGroup = async (id: string) => { return await db.collection("groups").findOne({id}); }; export const getGroups = async () => { return await db.collection("groups").find({}).toArray(); }; export const getParticipantGroups = async (id: string) => { return await db.collection("groups").find({participants: id}).toArray(); }; export const getUserGroups = async (id: string): Promise => { return await db.collection("groups").find({admin: id}).toArray(); }; export const getUserNamedGroup = async (id: string, name: string) => { return await db.collection("groups").findOne({admin: id, name}); }; export const getUsersGroups = async (ids: string[]) => { return await db .collection("groups") .find({admin: {$in: ids}}) .toArray(); }; export const getAllAssignersByCorporate = async (corporateID: string): Promise => { const groups = await getUserGroups(corporateID); const groupUsers = (await Promise.all(groups.map(async (g) => await Promise.all(g.participants.map(getUser))))) .flat() .filter((x) => !!x) as User[]; const teacherPromises = await Promise.all( groupUsers.map(async (u) => u.type === "teacher" ? u.id : u.type === "corporate" ? [...(await getAllAssignersByCorporate(u.id)), u.id] : undefined, ), ); return teacherPromises.filter((x) => !!x).flat() as string[]; }; export const getGroupsForUser = async (admin?: string, participant?: string) => { if (admin && participant) return await db.collection("groups").find({admin, participant}).toArray(); if (admin) return await getUserGroups(admin); if (participant) return await getParticipantGroups(participant); return await getGroups(); }; export const getStudentGroupsForUsersWithoutAdmin = async (admin: string, participants: string[]) => { return await db .collection("groups") .find({...(admin ? {admin: {$ne: admin}} : {}), ...(participants ? {participants} : {})}) .toArray(); }; export const getCorporateNameForStudent = async (studentID: string) => { const groups = await getStudentGroupsForUsersWithoutAdmin("", [studentID]); if (groups.length === 0) return ""; const adminUserIds = [...new Set(groups.map((g) => g.admin))]; const adminUsersData = (await getSpecificUsers(adminUserIds)).filter((x) => !!x) as User[]; if (adminUsersData.length === 0) return ""; const admins = adminUsersData.filter((x) => x.type === "corporate"); if (admins.length > 0) { return (admins[0] as CorporateUser).corporateInformation.companyInformation.name; } return ""; };