Просмотр исходного кода

refactor: mv hasWritePermission to fileUploadService.getIsWritable

mizozobu 3 лет назад
Родитель
Сommit
493b56216a

+ 15 - 0
packages/app/src/server/service/file-uploader/aws.ts

@@ -201,6 +201,21 @@ module.exports = (crowi) => {
     return s3.send(new PutObjectCommand(params));
     return s3.send(new PutObjectCommand(params));
   };
   };
 
 
+  lib.saveFile = async function({ filePath, contentType, data }) {
+    const s3 = S3Factory();
+    const awsConfig = getAwsConfig();
+
+    const params = {
+      Bucket: awsConfig.bucket,
+      ContentType: contentType,
+      Key: filePath,
+      Body: data,
+      ACL: 'public-read',
+    };
+
+    return s3.send(new PutObjectCommand(params));
+  };
+
   lib.findDeliveryFile = async function(attachment) {
   lib.findDeliveryFile = async function(attachment) {
     if (!lib.getIsReadable()) {
     if (!lib.getIsReadable()) {
       throw new Error('AWS is not configured.');
       throw new Error('AWS is not configured.');

+ 7 - 0
packages/app/src/server/service/file-uploader/gcs.js

@@ -137,6 +137,13 @@ module.exports = function(crowi) {
     return myBucket.upload(fileStream.path, options);
     return myBucket.upload(fileStream.path, options);
   };
   };
 
 
+  lib.saveFile = async function({ filePath, contentType, data }) {
+    const gcs = getGcsInstance();
+    const myBucket = gcs.bucket(getGcsBucket());
+
+    return myBucket.file(filePath).save(data, { resumable: false });
+  };
+
   /**
   /**
    * Find data substance
    * Find data substance
    *
    *

+ 16 - 0
packages/app/src/server/service/file-uploader/gridfs.js

@@ -1,3 +1,5 @@
+import { Readable } from 'stream';
+
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 const logger = loggerFactory('growi:service:fileUploaderGridfs');
 const logger = loggerFactory('growi:service:fileUploaderGridfs');
@@ -102,6 +104,20 @@ module.exports = function(crowi) {
     );
     );
   };
   };
 
 
+  lib.saveFile = async function({ filePath, contentType, data }) {
+    const readable = new Readable();
+    readable.push(data);
+    readable.push(null); // EOF
+
+    return AttachmentFile.promisifiedWrite(
+      {
+        filename: filePath,
+        contentType,
+      },
+      readable,
+    );
+  };
+
   /**
   /**
    * Find data substance
    * Find data substance
    *
    *

+ 16 - 0
packages/app/src/server/service/file-uploader/local.js

@@ -1,3 +1,5 @@
+import { Readable } from 'stream';
+
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 const logger = loggerFactory('growi:service:fileUploaderLocal');
 const logger = loggerFactory('growi:service:fileUploaderLocal');
@@ -81,6 +83,20 @@ module.exports = function(crowi) {
     return streamToPromise(stream);
     return streamToPromise(stream);
   };
   };
 
 
+  lib.saveFile = async function({ filePath, contentType, data }) {
+    const absFilePath = path.posix.join(basePath, filePath);
+    const dirpath = path.posix.dirname(absFilePath);
+
+    // mkdir -p
+    mkdir.sync(dirpath);
+
+    const fileStream = new Readable();
+    fileStream.push(data);
+    fileStream.push(null); // EOF
+    const stream = fileStream.pipe(fs.createWriteStream(absFilePath));
+    return streamToPromise(stream);
+  };
+
   /**
   /**
    * Find data substance
    * Find data substance
    *
    *

Разница между файлами не показана из-за своего большого размера
+ 6 - 0
packages/app/src/server/service/file-uploader/none.js


+ 31 - 0
packages/app/src/server/service/file-uploader/uploader.js

@@ -1,3 +1,10 @@
+import { randomUUID } from 'crypto';
+import { Readable } from 'stream';
+
+import loggerFactory from '~/utils/logger';
+
+const logger = loggerFactory('growi:service:fileUploader');
+
 // file uploader virtual class
 // file uploader virtual class
 // 各アップローダーで共通のメソッドはここで定義する
 // 各アップローダーで共通のメソッドはここで定義する
 
 
@@ -12,6 +19,30 @@ class Uploader {
     return !this.configManager.getConfig('crowi', 'app:fileUploadDisabled') && this.isValidUploadSettings();
     return !this.configManager.getConfig('crowi', 'app:fileUploadDisabled') && this.isValidUploadSettings();
   }
   }
 
 
+  /**
+   * Get whether write opration to the storage is permitted
+   * @returns Whether write opration to the storage is permitted
+   */
+  async getIsWritable() {
+    const filePath = `${randomUUID()}.growi`;
+    const data = 'This file was created during g2g transfer to check write permission. You can safely remove this file.';
+
+    try {
+      await this.saveFile({
+        filePath,
+        contentType: 'text/plain',
+        data,
+      });
+      // TODO: delete tmp file in background
+
+      return true;
+    }
+    catch (err) {
+      logger.error(err);
+      return false;
+    }
+  }
+
   // File reading is possible even if uploading is disabled
   // File reading is possible even if uploading is disabled
   getIsReadable() {
   getIsReadable() {
     return this.isValidUploadSettings();
     return this.isValidUploadSettings();

+ 3 - 35
packages/app/src/server/service/g2g-transfer.ts

@@ -1,4 +1,3 @@
-import { randomUUID } from 'crypto';
 import { createReadStream, ReadStream } from 'fs';
 import { createReadStream, ReadStream } from 'fs';
 import { basename } from 'path';
 import { basename } from 'path';
 import { Readable } from 'stream';
 import { Readable } from 'stream';
@@ -140,37 +139,6 @@ const generateAxiosRequestConfigWithTransferKey = (tk: TransferKey, additionalHe
   };
   };
 };
 };
 
 
-
-/**
- * Check whether the storage is writable
- * @param crowi Crowi instance
- * @returns Whether the storage is writable
- */
-const hasWritePermission = async(crowi: any): Promise<boolean> => {
-  const { fileUploadService } = crowi;
-
-  let writable = true;
-  const fileStream = new Readable();
-  fileStream.push('This file was created during g2g transfer to check write permission. You can safely remove this file.');
-  fileStream.push(null); // EOF
-  const attachment = {
-    fileName: `${randomUUID()}.growi`,
-    filePath: '',
-    fileFormat: 'text/plain',
-  };
-
-  try {
-    await fileUploadService.uploadAttachment(fileStream, attachment);
-    // TODO: remove tmp file
-  }
-  catch (err) {
-    writable = false;
-    logger.error(err);
-  }
-
-  return writable;
-};
-
 export class G2GTransferPusherService implements Pusher {
 export class G2GTransferPusherService implements Pusher {
 
 
   crowi: any;
   crowi: any;
@@ -469,18 +437,18 @@ export class G2GTransferReceiverService implements Receiver {
    */
    */
   public async answerGROWIInfo(): Promise<IDataGROWIInfo> {
   public async answerGROWIInfo(): Promise<IDataGROWIInfo> {
     // TODO: add attachment file limit
     // TODO: add attachment file limit
-    const { version, configManager } = this.crowi;
+    const { version, configManager, fileUploadService } = this.crowi;
     const userUpperLimit = configManager.getConfig('crowi', 'security:userUpperLimit');
     const userUpperLimit = configManager.getConfig('crowi', 'security:userUpperLimit');
     const fileUploadDisabled = configManager.getConfig('crowi', 'app:fileUploadDisabled');
     const fileUploadDisabled = configManager.getConfig('crowi', 'app:fileUploadDisabled');
     const fileUploadTotalLimit = configManager.getFileUploadTotalLimit();
     const fileUploadTotalLimit = configManager.getFileUploadTotalLimit();
-    const writable = await hasWritePermission(this.crowi);
+    const isWritable = await fileUploadService.getIsWritable();
 
 
     const attachmentInfo = {
     const attachmentInfo = {
       type: configManager.getConfig('crowi', 'app:fileUploadType'),
       type: configManager.getConfig('crowi', 'app:fileUploadType'),
       bucket: undefined,
       bucket: undefined,
       customEndpoint: undefined, // for S3
       customEndpoint: undefined, // for S3
       uploadNamespace: undefined, // for GCS
       uploadNamespace: undefined, // for GCS
-      writable,
+      writable: isWritable,
     };
     };
 
 
     // put storage location info to check storage identification
     // put storage location info to check storage identification

Некоторые файлы не были показаны из-за большого количества измененных файлов