-
+
diff --git a/server/config/middleware.js b/server/config/middleware.js
new file mode 100644
index 00000000..6af9f00a
--- /dev/null
+++ b/server/config/middleware.js
@@ -0,0 +1,21 @@
+const Campaign = require("../models/Campaign");
+const CampaignUser = require("../models/CampaignUser");
+
+function hasCampaign(req, res, next){
+ Campaign.findById(req.query.campaign).lean().then((campaign) => {
+ CampaignUser.findOne({campaign, user: req.user}).lean().then((campaignUser) => {
+ if(!campaignUser) {
+ res.json({status: "error", msg: "not-found"})
+ return;
+ }
+ req.cu = campaignUser;
+ req.campaign = campaign;
+ req.room = req.query.campaign;
+ next();
+ }).catch((err) => res.json({status: "error", err}));
+ }).catch((err) => res.json({status: "error", err}));
+}
+
+module.exports = {
+ hasCampaign
+}
\ No newline at end of file
diff --git a/server/io/socket.js b/server/io/socket.js
new file mode 100644
index 00000000..ad6ae9c7
--- /dev/null
+++ b/server/io/socket.js
@@ -0,0 +1,15 @@
+let ioInstance;
+
+function setIo(io){
+ if(!ioInstance) ioInstance = io;
+}
+
+function getIo() {
+ return ioInstance;
+}
+
+module.exports = {
+ setIo,
+ getIo,
+ ioInstance
+}
\ No newline at end of file
diff --git a/server/models/Concept.js b/server/models/Concept.js
index 12b1d85a..3043b316 100644
--- a/server/models/Concept.js
+++ b/server/models/Concept.js
@@ -2,10 +2,10 @@ const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const ConceptSchema = new Schema({
- name: {type: String, required: true},
- system: {type: String, required: true},
- type: { type: String },
- data: { type: Object },
+ name: {type: String, required: true, default: "New Concept"},
+ type: { type: String, required: true, default: "Concept" },
+ info: { type: Object }, // For preview only
+ data: { type: Object }, // Advanced item
book: {type: mongoose.Types.ObjectId, ref: "Book"},
campaign: {type: mongoose.Types.ObjectId, ref: "Campaign"},
});
diff --git a/server/routes/campaign.js b/server/routes/campaign.js
index ccd59baa..6f36fc7f 100644
--- a/server/routes/campaign.js
+++ b/server/routes/campaign.js
@@ -2,7 +2,6 @@ const express = require('express');
const router = express.Router();
const passport = require('passport');
-const rateLimitMiddleware = require("../config/rate-limiter");
const Campaign = require("../models/Campaign");
const CampaignUser = require("../models/CampaignUser");
@@ -13,8 +12,7 @@ const upload = require("../config/storage");
router.post('/register', passport.authenticate('jwt', {session: false}), rateLimitMiddleware, (req, res) => {
});
*/
-
-router.post('/create', passport.authenticate('jwt', {session: false}), rateLimitMiddleware, (req, res) => {
+router.post('/create', (req, res) => {
let {
name,
system
@@ -47,7 +45,7 @@ router.post('/create', passport.authenticate('jwt', {session: false}), rateLimit
}).catch((err) => {res.json({status: "error", msg: "internal"})});
});
-router.post('/join', passport.authenticate('jwt', {session: false}), rateLimitMiddleware, (req, res) => {
+router.post('/join', (req, res) => {
let {
invite_code
} = req.body;
@@ -82,16 +80,16 @@ router.post('/join', passport.authenticate('jwt', {session: false}), rateLimitMi
}).catch(err => res.json({status: "error", msg: "internal"}))
});
-router.get('/list', passport.authenticate('jwt', {session: false}), (req, res) => {
- CampaignUser.find({user: req.user}).populate("campaign").then((data) => {
+router.get('/list', (req, res) => {
+ CampaignUser.find({user: req.user}).populate("campaign").lean().then((data) => {
res.json(data);
console.log(data);
return;
}).catch((err) => res.json({status: "error", msg: "internal"}));
});
-router.get('/players', passport.authenticate('jwt', {session: false}), (req, res) => {
- Campaign.findById(req.query.campaign).then((campaign) => {
+router.get('/players', (req, res) => {
+ Campaign.findById(req.query.campaign).lean().then((campaign) => {
CampaignUser.find({campaign}).populate('user').then((data) => {
console.log("djskajdk")
console.log(data);
diff --git a/server/routes/character.js b/server/routes/character.js
index 18798e27..719de306 100644
--- a/server/routes/character.js
+++ b/server/routes/character.js
@@ -11,24 +11,24 @@ const Character = require('../models/Character');
const upload = require("../config/storage");
// Get characters from a campaign
-router.get('/list', passport.authenticate('jwt', {session: false}), (req, res) => {
+router.get('/list', (req, res) => {
});
// Character info
-router.post('/create', passport.authenticate('jwt', {session: false}), rateLimitMiddleware, (req, res) => {
+router.post('/create', rateLimitMiddleware, (req, res) => {
});
-router.delete('/delete', passport.authenticate('jwt', {session: false}), rateLimitMiddleware, (req, res) => {
+router.delete('/delete', rateLimitMiddleware, (req, res) => {
});
-router.get('/get', passport.authenticate('jwt', {session: false}), (req, res) => {
+router.get('/get', (req, res) => {
});
-router.put('/update', passport.authenticate('jwt', {session: false}), (req, res) => {
+router.put('/update', (req, res) => {
});
diff --git a/server/routes/concept.js b/server/routes/concept.js
new file mode 100644
index 00000000..7934765d
--- /dev/null
+++ b/server/routes/concept.js
@@ -0,0 +1,72 @@
+const express = require('express');
+const router = express.Router();
+
+const passport = require('passport');
+
+const Campaign = require("../models/Campaign");
+const CampaignUser = require("../models/CampaignUser");
+const Concept = require('../models/Concept');
+const { hasCampaign } = require('../config/middleware');
+const { getIo } = require('../io/socket');
+
+const io = getIo();
+
+router.get('/list', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
+ Concept.find({campaign}).select('-data').lean().then(data => {
+ res.json({status: "ok", data});
+ });
+});
+
+router.post('/create', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
+ let data = req.body.data;
+
+ if(!(data.type && data.name)) {
+ res.json({status: "error", msg: "args"});
+ return;
+ }
+
+ let concept = new Concept({campaign, type: data.type, name: data.name});
+ concept.save().then(concept => {
+ io.to(req.room).emit('update-concepts');
+ res.json({status: "ok", concept});
+ })
+});
+
+router.delete('/delete', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
+ let id = req.query.id;
+ if(!id) {
+ res.json({status: "error", msg: "args"});
+ return;
+ }
+
+ Concept.deleteOne({_id: id, campaign}).then(() => {
+ io.to(req.room).emit('update-concepts');
+ res.json({status: "ok"});
+ });
+});
+
+router.get('/get', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
+ let id = req.query.id;
+
+ Concept.findOne({_id: id, campaign}).lean().then(concept => {
+ res.json({status: "ok", concept});
+ });
+});
+
+router.put('/update', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
+ let id = req.query.id;
+
+ Concept.findOneAndUpdate({_id: id, campaign}, req.body.concept).then(result => {
+ console.log(req.room)
+ if(req.query.fireUpdate) io.to(req.room).emit('update-concepts');
+ io.to(req.room).emit('update-concept', id);
+ res.json({status: "ok"});
+ });
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/routes/map.js b/server/routes/map.js
index 7f789b3e..685204a6 100644
--- a/server/routes/map.js
+++ b/server/routes/map.js
@@ -10,111 +10,83 @@ const Map = require("../models/Map");
const fs = require('fs');
const upload = require("../config/storage");
+const { hasCampaign } = require('../config/middleware');
-router.post('/create-resource', upload.single("image"), passport.authenticate('jwt', {session: false}), (req, res) => {
+router.post('/create-resource', hasCampaign, upload.single("image"), (req, res) => {
const imageName = req.file.filename;
+ const data = req.cu;
- Campaign.findById(req.query.campaign).then((campaign) => {
- CampaignUser.findOne({campaign, user: req.user}).then((data) => {
- if(!data) {
- res.json({status: "error", msg: "not-found"})
- fs.unlink(imageName);
- return;
- }
+ if(data.is_dm){
+ res.json({
+ status: "ok",
+ data: imageName
+ });
+ return;
+ } else {
+ res.json({status: "error", msg: "not-dm"})
+ }
- if(data.is_dm){
- res.json({
- status: "ok",
- data: imageName
- });
- return;
- }
-
- res.json({status: "error", msg: "not-dm"})
- fs.unlink(imageName);
- return;
- }).catch((err) => res.json({status: "error", msg: "not-found"}));
- }).catch((err) => res.json({status: "error", err}));
+ return;
});
// rateLimitMiddleware?
-router.post('/create', passport.authenticate('jwt', {session: false}), (req, res) => {
- Campaign.findById(req.body.campaign).then((campaign) => {
- CampaignUser.findOne({campaign, user: req.user}).then((data) => {
- if(!data) {
- res.json({status: "error", msg: "not-found"})
+router.post('/create', hasCampaign, (req, res) => {
+ const data = req.cu;
+ const campaign = req.campaign;
+
+ if(data.is_dm){
+ let mapData = req.body.data;
+ if(mapData){
+ let map = new Map({
+ data: mapData,
+ campaign
+ });
+ map.save().then(map => {
+ res.json({
+ status: "ok",
+ data: map
+ });
return;
- }
-
- if(data.is_dm){
- let mapData = req.body.data;
- if(mapData){
- let map = new Map({
- data: mapData,
- campaign
- });
- map.save().then(map => {
- res.json({
- status: "ok",
- data: map
- });
- return;
- });
- } else res.json({status: "error", msg: "args"})
- return;
- }
- }).catch((err) => res.json({status: "error", msg: "not-found"}));
- }).catch((err) => res.json({status: "error", err}));
+ });
+ } else res.json({status: "error", msg: "args"})
+ return;
+ }
});
-router.post('/update', passport.authenticate('jwt', {session: false}), (req, res) => {
- Campaign.findById(req.query.campaign).then((campaign) => {
- CampaignUser.findOne({campaign, user: req.user}).then((data) => {
- if(!data) {
- res.json({status: "error", msg: "not-found"})
- return;
- }
-
- if(data.is_dm){
- console.log("Ab");
- let mapData = req.body.data;
- if(mapData){
- console.log("Map data:");
- console.log(mapData)
- Map.updateOne({_id: req.query.map, campaign}, {data: mapData}).then(map => {
- res.json({
- status: "ok",
- data: map
- });
- });
- } else res.json({status: "error", msg: "args"})
- return;
- }
- }).catch((err) => res.json({status: "error", msg: "not-found"}));
- }).catch((err) => res.json({status: "error", err}));
+router.post('/update', hasCampaign, (req, res) => {
+ const data = req.cu;
+ const campaign = req.campaign;
+
+ if(data.is_dm){
+ let mapData = req.body.data;
+ if(mapData){
+ console.log("Map data:");
+ console.log(mapData)
+ Map.updateOne({_id: req.query.map, campaign}, {data: mapData}).then(map => {
+ res.json({
+ status: "ok",
+ data: map
+ });
+ });
+ } else res.json({status: "error", msg: "args"})
+ return;
+ }
});
-router.get('/list', passport.authenticate('jwt', {session: false}), (req, res) => {
- Campaign.findById(req.query.campaign).then((campaign) => {
- CampaignUser.findOne({campaign, user: req.user}).then((data) => {
- if(!data) {
- res.json({status: "error", msg: "not-found"})
- return;
- }
+router.get('/list', hasCampaign, (req, res) => {
+ const campaign = req.campaign;
- Map.find({campaign}).then(data => {
- res.json({status: "ok", data});
- return;
- }).catch(err => res.json({status: "error", msg: "internal"}));
- }).catch((err) => res.json({status: "error", msg: "not-found"}));
- }).catch((err) => res.json({status: "error", err}));
+ Map.find({campaign}).then(data => {
+ res.json({status: "ok", data});
+ return;
+ }).catch(err => res.json({status: "error", msg: "internal"}));
});
-router.get('/get', passport.authenticate('jwt', {session: false}), (req, res) => {
+router.get('/get', (req, res) => {
});
-router.delete('/delete', passport.authenticate('jwt', {session: false}), (req, res) => {
+router.delete('/delete', (req, res) => {
});
diff --git a/server/server.js b/server/server.js
index 1b5dedf3..8ae5d685 100755
--- a/server/server.js
+++ b/server/server.js
@@ -1,7 +1,6 @@
const express = require('express');
const http = require('http')
const socketIo = require('socket.io');
-
const app = express();
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
@@ -11,67 +10,75 @@ const path = require('path');
const morgan = require('morgan');
const cors = require('cors');
const passport = require('passport');
-
const server = http.createServer(app);
-const io = socketIo(server, {
- cors: {
- origin: '*',
- }
-});
-
-const PORT = 8081;
-
const config = JSON.parse(fs.readFileSync("config.json"));
+
+// SET CONSTANTS
+const PORT = 8081;
global.appRoot = path.resolve(__dirname);
-
-
-var mongo_final_ip = "";
-
+let mongo_final_ip = "";
console.log("Production? " + !process.env.DEBUG);
if(process.env.DEBUG){
mongo_final_ip = "mongodb://" + config.mongo_ip_debug + "/dragonroll";
} else {
mongo_final_ip = "mongodb://" + config.mongo_ip + "/dragonroll";
}
-console.log(mongo_final_ip)
+console.log("Db ip: " + mongo_final_ip)
+// CONFIGURE SOCKET IO
+const socket = require('./io/socket')
+const io = socketIo(server, {
+ cors: {
+ origin: '*',
+ }
+});
+socket.setIo(io);
+
+// CONNECT TO MONGODB
mongoose.connect(mongo_final_ip).then(() => {
console.log("Connected to database");
}).catch((error) => {
console.log(error);
});
+// PASSPORT
app.use(morgan('tiny'));
-
app.use(passport.initialize());
require('./config/passport')(passport);
-// Carpeta publica
+// PUBLIC
app.use("/public", express.static(__dirname + '/public'));
-// app.use("/.well-known", express.static(__dirname + '/.well-known'));
+app.use('/public', express.static('uploads'));
-// IDk per a què serveix això
+// JSON LIMIT EXPRESS
app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({
extended : false,
limit: '50mb'
}));
+// CORS
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
-// Routes (/ només)
+// ROUTES (NO AUTH)
app.use('/user', require('./routes/user'));
+
+// AUTH
+checkAuth = passport.authenticate('jwt', {session: false});
+app.use(checkAuth);
+
+// ROUTES WITH AUTH
app.use('/campaign', require('./routes/campaign'));
app.use('/maps', require('./routes/map'))
+app.use('/concept', require('./routes/concept'))
+// GET localhost:8081/concept/list
+// SETUP IO
+require('./io/campaign')(socket.getIo());
-app.use('/public', express.static('uploads'));
-
-require('./io/campaign')(io);
-
-// app.use('/users', require('./routes/users'));
+// LISTEN
server.listen(PORT, () => {
console.log("Dragonroll backend started");
});
-
New Item
+{{ concept.name }}
-