mirror of
https://github.com/spacedeck/spacedeck-open.git
synced 2025-12-16 09:57:30 +01:00
Port Backend to SQLite/Sequelize (removes MongoDB), Support Electron (#14)
* The MongoDB/Mongoose data storage is removed in favor of Sequelize. This abstracts over SQLite or RDBMs like PostgreSQL and MSSQL. The default is SQLite, which significantly simplifies deployments in end-user environments. * As Spacedeck now has no more mandatory server dependencies, we can wrap it in Electron and ship it as a desktop application. * Removes docker-compose.yml * First version of import UI
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
"use strict";
|
||||
var config = require('config');
|
||||
require('../../models/schema');
|
||||
const db = require('../../models/db');
|
||||
|
||||
var redis = require('../../helpers/redis');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
var uploader = require('../../helpers/uploader');
|
||||
var space_render = require('../../helpers/space-render');
|
||||
@@ -12,13 +11,11 @@ var async = require('async');
|
||||
var moment = require('moment');
|
||||
var fs = require('fs');
|
||||
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');
|
||||
var sanitizeHtml = require('sanitize-html');
|
||||
@@ -49,26 +46,18 @@ var roleMapping = {
|
||||
|
||||
router.get('/png', function(req, res, next) {
|
||||
var triggered = new Date();
|
||||
|
||||
var s3_filename = "s" + req.space._id + "/" + "thumb_" + triggered.getTime() + ".jpg";
|
||||
|
||||
if (!req.space.thumbnail_updated_at || req.space.thumbnail_updated_at < req.space.updated_at || !req.space.thumbnail_url) {
|
||||
|
||||
Space.update({
|
||||
"_id": req.space._id
|
||||
}, {
|
||||
"$set": {
|
||||
thumbnail_updated_at: triggered
|
||||
}
|
||||
}, function(a, b, c) {});
|
||||
|
||||
db.Space.update({ thumbnail_updated_at: triggered }, {where : {"_id": req.space._id }});
|
||||
|
||||
phantom.takeScreenshot(req.space, "png",
|
||||
function(local_path) {
|
||||
var localResizedFilePath = local_path + ".thumb.jpg";
|
||||
gm(local_path).resize(640, 480).quality(70.0).autoOrient().write(localResizedFilePath, function(err) {
|
||||
|
||||
if (err) {
|
||||
console.error("screenshot resize error: ", err);
|
||||
console.error("[space screenshot] resize error: ", err);
|
||||
res.status(500).send("Error taking screenshot.");
|
||||
return;
|
||||
}
|
||||
@@ -76,22 +65,15 @@ router.get('/png', function(req, res, next) {
|
||||
uploader.uploadFile(s3_filename, "image/jpeg", localResizedFilePath, function(err, thumbnailUrl) {
|
||||
|
||||
if (err) {
|
||||
console.error("screenshot s3 upload error. filename: " + s3_filename + " details: ", err);
|
||||
console.error("[space screenshot] upload error. filename: " + s3_filename + " details: ", err);
|
||||
res.status(500).send("Error uploading screenshot.");
|
||||
return;
|
||||
}
|
||||
|
||||
var oldUrl = req.space.thumbnail_url;
|
||||
|
||||
Space.update({
|
||||
"_id": req.space._id
|
||||
}, {
|
||||
"$set": {
|
||||
thumbnail_url: thumbnailUrl
|
||||
}
|
||||
}, function(a, b, c) {
|
||||
db.Space.update({ thumbnail_url: thumbnailUrl }, {where : {"_id": req.space._id }}).then(() => {
|
||||
res.redirect(thumbnailUrl);
|
||||
|
||||
try {
|
||||
if (oldUrl) {
|
||||
var oldPath = url.parse(oldUrl).pathname;
|
||||
@@ -125,77 +107,6 @@ function make_export_filename(space, extension) {
|
||||
return space.name.replace(/[^\w]/g, '') + "-" + space._id + "-" + moment().format("YYYYMMDD-HH-mm-ss") + "." + extension;
|
||||
}
|
||||
|
||||
router.get('/list', function(req, res, next) {
|
||||
|
||||
if (req.user) {
|
||||
if (req.spaceRole == "admin" || req.spaceRole == "editor") {
|
||||
|
||||
if (req.space.space_type == "space") {
|
||||
Artifact.find({
|
||||
space_id: req.space._id
|
||||
}).exec(function(err, artifacts) {
|
||||
async.map(artifacts, function(a, cb) {
|
||||
if (a.user_id) {
|
||||
User.findOne({
|
||||
"_id": a.user_id
|
||||
}).exec(function(err, user) {
|
||||
a.user = user;
|
||||
|
||||
if (a.last_update_user_id) {
|
||||
User.findOne({
|
||||
"_id": a.last_update_user_id
|
||||
}).exec(function(err, updateUser) {
|
||||
a.update_user = updateUser;
|
||||
cb(null, a);
|
||||
});
|
||||
} else {
|
||||
cb(null, a);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
cb(null, a);
|
||||
}
|
||||
}, function(err, mappedArtifacts) {
|
||||
|
||||
req.space.artifacts = mappedArtifacts.map(function(a) {
|
||||
a.description = sanitizeHtml(a.description, {
|
||||
allowedTags: [],
|
||||
allowedAttributes: []
|
||||
});
|
||||
|
||||
if (a.payload_uri) {
|
||||
var parsed = url.parse(a.payload_uri);
|
||||
var fileName = path.basename(parsed.pathname) || "file.bin";
|
||||
a.filename = fileName;
|
||||
}
|
||||
|
||||
return a;
|
||||
});
|
||||
|
||||
res.render('artifact_list', {
|
||||
space: req.space
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
Space.getRecursiveSubspacesForSpace(req.space, (err, subspaces) => {
|
||||
res.render('space_list', {
|
||||
subspaces: subspaces.map((s) => {
|
||||
s.ae_link = config.endpoint + '/s/' + s.edit_hash + (s.edit_slug ? ('-'+s.edit_slug) : '')
|
||||
return s;
|
||||
}),
|
||||
space: req.space
|
||||
});
|
||||
});
|
||||
}
|
||||
} else {
|
||||
res.sendStatus(403);
|
||||
}
|
||||
} else {
|
||||
res.sendStatus(403);
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/pdf', function(req, res, next) {
|
||||
var s3_filename = make_export_filename(req.space, "pdf");
|
||||
|
||||
@@ -329,36 +240,14 @@ router.get('/zip', function(req, res, next) {
|
||||
});
|
||||
|
||||
router.get('/html', function(req, res) {
|
||||
Artifact.find({
|
||||
console.log("!!!!! hello ");
|
||||
db.Artifact.findAll({where: {
|
||||
space_id: req.space._id
|
||||
}, function(err, artifacts) {
|
||||
}}).then(function(artifacts) {
|
||||
var space = req.space;
|
||||
res.send(space_render.render_space_as_html(space, artifacts));
|
||||
});
|
||||
});
|
||||
|
||||
router.get('/path', (req, res) => {
|
||||
// build up a breadcrumb trail (path)
|
||||
var path = [];
|
||||
var buildPath = (space) => {
|
||||
if (space.parent_space_id) {
|
||||
Space.findOne({
|
||||
"_id": space.parent_space_id
|
||||
}, (err, parentSpace) => {
|
||||
if (space._id == parentSpace._id) {
|
||||
console.log("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);
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user