import {app} from "@/firebase"; import {CorporateUser, Group, StudentUser, TeacherUser} from "@/interfaces/user"; import {collection, doc, getDoc, getDocs, getFirestore, query, setDoc, where} from "firebase/firestore"; import moment from "moment"; import {getUser} from "./users.be"; const db = getFirestore(app); export const updateExpiryDateOnGroup = async (participantID: string, corporateID: string) => { const corporateRef = await getDoc(doc(db, "users", corporateID)); const participantRef = await getDoc(doc(db, "users", participantID)); if (!corporateRef.exists() || !participantRef.exists()) return; const corporate = { ...corporateRef.data(), id: corporateRef.id, } as CorporateUser; const participant = {...participantRef.data(), id: participantRef.id} as StudentUser | TeacherUser; if (corporate.type !== "corporate" || (participant.type !== "student" && participant.type !== "teacher")) return; if (!corporate.subscriptionExpirationDate || !participant.subscriptionExpirationDate) { return await setDoc(doc(db, "users", participant.id), {subscriptionExpirationDate: null}, {merge: true}); } const corporateDate = moment(corporate.subscriptionExpirationDate); const participantDate = moment(participant.subscriptionExpirationDate); if (corporateDate.isAfter(participantDate)) return await setDoc(doc(db, "users", participant.id), {subscriptionExpirationDate: corporateDate.toISOString()}, {merge: true}); return; }; export const getUserGroups = async (id: string): Promise => { const groupDocs = await getDocs(query(collection(db, "groups"), where("admin", "==", id))); return groupDocs.docs.map((x) => ({...x.data(), id})) as Group[]; }; 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(); 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[]; };