Meteor-back/routes/api/auth.js

80 lines
3.8 KiB
JavaScript

const express = require("express")
const router = express.Router()
const { requireAuth } = require('./../../middleware/authmiddleware')
const bodyParser = require('body-parser')
const User = require('./../../model/user.js')
router.use(bodyParser.json())
function selectKeys(obj, keysArray) {
let result = {};
for (let i = 0; i < keysArray.length; i++) {
if (keysArray[i] in obj === true) {
result[keysArray[i]] = obj[keysArray[i]];
}
}
return result;
}
router.get("/",requireAuth,async (req, res) => {
const filtered = selectKeys(req.userdocument,["username","coins","userid","admin","ugcpermission","moderation","colors","joindate","lastclaimofcurrency","membership","friendrequests","friends","badges","status","timesincelastrequest","avatartype","discordid","bio","recentlyplayed","css"])
//console.log(filtered.recentlyplayedgames)
filtered._2faenabled = false
if (req.userdocument?.twofasecrets){
const json = JSON.parse(req.userdocument.twofasecrets)
if (json.verified === true){
filtered._2faenabled = true
}
}
return res.json(filtered)
})
router.post("/recentgames",requireAuth,async (req, res) => {
const response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "recentlyplayedgames",select: ["useridofowner","nameofgame","numberofplayers","version","visits"] , populate: {path: "owner", select: ["username"]}}).select("recentlyplayed")
return res.json(response.recentlyplayedgames)
})
router.post("/requestfriends",requireAuth,async (req, res) => {
let response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "friendsdata",select: ["username","status","timesincelastrequest"]}).select("friends")
let friendsdata = []
if (response.friendsdata){
response.friendsdata.forEach(function (item, index) {
let status = {status: "Offline"}
if (item.status){
status = JSON.parse(item.status)
}
const actualTimeMilliseconds = new Date().getTime()
if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && !status){
// been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game
status.status = "Offline"
item.status = JSON.stringify(status)
status = JSON.parse(item.status)
}
if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status){
status.status = "Online"
item.status = JSON.stringify(status)
status = JSON.parse(item.status)
}
item.status = status
friendsdata.push(item)
})
}
// playing is 1st online is second and offline is last :)
friendsdata.sort((a, b) => {
if (a.status.status.includes("Playing") === true && b.status.status !== 'Playing') {
return -1; // a should appear before b
} else if (a.status.status.includes("Playing") === false && b.status.status.includes("Playing") === true) {
return 1; // a should appear after b
} else if (a.status.status === 'Online' && b.status.status === 'Offline') {
return -1; // a should appear before b
} else if (a.status.status === 'Offline' && b.status.status === 'Online') {
return 1; // a should appear after b
} else {
return 0; // the order of a and b doesn't matter
}
})
return res.json(friendsdata)
})
module.exports = router