mirror of
https://github.com/KevinMidboe/zoff.git
synced 2025-10-29 01:40:24 +00:00
626 lines
16 KiB
JavaScript
626 lines
16 KiB
JavaScript
var express = require("express");
|
|
var router = express.Router();
|
|
var path = require("path");
|
|
try {
|
|
var mongo_db_cred = require(path.join(
|
|
__dirname,
|
|
"../../config/mongo_config.js"
|
|
));
|
|
} catch (e) {
|
|
console.log(
|
|
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
|
|
);
|
|
process.exit(1);
|
|
}
|
|
var mongojs = require("mongojs");
|
|
var db = mongojs(mongo_db_cred.config);
|
|
var token_db = mongojs("tokens");
|
|
var uniqid = require("uniqid");
|
|
var crypto = require("crypto");
|
|
var ObjectId = mongojs.ObjectId;
|
|
var sIO = require(path.join(__dirname, "../../apps/client.js")).socketIO;
|
|
var projects = require(pathThumbnails + "/handlers/aggregates.js");
|
|
|
|
router.use(function(req, res, next) {
|
|
next(); // make sure we go to the next routes and don't stop here
|
|
});
|
|
|
|
router.route("/api/lists").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
db.collection("frontpage_lists")
|
|
.find()
|
|
.sort({ count: -1 }, function(err, docs) {
|
|
res.json(docs);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/thumbnails").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
db.collection("suggested_thumbnails").find(function(err, docs) {
|
|
res.json(docs);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/descriptions").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
db.collection("suggested_descriptions").find(function(err, docs) {
|
|
res.json(docs);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/rules").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
db.collection("suggested_rules").find(function(err, docs) {
|
|
res.json(docs);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/approve_thumbnail").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_thumbnails").find({ channel: channel }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
var thumbnail = docs[0].thumbnail;
|
|
db.collection("frontpage_lists").update(
|
|
{ _id: channel },
|
|
{ $set: { thumbnail: thumbnail } },
|
|
{ upsert: true },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { thumbnail: thumbnail } },
|
|
{ upsert: true },
|
|
function(err, docs) {
|
|
db.collection("suggested_thumbnails").remove(
|
|
{ channel: channel },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (
|
|
docs[0].hasOwnProperty("userpass") &&
|
|
docs[0].userpass != ""
|
|
)
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/deny_thumbnail").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_thumbnails").remove({ channel: channel }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
res.send(true);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/approve_rules").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_rules").find({ channel: channel }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
var rules = docs[0].rules;
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { rules: rules } },
|
|
{ upsert: true },
|
|
function(err, docs) {
|
|
db.collection("suggested_rules").remove(
|
|
{ channel: channel },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (
|
|
docs[0].hasOwnProperty("userpass") &&
|
|
docs[0].userpass != ""
|
|
)
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/deny_rules").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_rules").remove({ channel: channel }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
res.send(true);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/remove_rules").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { rules: "" } },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (docs[0].hasOwnProperty("userpass") && docs[0].userpass != "")
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/approve_description").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_descriptions").find({ channel: channel }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
var description = docs[0].description;
|
|
db.collection("frontpage_lists").update(
|
|
{ _id: channel },
|
|
{ $set: { description: description } },
|
|
{ upsert: true },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { description: description } },
|
|
function(err, docs) {
|
|
db.collection("suggested_descriptions").remove(
|
|
{ channel: channel },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (
|
|
docs[0].hasOwnProperty("userpass") &&
|
|
docs[0].userpass != ""
|
|
)
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/deny_description").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("suggested_descriptions").remove(
|
|
{ channel: channel },
|
|
1,
|
|
function(err, docs) {
|
|
res.send(true);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/remove_thumbnail").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("frontpage_lists").update(
|
|
{ _id: channel },
|
|
{ $set: { thumbnail: "" } },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { thumbnail: "" } },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (
|
|
docs[0].hasOwnProperty("userpass") &&
|
|
docs[0].userpass != ""
|
|
)
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/remove_description").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var channel = req.body.channel;
|
|
db.collection("frontpage_lists").update(
|
|
{ _id: channel },
|
|
{ $set: { description: "" } },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { description: "" } },
|
|
function(err, docs) {
|
|
db.collection(channel + "_settings").aggregate(
|
|
[
|
|
{
|
|
$match: {
|
|
id: "config"
|
|
}
|
|
},
|
|
{
|
|
$project: projects.toShowConfig
|
|
}
|
|
],
|
|
function(err, docs) {
|
|
if (docs[0].adminpass !== "") docs[0].adminpass = true;
|
|
if (
|
|
docs[0].hasOwnProperty("userpass") &&
|
|
docs[0].userpass != ""
|
|
)
|
|
docs[0].userpass = true;
|
|
else docs[0].userpass = false;
|
|
sIO.to(channel).emit("conf", docs);
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/names").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
db.collection("registered_users").find(
|
|
{ _id: { $exists: true } },
|
|
{ _id: 1, icon: 1 },
|
|
function(err, docs) {
|
|
res.json(docs);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/names").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var icon = req.body.icon;
|
|
var name = req.body.name;
|
|
db.collection("registered_users").update(
|
|
{ _id: name },
|
|
{ $set: { icon: icon } },
|
|
function(err, docs) {
|
|
if (err) res.send(false);
|
|
else res.send(true);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/names").delete(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var name = req.body.name;
|
|
db.collection("registered_users").remove({ _id: name }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
if (err) res.send(false);
|
|
else res.send(true);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/token").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
token_db.collection("tokens").find(function(err, docs) {
|
|
if (docs.length == 1) {
|
|
res.json({ token: docs[0].token });
|
|
} else {
|
|
var id = new Buffer(makeid()).toString("base64");
|
|
token_db
|
|
.collection("tokens")
|
|
.insert({ token: id }, function(err, docs) {
|
|
res.json({ token: id });
|
|
});
|
|
}
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/api_token").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
token_db
|
|
.collection("api_token")
|
|
.find({ token: { $exists: true } }, function(err, all) {
|
|
res.json(all);
|
|
});
|
|
} else {
|
|
res.sendStatus(403);
|
|
}
|
|
});
|
|
|
|
router.route("/api/api_token").delete(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var id = req.body.id;
|
|
token_db
|
|
.collection("api_token")
|
|
.remove({ _id: ObjectId(id) }, function(err, success) {
|
|
if (err) {
|
|
res.send("failed");
|
|
return;
|
|
}
|
|
res.send("success");
|
|
});
|
|
}
|
|
});
|
|
|
|
router.route("/api/api_token").put(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var id = req.body.id;
|
|
var limit = req.body.limit;
|
|
if (limit < 0) {
|
|
res.sendStatus(500);
|
|
return;
|
|
}
|
|
token_db
|
|
.collection("api_token")
|
|
.update({ _id: ObjectId(id) }, { $set: { limit: limit } }, function(
|
|
err,
|
|
success
|
|
) {
|
|
if (err) {
|
|
res.sendStatus(500);
|
|
return;
|
|
}
|
|
res.sendStatus(200);
|
|
});
|
|
}
|
|
});
|
|
|
|
router.route("/api/api_token").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var name = req.body.name;
|
|
var id = crypto
|
|
.createHash("sha256")
|
|
.update(uniqid())
|
|
.digest("base64");
|
|
token_db
|
|
.collection("api_token")
|
|
.insert({ name: name, token: id, usage: 0 }, function(err, docs) {
|
|
token_db.collection("api_token").find({ token: id }, function(err, d) {
|
|
res.json({ token: id, _id: d[0]._id });
|
|
});
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/delete").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var list = req.body._id;
|
|
db.collection(list).drop(function(err, docs) {
|
|
db.collection(list + "_settings").drop(function(err, docs) {
|
|
db.collection("frontpage_lists").remove({ _id: list }, function(
|
|
err,
|
|
docs
|
|
) {
|
|
res.send(true);
|
|
});
|
|
});
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/remove_token").get(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
token_db.collection("tokens").find(function(err, docs) {
|
|
if (docs.length == 1) {
|
|
token_db
|
|
.collection("tokens")
|
|
.remove({ token: docs[0].token }, function(err, docs) {
|
|
res.send(true);
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/pinned").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var to_pin = req.body._id;
|
|
db.collection("frontpage_lists").update(
|
|
{ pinned: 1 },
|
|
{ $set: { pinned: 0 } },
|
|
function(err, resp) {
|
|
db.collection("frontpage_lists").update(
|
|
{ _id: to_pin },
|
|
{ $set: { pinned: 1 } },
|
|
function(err, resp) {
|
|
res.send(true);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/admin").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var to_remove = req.body._id;
|
|
db.collection(to_remove + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { adminpass: "" } },
|
|
function(err, docs) {
|
|
res.send(true);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
router.route("/api/userpass").post(function(req, res) {
|
|
if (req.isAuthenticated()) {
|
|
var to_remove = req.body._id;
|
|
db.collection(to_remove + "_settings").update(
|
|
{ views: { $exists: true } },
|
|
{ $set: { userpass: "" } },
|
|
function(err, docs) {
|
|
res.send(true);
|
|
}
|
|
);
|
|
} else {
|
|
res.send(false);
|
|
}
|
|
});
|
|
|
|
function makeid() {
|
|
var text = "";
|
|
var possible =
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
|
|
for (var i = 0; i < 20; i++)
|
|
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
|
|
return text;
|
|
}
|
|
|
|
module.exports = router;
|