MeteoriteH/Back/routes/api/groups.js

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