diff --git a/src/pages/api/grading/index.ts b/src/pages/api/grading/index.ts index 70ccbd08..6beb7e24 100644 --- a/src/pages/api/grading/index.ts +++ b/src/pages/api/grading/index.ts @@ -10,7 +10,7 @@ import {v4} from "uuid"; import {checkAccess} from "@/utils/permissions"; import {CEFR_STEPS} from "@/resources/grading"; import {getCorporateUser} from "@/resources/user"; -import {getUserCorporate} from "@/utils/groups"; +import {getUserCorporate} from "@/utils/groups.be"; import {Grading} from "@/interfaces"; import {getGroupsForUser} from "@/utils/groups.be"; import {uniq} from "lodash"; diff --git a/src/utils/groups.be.ts b/src/utils/groups.be.ts index 4ece42aa..99929752 100644 --- a/src/utils/groups.be.ts +++ b/src/utils/groups.be.ts @@ -33,11 +33,34 @@ export const updateExpiryDateOnGroup = async (participantID: string, corporateID return; }; +export const getUserCorporate = async (id: string) => { + const user = await getUser(id); + if (user.type === "corporate" || 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) => x.type === "corporate"); + + if (corporates.length === 0) return undefined; + return corporates.shift() as CorporateUser; +}; + export const getGroups = async () => { const groupDocs = await getDocs(collection(db, "groups")); return groupDocs.docs.map((x) => ({...x.data(), id: x.id})) as Group[]; }; +export const getParticipantGroups = async (id: string) => { + const snapshot = await getDocs(query(collection(db, "groups"), where("participants", "array-contains", id))); + + const groups = snapshot.docs.map((doc) => ({ + id: doc.id, + ...doc.data(), + })) as Group[]; + + return groups; +}; + 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[]; diff --git a/src/utils/groups.ts b/src/utils/groups.ts index 1987a2d5..8416683b 100644 --- a/src/utils/groups.ts +++ b/src/utils/groups.ts @@ -1,43 +1,37 @@ -import { CorporateUser, Group, User, Type } from "@/interfaces/user"; +import {CorporateUser, Group, User, Type} from "@/interfaces/user"; import axios from "axios"; export const isUserFromCorporate = async (userID: string) => { - const groups = (await axios.get(`/api/groups?participant=${userID}`)) - .data; - const users = (await axios.get("/api/users/list")).data; + const groups = (await axios.get(`/api/groups?participant=${userID}`)).data; + const users = (await axios.get("/api/users/list")).data; - const adminTypes = groups.map( - (g) => users.find((u) => u.id === g.admin)?.type - ); - return adminTypes.includes("corporate"); + const adminTypes = groups.map((g) => users.find((u) => u.id === g.admin)?.type); + return adminTypes.includes("corporate"); }; const getAdminForGroup = async (userID: string, role: Type) => { - const groups = (await axios.get(`/api/groups?participant=${userID}`)) - .data; + const groups = (await axios.get(`/api/groups?participant=${userID}`)).data; - const adminRequests = await Promise.all( - groups.map(async (g) => { - const userRequest = await axios.get(`/api/users/${g.admin}`); - if (userRequest.status === 200) return userRequest.data; - return undefined; - }) - ); + const adminRequests = await Promise.all( + groups.map(async (g) => { + const userRequest = await axios.get(`/api/users/${g.admin}`); + if (userRequest.status === 200) return userRequest.data; + return undefined; + }), + ); - const admins = adminRequests.filter((x) => x?.type === role); - return admins.length > 0 ? (admins[0] as CorporateUser) : undefined; + const admins = adminRequests.filter((x) => x?.type === role); + return admins.length > 0 ? (admins[0] as CorporateUser) : undefined; }; -export const getUserCorporate = async ( - userID: string -): Promise => { - const userRequest = await axios.get(`/api/users/${userID}`); - if (userRequest.status === 200) { - const user = userRequest.data; - if (user.type === "corporate") { - return getAdminForGroup(userID, "mastercorporate"); - } - } +export const getUserCorporate = async (userID: string): Promise => { + const userRequest = await axios.get(`/api/users/${userID}`); + if (userRequest.status === 200) { + const user = userRequest.data; + if (user.type === "corporate") { + return getAdminForGroup(userID, "mastercorporate"); + } + } - return getAdminForGroup(userID, "corporate"); + return getAdminForGroup(userID, "corporate"); };