52 lines
2.2 KiB
TypeScript
52 lines
2.2 KiB
TypeScript
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<Group[]> => {
|
|
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<string[]> => {
|
|
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[];
|
|
};
|