mirror of
https://github.com/spacedeck/spacedeck-open.git
synced 2025-12-16 18:07:31 +01:00
WIP first partially working version without mongodb, using sqlite/sequelize
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
"use strict";
|
||||
var config = require('config');
|
||||
require('../../models/schema');
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
var redis = require('../../helpers/redis');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
@@ -15,12 +18,10 @@ var fs = require('fs');
|
||||
var async = require('async');
|
||||
var _ = require("underscore");
|
||||
var mongoose = require("mongoose");
|
||||
var archiver = require('archiver');
|
||||
var request = require('request');
|
||||
var url = require("url");
|
||||
var path = require("path");
|
||||
var crypto = require('crypto');
|
||||
var qr = require('qr-image');
|
||||
var glob = require('glob');
|
||||
var gm = require('gm');
|
||||
const exec = require('child_process');
|
||||
@@ -48,15 +49,14 @@ router.get('/', function(req, res, next) {
|
||||
});
|
||||
} else {
|
||||
if (req.query.writablefolders) {
|
||||
Membership.find({
|
||||
user: req.user._id
|
||||
}, (err, memberships) => {
|
||||
db.Membership.find({where: {
|
||||
user_id: req.user._id
|
||||
}}, (memberships) => {
|
||||
|
||||
var validMemberships = memberships.filter((m) => {
|
||||
if (!m.space || (m.space == "undefined"))
|
||||
if (!m.space_id || (m.space_id == "undefined"))
|
||||
return false;
|
||||
else
|
||||
return mongoose.Types.ObjectId.isValid(m.space.toString());
|
||||
return true;
|
||||
});
|
||||
|
||||
var editorMemberships = validMemberships.filter((m) => {
|
||||
@@ -64,7 +64,7 @@ router.get('/', function(req, res, next) {
|
||||
});
|
||||
|
||||
var spaceIds = editorMemberships.map(function(m) {
|
||||
return new mongoose.Types.ObjectId(m.space);
|
||||
return m.space_id;
|
||||
});
|
||||
|
||||
var q = {
|
||||
@@ -158,7 +158,7 @@ router.get('/', function(req, res, next) {
|
||||
.populate('creator', userMapping)
|
||||
.exec(function(err, space) {
|
||||
if (space) {
|
||||
Space.roleInSpace(space, req.user, function(err, role) {
|
||||
db.getUserRoleInSpace(space, req.user, function(role) {
|
||||
|
||||
if (role == "none") {
|
||||
if(space.access_mode == "public") {
|
||||
@@ -185,41 +185,42 @@ router.get('/', function(req, res, next) {
|
||||
});
|
||||
|
||||
} else {
|
||||
Membership.find({
|
||||
user: req.user._id
|
||||
}, function(err, memberships) {
|
||||
|
||||
console.log("!!!!!!!!!! spaces lookup");
|
||||
|
||||
db.Membership.findAll({ where: {
|
||||
user_id: req.user._id
|
||||
}}).then(memberships => {
|
||||
if (!memberships) memberships = [];
|
||||
|
||||
var validMemberships = memberships.filter(function(m) {
|
||||
if (!m.space || (m.space == "undefined"))
|
||||
if (!m.space_id || (m.space_id == "undefined"))
|
||||
return false;
|
||||
else
|
||||
return mongoose.Types.ObjectId.isValid(m.space.toString());
|
||||
});
|
||||
|
||||
var spaceIds = validMemberships.map(function(m) {
|
||||
return new mongoose.Types.ObjectId(m.space);
|
||||
return m.space_id;
|
||||
});
|
||||
|
||||
var q = {
|
||||
"$or": [{
|
||||
"creator": req.user._id,
|
||||
[Op.or]: [{
|
||||
"creator_id": req.user._id,
|
||||
"parent_space_id": req.user.home_folder_id
|
||||
}, {
|
||||
"_id": {
|
||||
"$in": spaceIds
|
||||
[Op.in]: spaceIds
|
||||
},
|
||||
"creator": {
|
||||
"$ne": req.user._id
|
||||
"creator_id": {
|
||||
[Op.ne]: req.user._id
|
||||
}
|
||||
}]
|
||||
};
|
||||
|
||||
Space
|
||||
.find(q)
|
||||
.populate('creator', userMapping)
|
||||
.exec(function(err, spaces) {
|
||||
if (err) console.error(err);
|
||||
db.Space
|
||||
.findAll({where: q})
|
||||
.then(function(spaces) {
|
||||
var updatedSpaces = spaces.map(function(s) {
|
||||
var spaceObj = s.toObject();
|
||||
var spaceObj = db.spaceToObject(s);
|
||||
return spaceObj;
|
||||
});
|
||||
res.status(200).json(spaces);
|
||||
@@ -229,47 +230,46 @@ router.get('/', function(req, res, next) {
|
||||
}
|
||||
});
|
||||
|
||||
// create a space
|
||||
router.post('/', function(req, res, next) {
|
||||
if (req.user) {
|
||||
var attrs = req.body;
|
||||
|
||||
var createSpace = () => {
|
||||
|
||||
attrs.creator = req.user;
|
||||
attrs._id = uuidv4();
|
||||
attrs.creator_id = req.user._id;
|
||||
attrs.edit_hash = crypto.randomBytes(64).toString('hex').substring(0, 7);
|
||||
attrs.edit_slug = slug(attrs.name);
|
||||
|
||||
var space = new Space(attrs);
|
||||
space.save(function(err, createdSpace) {
|
||||
if (err) res.sendStatus(400);
|
||||
else {
|
||||
var membership = new Membership({
|
||||
user: req.user,
|
||||
space: createdSpace,
|
||||
role: "admin"
|
||||
});
|
||||
membership.save(function(err, createdTeam) {
|
||||
if (err) {
|
||||
res.status(400).json(err);
|
||||
} else {
|
||||
res.status(201).json(createdSpace);
|
||||
}
|
||||
});
|
||||
}
|
||||
db.Space.create(attrs).then(createdSpace => {
|
||||
//if (err) res.sendStatus(400);
|
||||
|
||||
console.log("!!!!!!!!!! createdSpace:",createdSpace);
|
||||
|
||||
var membership = {
|
||||
_id: uuidv4(),
|
||||
user_id: req.user._id,
|
||||
space_id: attrs._id,
|
||||
role: "admin"
|
||||
};
|
||||
|
||||
db.Membership.create(membership).then(() => {
|
||||
res.status(201).json(createdSpace);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (attrs.parent_space_id) {
|
||||
Space.findOne({
|
||||
db.Space.findOne({ where: {
|
||||
"_id": attrs.parent_space_id
|
||||
}).populate('creator', userMapping).exec((err, parentSpace) => {
|
||||
}}).then(parentSpace => {
|
||||
if (parentSpace) {
|
||||
Space.roleInSpace(parentSpace, req.user, (err, role) => {
|
||||
db.getUserRoleInSpace(parentSpace, req.user, (role) => {
|
||||
if ((role == "editor") || (role == "admin")) {
|
||||
createSpace();
|
||||
} else {
|
||||
res.status(403).json({
|
||||
"error": "not editor in parent Space"
|
||||
"error": "not editor in parent Space. role: "+role
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -292,6 +292,30 @@ router.get('/:id', function(req, res, next) {
|
||||
res.status(200).json(req.space);
|
||||
});
|
||||
|
||||
router.get('/:id/path', (req, res) => {
|
||||
// build up a breadcrumb trail (path)
|
||||
var path = [];
|
||||
var buildPath = (space) => {
|
||||
if (space.parent_space_id) {
|
||||
db.Space.findOne({ where: {
|
||||
"_id": space.parent_space_id
|
||||
}}).then(parentSpace => {
|
||||
if (space._id == parentSpace._id) {
|
||||
console.error("error: circular parent reference for space " + space._id);
|
||||
res.send("error: circular reference");
|
||||
} else {
|
||||
path.push(parentSpace);
|
||||
buildPath(parentSpace);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// reached the top
|
||||
res.json(path.reverse());
|
||||
}
|
||||
}
|
||||
buildPath(req.space);
|
||||
});
|
||||
|
||||
router.put('/:id', function(req, res) {
|
||||
var space = req.space;
|
||||
var newAttr = req.body;
|
||||
@@ -308,17 +332,10 @@ router.put('/:id', function(req, res) {
|
||||
delete newAttr['editor_name'];
|
||||
delete newAttr['creator'];
|
||||
|
||||
Space.findOneAndUpdate({
|
||||
db.Space.update(newAttr, {where: {
|
||||
"_id": space._id
|
||||
}, {
|
||||
"$set": newAttr
|
||||
}, {
|
||||
"new": true
|
||||
}, function(err, space) {
|
||||
if (err) res.status(400).json(err);
|
||||
else {
|
||||
res.distributeUpdate("Space", space);
|
||||
}
|
||||
}}).then(space => {
|
||||
res.distributeUpdate("Space", space);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -339,7 +356,7 @@ router.post('/:id/background', function(req, res, next) {
|
||||
if (adv.background_uri) {
|
||||
var oldPath = url.parse(req.space.thumbnail_url).pathname;
|
||||
uploader.removeFile(oldPath, function(err) {
|
||||
console.log("removed old bg error:", err);
|
||||
console.error("removed old bg error:", err);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -390,10 +407,10 @@ router.post('/:id/duplicate', (req, res, next) => {
|
||||
}).populate('creator', userMapping).exec((err, parentSpace) => {
|
||||
if (!parentSpace) {
|
||||
res.status(404).json({
|
||||
"error": "parent space not found for dupicate"
|
||||
"error": "parent space not found for duplicate"
|
||||
});
|
||||
} else {
|
||||
Space.roleInSpace(parentSpace, req.user, (err, role) => {
|
||||
db.getUserRoleInSpace(parentSpace, req.user, (role) => {
|
||||
if (role == "admin" || role == "editor") {
|
||||
handleDuplicateSpaceRequest(req, res, parentSpace);
|
||||
} else {
|
||||
@@ -449,6 +466,7 @@ router.post('/:id/artifacts-pdf', function(req, res, next) {
|
||||
fs.mkdir(outputFolder, function(db) {
|
||||
var images = outputFolder + "/" + rawName + "-page-%03d.jpeg";
|
||||
|
||||
// FIXME not portable
|
||||
exec.execFile("gs", ["-sDEVICE=jpeg", "-dDownScaleFactor=4", "-dDOINTERPOLATE", "-dNOPAUSE", "-dJPEGQ=80", "-dBATCH", "-sOutputFile=" + images, "-r250", "-f", localFilePath], {}, function(error, stdout, stderr) {
|
||||
if (error === null) {
|
||||
|
||||
@@ -532,6 +550,7 @@ router.post('/:id/artifacts-pdf', function(req, res, next) {
|
||||
|
||||
}, function(err, artifacts) {
|
||||
|
||||
// FIXME not portable
|
||||
exec.execFile("rm", ["-r", outputFolder], function(err) {
|
||||
res.status(201).json(_.flatten(artifacts));
|
||||
|
||||
@@ -551,6 +570,7 @@ router.post('/:id/artifacts-pdf', function(req, res, next) {
|
||||
});
|
||||
} else {
|
||||
console.error("error:", error);
|
||||
// FIXME not portable
|
||||
exec.execFile("rm", ["-r", outputFolder], function(err) {
|
||||
fs.unlink(localFilePath);
|
||||
res.status(400).json({});
|
||||
|
||||
Reference in New Issue
Block a user