2
0
Эх сурвалжийг харах

feat: list files in each storage

mizozobu 3 жил өмнө
parent
commit
b6d75258ef

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

@@ -6,6 +6,7 @@ import {
   PutObjectCommand,
   DeleteObjectCommand,
   GetObjectCommandOutput,
+  ListObjectsCommand,
 } from '@aws-sdk/client-s3';
 import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
 import urljoin from 'url-join';
@@ -232,12 +233,22 @@ module.exports = (crowi) => {
 
   /**
    * List files in storage
-   * TODO: implement
    */
   lib.listFiles = async() => {
-    return [
-      { filePath: '', fileSize: '' },
-    ];
+    if (!lib.getIsReadable()) {
+      throw new Error('AWS is not configured.');
+    }
+
+    const s3 = S3Factory();
+    const awsConfig = getAwsConfig();
+    const params = {
+      Bucket: awsConfig.bucket,
+    };
+    const { Contents } = await s3.send(new ListObjectsCommand(params));
+
+    return Contents?.map(({ Key: name, Size: size }) => ({
+      name, size,
+    })) ?? [];
   };
 
   return lib;

+ 11 - 4
packages/app/src/server/service/file-uploader/gcs.js

@@ -186,12 +186,19 @@ module.exports = function(crowi) {
 
   /**
    * List files in storage
-   * TODO: implement
    */
   lib.listFiles = async() => {
-    return [
-      { filePath: '', fileSize: '' },
-    ];
+    if (!this.getIsReadable()) {
+      throw new Error('GCS is not configured.');
+    }
+
+    const gcs = getGcsInstance();
+    const bucket = gcs.bucket(getGcsBucket());
+    const [files] = await bucket.getFiles();
+
+    return files.map(({ name, metadata: { size } }) => {
+      return { name, size };
+    });
   };
 
   return lib;

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

@@ -127,12 +127,12 @@ module.exports = function(crowi) {
 
   /**
    * List files in storage
-   * TODO: implement
    */
   lib.listFiles = async() => {
-    return [
-      { filePath: '', fileSize: '' },
-    ];
+    const attachmentFiles = await AttachmentFile.find();
+    return attachmentFiles.map(({ filename: name, length: size }) => ({
+      name, size,
+    }));
   };
 
   return lib;

+ 21 - 4
packages/app/src/server/service/file-uploader/local.js

@@ -3,6 +3,7 @@ import loggerFactory from '~/utils/logger';
 const logger = loggerFactory('growi:service:fileUploaderLocal');
 
 const fs = require('fs');
+const fsPromises = require('fs/promises');
 const path = require('path');
 
 const mkdir = require('mkdirp');
@@ -29,6 +30,16 @@ module.exports = function(crowi) {
     return filePath;
   }
 
+  async function readdirRecursively(dirPath) {
+    const directories = await fsPromises.readdir(dirPath, { withFileTypes: true });
+    const files = await Promise.all(directories.map((directory) => {
+      const childDirPathOrFilePath = path.resolve(dirPath, directory.name);
+      return directory.isDirectory() ? readdirRecursively(childDirPathOrFilePath) : childDirPathOrFilePath;
+    }));
+
+    return files.flat();
+  }
+
   lib.isValidUploadSettings = function() {
     return true;
   };
@@ -129,12 +140,18 @@ module.exports = function(crowi) {
 
   /**
    * List files in storage
-   * TODO: implement
    */
   lib.listFiles = async() => {
-    return [
-      { filePath: '', fileSize: '' },
-    ];
+    await mkdir(basePath);
+    const filePaths = await readdirRecursively(basePath);
+    return Promise.all(
+      filePaths.map(
+        file => fsPromises.stat(file).then(({ size }) => ({
+          name: path.relative(basePath, file),
+          size,
+        })),
+      ),
+    );
   };
 
   return lib;