space_artifacts.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. "use strict";
  2. var config = require('config');
  3. const os = require('os');
  4. const db = require('../../models/db');
  5. const Sequelize = require('sequelize');
  6. const Op = Sequelize.Op;
  7. const uuidv4 = require('uuid/v4');
  8. var payloadConverter = require('../../helpers/artifact_converter');
  9. var redis = require('../../helpers/redis');
  10. var async = require('async');
  11. var fs = require('fs');
  12. var _ = require("underscore");
  13. var archiver = require('archiver');
  14. var request = require('request');
  15. var url = require("url");
  16. var path = require("path");
  17. var crypto = require('crypto');
  18. var glob = require('glob');
  19. var gm = require('gm');
  20. var express = require('express');
  21. var router = express.Router({mergeParams: true});
  22. // JSON MAPPINGS
  23. var userMapping = {
  24. _id: 1,
  25. nickname: 1,
  26. email: 1,
  27. avatar_thumb_uri: 1
  28. };
  29. var spaceMapping = {
  30. _id: 1,
  31. name: 1,
  32. thumbnail_url: 1
  33. };
  34. var roleMapping = {
  35. "none": 0,
  36. "viewer": 1,
  37. "editor": 2,
  38. "admin": 3
  39. }
  40. // ARTIFACTS
  41. router.get('/', (req, res) => {
  42. db.Artifact.findAll({where: {
  43. space_id: req.space._id
  44. }}).then(artifacts => {
  45. async.map(artifacts, (a, cb) => {
  46. db.unpackArtifact(a);
  47. if (a.user_id) {
  48. // FIXME JOIN
  49. /*User.findOne({where: {
  50. "_id": a.user_id
  51. }}).select({
  52. "_id": 1,
  53. "nickname": 1,
  54. "email": 1
  55. }).exec((err, user) => {
  56. if (user) {
  57. a['user'] = user.toObject();
  58. }
  59. cb(err, a);
  60. });*/
  61. cb(null, a);
  62. } else {
  63. cb(null, a);
  64. }
  65. }, (err, mappedArtifacts) => {
  66. if (err) res.status(400).json(err);
  67. else {
  68. res.status(200).json(mappedArtifacts);
  69. }
  70. });
  71. });
  72. });
  73. router.post('/', function(req, res, next) {
  74. var attrs = req.body;
  75. attrs['space_id'] = req.space._id;
  76. var artifact = attrs;
  77. artifact._id = uuidv4();
  78. if (req.user) {
  79. artifact.user_id = req.user._id;
  80. artifact.last_update_user_id = req.user._id;
  81. } else {
  82. artifact.last_update_editor_name = req.editor_name;
  83. }
  84. db.packArtifact(artifact);
  85. if (req.spaceRole == "editor" || req.spaceRole == "admin") {
  86. db.Artifact.create(artifact).then(() => {
  87. //if (err) res.status(400).json(err);
  88. db.unpackArtifact(artifact);
  89. db.Space.update({ updated_at: new Date() }, {where: {_id: req.space._id}});
  90. res.distributeCreate("Artifact", artifact);
  91. });
  92. } else {
  93. res.status(401).json({
  94. "error": "Access denied"
  95. });
  96. }
  97. });
  98. router.post('/:artifact_id/payload', function(req, res, next) {
  99. if (req.spaceRole == "editor"  ||  req.spaceRole == "admin") {
  100. var a = req.artifact;
  101. var fileName = (req.query.filename || "upload.bin").replace(/[^a-zA-Z0-9_\-\.]/g, '');
  102. var localFilePath = os.tmpdir() + "/" + fileName;
  103. var writeStream = fs.createWriteStream(localFilePath);
  104. var stream = req.pipe(writeStream);
  105. var progressCallback = function(progressMsg) {
  106. a.description = progressMsg.toString();
  107. db.packArtifact(a);
  108. a.save();
  109. redis.sendMessage("update", "Artifact", a, req.channelId);
  110. };
  111. stream.on('finish', function() {
  112. payloadConverter.convert(a, fileName, localFilePath, function(error, artifact) {
  113. if (error) res.status(400).json(error);
  114. else {
  115. db.Space.update({ updated_at: new Date() }, {where: {_id: req.space._id}});
  116. res.distributeUpdate("Artifact", artifact);
  117. }
  118. }, progressCallback);
  119. });
  120. } else {
  121. res.status(401).json({
  122. "error": "no access"
  123. });
  124. }
  125. });
  126. router.put('/:artifact_id', function(req, res, next) {
  127. var a = req.artifact;
  128. var newAttr = req.body;
  129. newAttr.updated_at = new Date();
  130. delete newAttr['_id'];
  131. if (req.user) {
  132. newAttr.last_update_user_id = req.user._id;
  133. } else {
  134. newAttr.last_update_editor_name = req.editor_name;
  135. }
  136. db.packArtifact(newAttr);
  137. db.Artifact.update(newAttr, { where: {
  138. "_id": a._id
  139. }}).then(rows => {
  140. db.unpackArtifact(newAttr);
  141. db.Space.update({ updated_at: new Date() }, {where: {_id: req.space._id} });
  142. newAttr._id = a._id;
  143. res.distributeUpdate("Artifact", newAttr);
  144. });
  145. });
  146. router.delete('/:artifact_id', function(req, res, next) {
  147. var artifact = req.artifact;
  148. db.Artifact.destroy({where: { "_id": artifact._id}}).then(() => {
  149. db.Space.update({ updated_at: new Date() }, {where: {_id: req.space._id} });
  150. res.distributeDelete("Artifact", artifact);
  151. });
  152. });
  153. module.exports = router;