This repository has been archived on 2025-11-04. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
qoverflow/server/routes/user/GetUser.js

63 lines
1.7 KiB
JavaScript

const createRequest = require('../../utils/api');
const config = require('../../config.json');
const User = require('../../db/models/User');
const getUserLevel = require('../../utils/getUserLevel');
const Badge = require('../../db/models/Badge');
async function GetUser(req, res) {
const { username } = req.params;
const cachedUser = await User.findOne({ username });
if (cachedUser)
return res.send({
user: {
username: cachedUser.username,
email: cachedUser.email,
points: cachedUser.points,
level: getUserLevel(cachedUser.points),
},
});
const { success, user } = await createRequest('get', `/users/${username}`);
if (!success) return res.status(500).send(config.errorGeneric);
const newUser = await User.findByIdAndUpdate(user.user_id, user, {
upsert: true,
new: true,
});
const badges = await Badge.find({ title: { $in: user.badges } });
const badgeCount = badges.reduce(
(acc, badge) => {
if (badge.rank === 'Gold') {
acc.gold = acc.gold++;
} else if (badge.rank === 'Silver') {
acc.silver = acc.silver++;
} else if (badge.rank === 'Bronze') {
acc.bronze = acc.bronze++;
}
return acc;
},
{
gold: 0,
silver: 0,
bronze: 0,
}
);
return res.send({
user: {
username: newUser.username,
email: newUser.email,
points: newUser.points,
level: getUserLevel(newUser.points),
badgeCount,
},
});
}
module.exports = GetUser;