Files
Richard Gingrich 5ca105d4f2 Add files via upload
2024-08-06 15:53:05 -06:00

188 lines
6.6 KiB
JavaScript

const bcrypt = require('bcrypt');
const user = require("../models/user");
const _ = require('lodash');
const axios = require('axios');
module.exports.registerUser = async (req, res) => {
try{
const{displayName, gameName, tagLine, email, password, avatarImage} = req.body;
// Validation of body variables
if(!gameName) return res.type('json').status(404).send('The game name is missing');
if(!tagLine) return res.type('json').status(404).send('The tag line is missing');
if(!email) return res.type('json').status(404).send('The email is missing');
if(!password) return res.type('json').status(404).send('The password is missing');
let searchedUser = await user.findOne({gameName:gameName, tagLine:tagLine}).exec();
if(searchedUser) return res.type('json').status(400).send("Game name and tagline combination already in use.");
// Getting user's extra info from riot's api
const baseUrl1 = process.env.RIOT_BASE_URL1;
const fullUrl1 = `${baseUrl1}${gameName}\\${tagLine}`
let response = await axios.get(fullUrl1);
var extraData = response.data.data;
// Getting user's rank from riot's api
const baseUrl2 = process.env.RIOT_BASE_URL2;
const fullUrl2 = `${baseUrl2}${extraData.region}\\${gameName}\\${tagLine}`;
let response2 = await axios.get(fullUrl2);
let rank = parseRank(response2.data.data.currenttierpatched);
const newUser = new user({
riotId: extraData.puuid,
displayName: !displayName?gameName:displayName,
gameName: gameName,
tagLine: tagLine,
email: email,
password: await bcrypt.hash(password, await bcrypt.genSalt(10)),
avatarImage: avatarImage,
rank: [rank.rankType, rank.rankLevel],
accountLevel: extraData.account_level,
region: toRegionNo(extraData.region)
});
await newUser.save();
return res.type('json').status(201).send( _.pick(newUser, ['_id', 'riotId', 'displayName', 'gameName','tagLine', 'email', 'avatarImage', 'rank', 'accountLevel', 'region', 'age', 'gender', 'reputation', 'playerType', 'aboutMe']));
}catch(err){
return res.type('json').status(500).send(err.toString());
}
}
module.exports.loginUser = async (req, res) => {
try{
const {email, password} = req.body;
if(!email) return res.type('json').status(404).send('The username is missing');
if(!password) return res.type('json').status(404).send('The password is missing');
// Check if the username exists
var searchedUser = await user.findOne({email:email}).select("+password").exec();
if (!searchedUser){
return res.type('json').status(404).send("User was not found.");
}else{
// Check if the passwords match
const isPasswordValid = await bcrypt.compare(password, searchedUser.password);
if(!isPasswordValid){
return res.type('json').status(404).send("The password is incorrect.");
}
return res.type('json').status(200).send(_.pick(searchedUser, ['_id', 'riotId', 'displayName', 'gameName','tagLine','email', 'avatarImage', 'rank', 'accountLevel', 'region', 'age', 'gender', 'reputation', 'playerType', 'aboutMe']));
}
}catch(err) {
return res.type('json').status(500).send(err.toString());
}
};
module.exports.updateUser = async (req, res) => {
try{
const updateDTO = req.body;
if(!updateDTO.userId) return res.type('json').status(400).send('A user id must be provided');
// Check if the username exists
var searchedUser = await user.findOne({_id:updateDTO.userId}).exec();
if (!searchedUser){
return res.type('json').status(404).send("User to update was not found.");
}else{
let updateParams = _.pick(updateDTO, ['displayName', 'age', 'gender', 'playerType', 'aboutMe', 'avatarImage']);
const updatedUser = await user.findOneAndUpdate({_id:updateDTO.userId},
{...updateParams},
{returnOriginal: false});
return res.type('json').status(200).send(updatedUser);
}
}catch(err) {
return res.type('json').status(500).send(err.toString());
}
};
// Implement end-point to retrieve a user by ID (we only have login)
module.exports.findUser = async (req, res) => {
try{
const userId = req.params.userId;
if(!userId) return res.type('json').status(400).send('Invalid user id provided.');
// Find the user
var searchedUser = await user.findOne({_id:userId}).exec();
if (!searchedUser){
return res.type('json').status(404).send("User was not found.");
}else{
return res.type('json').status(200).send(_.pick(searchedUser, ['_id', 'riotId', 'displayName', 'gameName','tagLine','email', 'avatarImage', 'rank', 'accountLevel', 'region', 'age', 'gender', 'reputation', 'playerType', 'aboutMe']));
}
}catch(err) {
return res.type('json').status(500).send(err.toString());
}
};
/* Helper Functions */
function toRegionNo(region){
let res = -1;
switch(region){
case 'na':
res = 0;
break;
case 'eu':
res = 1;
break;
case 'ap':
res = 2;
break;
case 'kr':
res = 3;
break;
}
return res;
}
function parseRank(rank){
let rankName = rank.substring(0, rank.indexOf(" "));
let rankType = -1;
let rankLevel = rank.substring(rank.indexOf(" ") + 1) * 1;
switch(rankName.toLowerCase()){
case 'iron':
rankType = 1;
break;
case 'bronze':
rankType = 2;
break;
case 'silver':
rankType = 3;
break;
case 'gold':
rankType = 4;
break;
case 'platinum':
rankType = 5;
break;
case 'diamond':
rankType = 6;
break;
case 'ascendant':
rankType = 7;
break;
case 'immortal':
rankType = 8;
break;
case 'radiant':
rankType = 9;
break;
}
return {rankType: rankType, rankLevel: rankLevel};
}