Przeglądaj źródła

WIP: implement '/attachment' route

Syunsuke Komma 3 lat temu
rodzic
commit
8861771077

+ 24 - 0
packages/app/src/server/routes/apiv3/g2g-transfer.ts

@@ -65,6 +65,10 @@ module.exports = (crowi: Crowi): Router => {
     },
   });
 
+  const uploadsForAttachment = multer({
+    storage: multer.memoryStorage(),
+  });
+
   const isInstalled = crowi.configManager?.getConfig('crowi', 'app:installed');
 
   const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
@@ -255,6 +259,26 @@ module.exports = (crowi: Crowi): Router => {
     return res.apiv3({ message: 'Successfully started to receive transfer data.' });
   });
 
+  // TODO: verify transfer key
+  receiveRouter.post('/attachment', uploadsForAttachment.single('content'), /* verifyAndExtractTransferKey, */
+    async(req: Request & { transferKey: TransferKey }, res: ApiV3Response) => {
+      const { file } = req;
+      const { attachmentMetadata } = req.body;
+
+      let attachmentMap;
+      try {
+        attachmentMap = JSON.parse(attachmentMetadata);
+      }
+      catch (err) {
+        logger.error(err);
+        return res.apiv3Err(new ErrorV3('Failed to parse body.', 'parse_failed'), 500);
+      }
+
+      await g2gTransferReceiverService.receiveAttachment(file.stream, attachmentMap);
+
+      return res.apiv3({ message: 'Successfully imported attached file.' });
+    });
+
   receiveRouter.get('/growi-info', verifyAndExtractTransferKey, async(req: Request & { transferKey: TransferKey }, res: ApiV3Response) => {
     let growiInfo: IDataGROWIInfo;
     try {

+ 12 - 7
packages/app/src/server/service/g2g-transfer.ts

@@ -129,15 +129,16 @@ export class G2GTransferPusherService implements Pusher {
         logger.warn(`Error occured when getting Attachment(ID=${attachment.id}), skipping: `, err);
         continue;
       }
+      // TODO: get attachmentLists from destination GROWI
       // TODO: refresh transfer key per 1 hour
       // post each attachment file data to receiver
       try {
         // Use FormData to immitate browser's form data object
         const form = new FormData();
 
-        form.append('fileContent', fileStream);
+        form.append('content', fileStream, attachment.fileName);
         form.append('attachmentMetadata', JSON.stringify(attachment));
-        await rawAxios.post('/_api/v3/g2g-attachment-transfer/', form, {
+        await rawAxios.post('/_api/v3/g2g-transfer/attachment', form, {
           baseURL: appUrl.origin,
           headers: {
             ...form.getHeaders(), // This generates a unique boundary for multi part form data
@@ -301,11 +302,15 @@ export class G2GTransferReceiverService implements Receiver {
     return;
   }
 
-  public async receiveAttachment(zipfile: Readable): Promise<void> {
-    // Import data
-    // Call onCompleteTransfer when finished
-
-    return;
+  /**
+   *
+   * @param content Pushed attachment data from source GROWI
+   * @param attachmentMap Map-ped Attachment instance
+   * @returns
+   */
+  public async receiveAttachment(content: Readable, attachmentMap): Promise<void> {
+    const { fileUploadService } = this.crowi;
+    return fileUploadService.uploadFile(content, attachmentMap);
   }
 
   /**