diff --git a/src/routes/profile.ts b/src/routes/profile.ts index 7f1c5b4..fb277eb 100644 --- a/src/routes/profile.ts +++ b/src/routes/profile.ts @@ -1,6 +1,7 @@ import express from 'express'; import User from '../models/user'; import Event from '../models/event'; +import { checkAndAwardBadges } from '../utils/badgeHelpers'; export const profileRoute = express.Router(); @@ -54,13 +55,23 @@ profileRoute.patch('/', async (req, res, next) => { $push: { events: event._id }, $inc: { points: event.points, ...countersToIncrement } }, - function (err: NativeError, result: User) { + { new: true }, + async function (err: NativeError, result: User) { if (err) return next(err); if (result) { - res - .status(200) - .send({ message: 'Checked in successfully', event: event }); + const newBadges = await checkAndAwardBadges(result, event.category); + if (newBadges.length > 0) { + await User.findOneAndUpdate( + { _id: req.user._id }, + { $push: { badges: { $each: newBadges } } } + ); + } + res.status(200).send({ + message: 'Checked in successfully', + event: event, + newBadges: newBadges + }); } else { res.status(400).send({ message: 'Already checked in', event: event }); } diff --git a/src/utils/badgeHelpers.ts b/src/utils/badgeHelpers.ts index daffcb7..bdf0a9c 100644 --- a/src/utils/badgeHelpers.ts +++ b/src/utils/badgeHelpers.ts @@ -1,19 +1,23 @@ import Badge from '../models/badge'; export function checkAllRounder(user: User): string | null { - if (user.badges?.includes("All Rounder")) { + if (user.badges?.includes('All Rounder')) { return null; } - const hasAllCategories = (user.n_corporate_events ?? 0) >= 1 && (user.n_explorations_events ?? 0) >= 1 && (user.n_mentoring_events ?? 0) >= 1 && (user.n_social_events ?? 0) >= 1; - - return hasAllCategories ? "All Rounder" : null; + const hasAllCategories = + (user.n_corporate_events ?? 0) >= 1 && + (user.n_explorations_events ?? 0) >= 1 && + (user.n_mentoring_events ?? 0) >= 1 && + (user.n_social_events ?? 0) >= 1; + + return hasAllCategories ? 'All Rounder' : null; } export function checkHelloWorld(user: User): string | null { - if (user.badges.includes("Hello World")) { + if (user.badges.includes('Hello World')) { return null; } - return (user.n_total_events ?? 0) >= 1 ? "Hello World" : null; + return (user.n_total_events ?? 0) >= 1 ? 'Hello World' : null; } export async function checkTieredBadge( @@ -57,3 +61,22 @@ export async function checkTieredBadge( return null; } + +export async function checkAndAwardBadges( + user: User, + eventType: string +): Promise { + const categoryMap: Record = { + corporate: 'n_corporate_events', + explorations: 'n_explorations_events', + mentoring: 'n_mentoring_events', + social: 'n_social_events' + }; + const counterField = categoryMap[eventType]; + const results = await Promise.all([ + checkAllRounder(user), + checkHelloWorld(user), + counterField ? checkTieredBadge(user, counterField, 1, 3, 5) : null + ]); + return results.filter((badge): badge is string => badge !== null); +}