attachment.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. module.exports = function(crowi, app) {
  2. 'use strict';
  3. var debug = require('debug')('crowi:routs:attachment')
  4. , Attachment = crowi.model('Attachment')
  5. , User = crowi.model('User')
  6. , Page = crowi.model('Page')
  7. , Promise = require('bluebird')
  8. , config = crowi.getConfig()
  9. , fs = require('fs')
  10. , actions = {}
  11. , api = {};
  12. actions.api = api;
  13. api.list = function(req, res){
  14. var id = req.params.pageId;
  15. Attachment.getListByPageId(id)
  16. .then(function(attachments) {
  17. res.json({
  18. status: true,
  19. data: {
  20. fileBaseUrl: 'https://' + config.crowi['aws:bucket'] +'.s3.amazonaws.com/', // FIXME: ベタ書きよくない
  21. attachments: attachments
  22. }
  23. });
  24. });
  25. };
  26. /**
  27. *
  28. */
  29. api.add = function(req, res){
  30. var id = req.params.pageId,
  31. path = decodeURIComponent(req.body.path),
  32. pageCreated = false,
  33. page = {};
  34. debug('id and path are: ', id, path);
  35. var fileUploader = require('../util/fileUploader')(crowi, app);
  36. var tmpFile = req.files.file || null;
  37. debug('Uploaded tmpFile: ', tmpFile);
  38. if (!tmpFile) {
  39. return res.json({
  40. status: false,
  41. message: 'File error.'
  42. });
  43. }
  44. new Promise(function(resolve, reject) {
  45. if (id == 0) {
  46. debug('Create page before file upload');
  47. Page.create(path, '# ' + path, req.user, {grant: Page.GRANT_OWNER}, function(err, pageData) {
  48. if (err) {
  49. debug('Page create error', err);
  50. return reject(err);
  51. }
  52. pageCreated = true;
  53. return resolve(pageData);
  54. });
  55. } else {
  56. Page.findPageById(id, function(err, pageData){
  57. if (err) {
  58. debug('Page find error', err);
  59. return reject(err);
  60. }
  61. return resolve(pageData);
  62. });
  63. }
  64. }).then(function(pageData) {
  65. page = pageData;
  66. id = pageData._id;
  67. var tmpPath = tmpFile.path,
  68. originalName = tmpFile.originalname,
  69. fileName = tmpFile.name,
  70. fileType = tmpFile.mimetype,
  71. fileSize = tmpFile.size,
  72. filePath = Attachment.createAttachmentFilePath(id, fileName, fileType);
  73. fileUploader.uploadFile(
  74. filePath,
  75. fileType,
  76. fs.createReadStream(tmpPath, {
  77. flags: 'r',
  78. encoding: null,
  79. fd: null,
  80. mode: '0666',
  81. autoClose: true
  82. }),
  83. {}
  84. ).then(function(data) {
  85. debug('Uploaded data is: ', data);
  86. // TODO size
  87. Attachment.create(id, req.user, filePath, originalName, fileName, fileType, fileSize)
  88. .then(function(data) {
  89. var imageUrl = fileUploader.generateS3FileUrl(data.filePath);
  90. return res.json({
  91. status: true,
  92. filename: imageUrl,
  93. attachment: data,
  94. page: page,
  95. pageCreated: pageCreated,
  96. message: 'Successfully uploaded.',
  97. });
  98. }, function (err) {
  99. debug('Error on saving attachment data', err);
  100. // @TODO
  101. // Remove from S3
  102. return res.json({
  103. status: false,
  104. message: '',
  105. });
  106. }).finally(function() {
  107. fs.unlink(tmpPath, function (err) {
  108. if (err) {
  109. debug('Error while deleting tmp file.');
  110. }
  111. });
  112. });
  113. }, function(err) {
  114. debug('Upload error to S3.', err);
  115. return res.json({
  116. status: false,
  117. message: 'Error while uploading.',
  118. });
  119. });
  120. });
  121. };
  122. api.remove = function(req, res){
  123. var id = req.params.id;
  124. };
  125. return actions;
  126. };