239 lines
5.6 KiB
JavaScript
239 lines
5.6 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
|