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

Merge pull request #527 from transloadit/feature/result-values

core: Allow plugins to add data to result object
Artur Paikin 7 лет назад
Родитель
Сommit
0b4db1f756
4 измененных файлов с 63 добавлено и 35 удалено
  1. 31 4
      src/core/Core.js
  2. 23 30
      src/core/Core.test.js
  3. 8 1
      src/plugins/Transloadit/index.js
  4. 1 0
      src/plugins/Tus.js

+ 31 - 4
src/core/Core.js

@@ -6,7 +6,6 @@ const throttle = require('lodash.throttle')
 const prettyBytes = require('prettier-bytes')
 const match = require('mime-match')
 const DefaultStore = require('../store/DefaultStore')
-// const deepFreeze = require('deep-freeze-strict')
 
 /**
  * Uppy Core module.
@@ -970,7 +969,8 @@ class Uppy {
       currentUploads: Object.assign({}, this.getState().currentUploads, {
         [uploadID]: {
           fileIDs: fileIDs,
-          step: 0
+          step: 0,
+          result: {}
         }
       })
     })
@@ -978,6 +978,28 @@ class Uppy {
     return uploadID
   }
 
+  _getUpload (uploadID) {
+    return this.getState().currentUploads[uploadID]
+  }
+
+  /**
+   * Add data to an upload's result object.
+   *
+   * @param {string} uploadID The ID of the upload.
+   * @param {object} data Data properties to add to the result object.
+   */
+  addResultData (uploadID, data) {
+    const currentUploads = this.getState().currentUploads
+    const currentUpload = Object.assign({}, currentUploads[uploadID], {
+      result: Object.assign({}, currentUploads[uploadID].result, data)
+    })
+    this.setState({
+      currentUploads: Object.assign({}, currentUploads, {
+        [uploadID]: currentUpload
+      })
+    })
+  }
+
   /**
    * Remove an upload, eg. if it has been canceled or completed.
    *
@@ -1027,6 +1049,8 @@ class Uppy {
         // TODO give this the `currentUpload` object as its only parameter maybe?
         // Otherwise when more metadata may be added to the upload this would keep getting more parameters
         return fn(fileIDs, uploadID)
+      }).then((result) => {
+        return null
       })
     })
 
@@ -1042,14 +1066,17 @@ class Uppy {
       const files = fileIDs.map((fileID) => this.getFile(fileID))
       const successful = files.filter((file) => file && !file.error)
       const failed = files.filter((file) => file && file.error)
-      this.emit('complete', { successful, failed })
+      this.addResultData(uploadID, { successful, failed })
 
+      const { currentUploads } = this.getState()
+      const result = currentUploads[uploadID].result
+      this.emit('complete', result)
       // Compatibility with pre-0.21
       this.emit('success', fileIDs)
 
       this._removeUpload(uploadID)
 
-      return { successful, failed }
+      return result
     })
   }
 

+ 23 - 30
src/core/Core.test.js

@@ -270,6 +270,27 @@ describe('src/Core', () => {
     )
   })
 
+  describe('upload hooks', () => {
+    it('should add data returned from upload hooks to the .upload() result', () => {
+      const core = new Core()
+      core.addPreProcessor((fileIDs, uploadID) => {
+        core.addResultData(uploadID, { pre: 'ok' })
+      })
+      core.addPostProcessor((fileIDs, uploadID) => {
+        core.addResultData(uploadID, { post: 'ok' })
+      })
+      core.addUploader((fileIDs, uploadID) => {
+        core.addResultData(uploadID, { upload: 'ok' })
+      })
+      core.run()
+      return core.upload().then((result) => {
+        expect(result.pre).toBe('ok')
+        expect(result.upload).toBe('ok')
+        expect(result.post).toBe('ok')
+      })
+    })
+  })
+
   describe('preprocessors', () => {
     it('should add a preprocessor', () => {
       const core = new Core()
@@ -1128,39 +1149,11 @@ describe('src/Core', () => {
         const currentUploadsState = {}
         currentUploadsState[uploadId] = {
           fileIDs: Object.keys(core.state.files),
-          step: 0
+          step: 0,
+          result: {}
         }
         expect(core.state.currentUploads).toEqual(currentUploadsState)
       })
     })
   })
-
-  describe('removeUpload', () => {
-    it('should remove all files from the specified upload', () => {
-      // this uploader will run once the upload has started
-      const uploader = () => {
-        return Promise.resolve().then(() => {
-          const uploadId = Object.keys(core.state.currentUploads)[0]
-          expect(typeof core.state.currentUploads[uploadId]).toEqual('object')
-          expect(core.state.currentUploads[uploadId].fileIDs.length).toEqual(1)
-          core._removeUpload(uploadId)
-          expect(typeof core.state.currentUploads[uploadId]).toEqual('undefined')
-        })
-      }
-
-      const core = new Core()
-      core.run()
-      core.addUploader(uploader)
-      return core
-        .addFile({
-          source: 'jest',
-          name: 'foo.jpg',
-          type: 'image/jpeg',
-          data: utils.dataURItoFile(sampleImageDataURI, {})
-        })
-        .then(() => {
-          return core.upload(true)
-        })
-    })
-  })
 })

+ 8 - 1
src/plugins/Transloadit/index.js

@@ -613,12 +613,15 @@ module.exports = class Transloadit extends Plugin {
         const socket = this.sockets[assemblyID]
         socket.close()
       })
+      const assemblies = assemblyIDs.map((id) => this.getAssembly(id))
+      this.uppy.addResultData(uploadID, { transloadit: assemblies })
       return Promise.resolve()
     }
 
     // If no assemblies were created for this upload, we also do not have to wait.
     // There's also no sockets or anything to close, so just return immediately.
     if (assemblyIDs.length === 0) {
+      this.uppy.addResultData(uploadID, { transloadit: [] })
       return Promise.resolve()
     }
 
@@ -691,6 +694,8 @@ module.exports = class Transloadit extends Plugin {
         if (finishedAssemblies === assemblyIDs.length) {
           // We're done, these listeners can be removed
           removeListeners()
+          const assemblies = assemblyIDs.map((id) => this.getAssembly(id))
+          this.uppy.addResultData(uploadID, { transloadit: assemblies })
           resolve()
         }
       }
@@ -704,12 +709,14 @@ module.exports = class Transloadit extends Plugin {
       this.uppy.on('transloadit:complete', onAssemblyFinished)
       this.uppy.on('transloadit:assembly-error', onAssemblyError)
       this.uppy.on('transloadit:import-error', onImportError)
-    }).then(() => {
+    }).then((result) => {
       // Clean up uploadID → assemblyIDs, they're no longer going to be used anywhere.
       const state = this.getPluginState()
       const uploadsAssemblies = Object.assign({}, state.uploadsAssemblies)
       delete uploadsAssemblies[uploadID]
       this.setPluginState({ uploadsAssemblies })
+
+      return result
     })
   }
 

+ 1 - 0
src/plugins/Tus.js

@@ -421,6 +421,7 @@ module.exports = class Tus extends Plugin {
     const filesToUpload = fileIDs.map((fileID) => this.uppy.getFile(fileID))
 
     return this.uploadFiles(filesToUpload)
+      .then(() => null)
   }
 
   addResumableUploadsCapabilityFlag () {