182 lines
5.8 KiB
JavaScript
182 lines
5.8 KiB
JavaScript
const express = require("express")
|
|
const router = express.Router()
|
|
const { requireAuth } = require('./../../middleware/authmiddleware')
|
|
const bodyParser = require('body-parser')
|
|
const groups = require('./../../model/groups.js')
|
|
var multer = require('multer');
|
|
const fs = require('fs');
|
|
const path = require('path')
|
|
router.use(bodyParser.json())
|
|
|
|
router.post("/", requireAuth,async (req, res) => {
|
|
let mygroups = await groups.find({"members.userId": req.userdocument.userid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount"])
|
|
return res.json(mygroups)
|
|
})
|
|
|
|
router.post("/:id", requireAuth,async (req, res) => {
|
|
const groupid = parseInt(req.params.id)
|
|
if (isNaN(groupid)){
|
|
return res.json({status: "error", error: "Not found"})
|
|
}
|
|
|
|
let groupresponse = await groups.findOne({groupid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount","currentshout"]).populate({path: "owner",select: ["username", "userid"]})
|
|
|
|
if (!groupresponse){
|
|
return res.json({status: "error", error: "Not found"})
|
|
}
|
|
|
|
return res.json({status: "success", data: groupresponse})
|
|
})
|
|
|
|
router.post("/:id/members", requireAuth,async (req, res) => {
|
|
const groupid = parseInt(req.params.id)
|
|
const {rank} = req.body
|
|
if (!rank){
|
|
return res.json({status: "error", error: "Rank not sent"})
|
|
}
|
|
|
|
const resultsPerPage = 5
|
|
let page = req.body.page ?? 0
|
|
if (page != 0){
|
|
page-=1
|
|
}
|
|
let skip = 0+parseFloat(page)*resultsPerPage
|
|
|
|
if (isNaN(groupid)){
|
|
return res.json({status: "error", error: "Not found"})
|
|
}
|
|
|
|
let groupresponse = await groups.findOne({groupid}).lean().select({"members": { "$slice" : [ skip, resultsPerPage ] }}).populate({path: "memberspoly",select: ["username", "userid"]})
|
|
|
|
if (!groupresponse){
|
|
return res.json({status: "error", error: "Not found"})
|
|
}
|
|
|
|
return res.json({status: "success", data: groupresponse.memberspoly})
|
|
})
|
|
|
|
async function validateImage(groupid,res){
|
|
return new Promise(async (resolve) => {
|
|
|
|
try {
|
|
const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/groupicons/icon-${groupid}.png`), null)
|
|
pngValidator(myArrayBuffer);
|
|
// success
|
|
} catch {
|
|
// file is invalid or corrupt
|
|
fs.unlink(path.resolve(`assets/groupicons/icon-${groupid}.png`), (err => {
|
|
if (err) console.log(err)
|
|
}));
|
|
|
|
return res.json({status: 'error', error: 'Image is invalid.'})
|
|
}
|
|
|
|
resolve()
|
|
|
|
})
|
|
}
|
|
|
|
var storage = multer.diskStorage({
|
|
destination: function (req, file, cb) {
|
|
// Uploads is the Upload_folder_name
|
|
cb(null, "./assets/groupicons")
|
|
|
|
},
|
|
filename: async function (req, file, cb) {
|
|
const groupid = await groups.countDocuments();
|
|
cb(null, "icon-" + groupid + ".png")
|
|
|
|
|
|
}
|
|
})
|
|
const uploadicon = multer({storage: storage,
|
|
fileFilter: function (req, file, callback) {
|
|
if(file.mimetype != 'image/png') {
|
|
return callback('Invalid file type')
|
|
}
|
|
callback(null, true)
|
|
},
|
|
limits: { fileSize: 1024 * 1024 } // 1mb
|
|
})
|
|
|
|
router.post("/create", requireAuth,async (req, res) => {
|
|
if (req.userdocument.coins < 100){
|
|
return res.json({status: "error", error: "You don't have enough Rocks!"})
|
|
}
|
|
uploadicon.single("groupicon")(req, res, async function (err) {
|
|
if (err) {
|
|
if (err?.message === "File too large"){
|
|
return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"})
|
|
}
|
|
if (err === "Invalid file type"){
|
|
return res.status(400).send({status: 'error', error: "Invalid file type"})
|
|
}
|
|
return res.status(400).send({status: 'error', error: err.message})
|
|
}
|
|
|
|
|
|
var xss = require("xss")
|
|
const {groupname, description,publicgroup} = req.body
|
|
|
|
if (!groupname){
|
|
return res.json({status: 'error', error: 'Group name needs to be sent.'})
|
|
}
|
|
if (!description){
|
|
return res.json({status: 'error', error: 'Description needs to be sent.'})
|
|
}
|
|
if (!publicgroup){
|
|
return res.json({status: 'error', error: 'Public group needs to be sent.'})
|
|
}
|
|
if (publicgroup != "true" && type != "false"){
|
|
return res.json({status: 'error', error: 'Public group needs to be a true or false value.'})
|
|
}
|
|
|
|
const groupid = await groups.countDocuments();
|
|
// check if the file they just uploaded is valid
|
|
await validateImage(groupid,res)
|
|
let IconApproved = req.userdocument.admin === false ? false : true
|
|
|
|
await groups.create({
|
|
Name: xss(groupname),
|
|
Description: xss(description),
|
|
Public: publicgroup,
|
|
IconApproved,
|
|
groupid,
|
|
ownerid: req.userdocument.userid,
|
|
memberscount: 1,
|
|
members: [{userId: req.userdocument.userid, rank: 3}],
|
|
Roles: [{RoleName: "Members", Permissions: {Shout: false, Kick: false, ChangeRoles: false, ModerateWall: false, ManageAllies: false}, Rank: 1}, {RoleName: "Admin", Permissions: {Shout: true, Kick: true, ChangeRoles: true, ModerateWall: true, ManageAllies: false}, Rank: 2}, {RoleName: "Owner", Permissions: {All: true}, Rank: 3}]
|
|
})
|
|
|
|
return res.json({status: "success", message: "Group created!"})
|
|
|
|
|
|
})
|
|
})
|
|
|
|
router.post("/editgroup", requireAuth,async (req, res) => {
|
|
|
|
|
|
})
|
|
|
|
router.post("/postshout", requireAuth,async (req, res) => {
|
|
|
|
|
|
})
|
|
|
|
router.post("/joingroup", requireAuth,async (req, res) => {
|
|
|
|
|
|
})
|
|
|
|
router.post("/leavegroup", requireAuth,async (req, res) => {
|
|
|
|
|
|
})
|
|
|
|
router.post("/exile", requireAuth,async (req, res) => {
|
|
|
|
|
|
})
|
|
|
|
module.exports = router |