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