ENCOA-283 or ENCOA-282, I don't know someone deleted the issue
This commit is contained in:
@@ -25,6 +25,10 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
case 'getIds':
|
||||
res.status(200).json(await getIds(req.body));
|
||||
break;
|
||||
case 'deletePriorEntitiesGroups':
|
||||
await deletePriorEntitiesGroups(req.body);
|
||||
res.status(200).json({ ok: true });
|
||||
break;
|
||||
default:
|
||||
res.status(400).json({ error: 'Invalid operation!' })
|
||||
}
|
||||
@@ -34,23 +38,47 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
}
|
||||
|
||||
async function crossRefOwnership(body: any): Promise<string[]> {
|
||||
const { userId, classrooms } = body;
|
||||
const { userId, classrooms, entity } = body;
|
||||
|
||||
// First find which classrooms from input exist
|
||||
const existingClassrooms = await db.collection('groups')
|
||||
.find({ name: { $in: classrooms } })
|
||||
.find({
|
||||
name: { $in: classrooms },
|
||||
admin: { $ne: userId }
|
||||
})
|
||||
.project({ name: 1, admin: 1, _id: 0 })
|
||||
.toArray();
|
||||
|
||||
// From those existing classrooms, return the ones where user is NOT the admin
|
||||
return existingClassrooms
|
||||
.filter(classroom => classroom.admin !== userId)
|
||||
.map(classroom => classroom.name);
|
||||
if (existingClassrooms.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const adminUsers = await db.collection('users')
|
||||
.find({
|
||||
id: { $in: existingClassrooms.map(classroom => classroom.admin) }
|
||||
})
|
||||
.project({ id: 1, entities: 1, _id: 0 })
|
||||
.toArray();
|
||||
|
||||
const adminEntitiesMap = new Map(
|
||||
adminUsers.map(admin => [
|
||||
admin.id,
|
||||
admin.entities?.map((e: any) => e.id) || []
|
||||
])
|
||||
);
|
||||
|
||||
return Array.from(new Set(
|
||||
existingClassrooms
|
||||
.filter(classroom => {
|
||||
const adminEntities = adminEntitiesMap.get(classroom.admin) || [];
|
||||
return adminEntities.includes(entity);
|
||||
})
|
||||
.map(classroom => classroom.name)
|
||||
));
|
||||
}
|
||||
|
||||
async function getIds(body: any): Promise<Record<string, string>> {
|
||||
const { names, userEmails } = body;
|
||||
|
||||
|
||||
const existingGroups: any[] = await db.collection('groups')
|
||||
.find({ name: { $in: names } })
|
||||
.project({ name: 1, id: 1, _id: 0 })
|
||||
@@ -72,3 +100,31 @@ async function getIds(body: any): Promise<Record<string, string>> {
|
||||
}, {} as Record<string, string>)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
async function deletePriorEntitiesGroups(body: any) {
|
||||
const { ids, entity } = body;
|
||||
|
||||
if (!Array.isArray(ids) || ids.length === 0 || !entity) {
|
||||
return;
|
||||
}
|
||||
|
||||
const users = await db.collection('users')
|
||||
.find({ id: { $in: ids } })
|
||||
.project({ id: 1, entities: 1, _id: 0 })
|
||||
.toArray();
|
||||
|
||||
// if the user doesn't have the target entity mark them for all groups deletion
|
||||
const toDeleteUserIds = users
|
||||
.filter(user => !user.entities?.some((e: any) => e.id === entity))
|
||||
.map(user => user.id);
|
||||
|
||||
if (toDeleteUserIds.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
db.collection('groups').updateMany(
|
||||
{ participants: { $in: toDeleteUserIds } },
|
||||
{ $pull: { participants: { $in: toDeleteUserIds } } } as any
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user