Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions src/routes/profile.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down Expand Up @@ -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 });
}
Expand Down
35 changes: 29 additions & 6 deletions src/utils/badgeHelpers.ts
Original file line number Diff line number Diff line change
@@ -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(
Expand Down Expand Up @@ -57,3 +61,22 @@ export async function checkTieredBadge(

return null;
}

export async function checkAndAwardBadges(
user: User,
eventType: string
): Promise<string[]> {
const categoryMap: Record<string, string> = {
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);
}