index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // crowi-fileupload-aws
  2. module.exports = function(crowi) {
  3. 'use strict';
  4. var aws = require('aws-sdk')
  5. , debug = require('debug')('crowi:lib:fileUploaderAws')
  6. , Config = crowi.model('Config')
  7. , config = crowi.getConfig()
  8. , lib = {}
  9. , getAwsConfig = function() {
  10. var config = crowi.getConfig();
  11. return {
  12. accessKeyId: config.crowi['aws:accessKeyId'],
  13. secretAccessKey: config.crowi['aws:secretAccessKey'],
  14. region: config.crowi['aws:region'],
  15. bucket: config.crowi['aws:bucket']
  16. };
  17. };
  18. lib.deleteFile = function(filePath) {
  19. return new Promise(function(resolve, reject) {
  20. debug('Unsupported file deletion.');
  21. resolve('TODO: ...');
  22. });
  23. };
  24. lib.uploadFile = function(filePath, contentType, fileStream, options) {
  25. var awsConfig = getAwsConfig();
  26. if (!Config.isUploadable(config)) {
  27. return Promise.reject(new Error('AWS is not configured.'));
  28. }
  29. aws.config.update({
  30. accessKeyId: awsConfig.accessKeyId,
  31. secretAccessKey: awsConfig.secretAccessKey,
  32. region: awsConfig.region
  33. });
  34. var s3 = new aws.S3();
  35. var params = {Bucket: awsConfig.bucket};
  36. params.ContentType = contentType;
  37. params.Key = filePath;
  38. params.Body = fileStream;
  39. params.ACL = 'public-read';
  40. return new Promise(function(resolve, reject) {
  41. s3.putObject(params, function(err, data) {
  42. if (err) {
  43. return reject(err);
  44. }
  45. return resolve(data);
  46. });
  47. });
  48. };
  49. lib.generateUrl = function(filePath) {
  50. var awsConfig = getAwsConfig()
  51. , url = 'https://' + awsConfig.bucket +'.s3.amazonaws.com/' + filePath;
  52. return url;
  53. };
  54. lib.findDeliveryFile = function (attachment) {
  55. var cacheFile = lib.createCacheFileName(attachment);
  56. return new Promise((resolve, reject) => {
  57. debug('find delivery file', cacheFile);
  58. if (!lib.shouldUpdateCacheFile(cacheFile)) {
  59. return resolve(cacheFile);
  60. }
  61. var fs = require('fs');
  62. var loader = require('https');
  63. var fileStream = fs.createWriteStream(cacheFile);
  64. var fileUrl = lib.generateUrl(attachment.filePath);
  65. debug('Load attachement file into local cache file', fileUrl, cacheFile);
  66. var request = loader.get(fileUrl, function(response) {
  67. response.pipe(fileStream, { end: false });
  68. response.on('end', () => {
  69. fileStream.end();
  70. resolve(cacheFile);
  71. });
  72. });
  73. });
  74. };
  75. // private
  76. lib.createCacheFileName = function(attachment) {
  77. return crowi.cacheDir + '/attachment-' + attachment._id;
  78. };
  79. // private
  80. lib.shouldUpdateCacheFile = function(filePath) {
  81. var fs = require('fs');
  82. try {
  83. var stats = fs.statSync(filePath);
  84. if (!stats.isFile()) {
  85. debug('Cache file not found or the file is not a regular fil.');
  86. return true;
  87. }
  88. if (stats.size <= 0) {
  89. debug('Cache file found but the size is 0');
  90. return true;
  91. }
  92. } catch (e) {
  93. // no such file or directory
  94. debug('Stats error', e);
  95. return true;
  96. }
  97. return false;
  98. };
  99. return lib;
  100. };