Skip to content

Commit

Permalink
Multipart upload feature added to the code
Browse files Browse the repository at this point in the history
  • Loading branch information
arao6 committed Sep 28, 2020
1 parent d12d5c9 commit b438759
Show file tree
Hide file tree
Showing 4 changed files with 483 additions and 50 deletions.
14 changes: 7 additions & 7 deletions src/Hyperwallet.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,24 +132,24 @@ export default class Hyperwallet {
}

/**
* Upload multipartform data to User
* Upload Documents to User
*
* @param {string} userToken - The user token
* @param {MultipartForm} data - The multipart form data to be uploaded
* @param {Object} data - JSON object of the data and files to be uploaded
* @param {api-callback} callback - The callback for this call
*
* @throws Will throw an error if userToken is not provided
*/
uploadDocumentUser(userToken, data, callback) {
uploadDocuments(userToken, data, callback) {
if (!userToken) {
throw new Error("userToken is required");
}
// eslint-disable-next-line no-param-reassign

this.client.doPutFormData(`users/${encodeURIComponent(userToken)}`, data, Hyperwallet.handle204Response(callback));
if (!data) {
throw new Error("Files for upload are required");
}
this.client.doPutMultipart(`users/${encodeURIComponent(userToken)}`, data, Hyperwallet.handle204Response(callback));
}


//--------------------------------------
// Prepaid Cards
//--------------------------------------
Expand Down
70 changes: 27 additions & 43 deletions src/utils/ApiClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ import request from "superagent";
import packageJson from "../../package.json";
import Encryption from "./Encryption";

var http = require('http');
var FormData = require('form-data');
var fs = require('fs');

/**
* The callback interface for api calls
*
Expand Down Expand Up @@ -110,56 +106,44 @@ export default class ApiClient {
}

/**
* Do a POST call to the Hyperwallet API server for multipart form data
* Do a PUT call to the Hyperwallet API server to upload documents
*
* @param {string} partialUrl - The api endpoint to call (gets prefixed by `server` and `/rest/v3/`)
* @param {Object} data - The data to send to the server
* @param {Object} params - Query parameters to send in this call
* @param {api-callback} callback - The callback for this call
*/
doPutFormData(partialUrl, data, callback) {
doPutMultipart(partialUrl, data, callback) {
let contentType = "multipart/form-data";
let accept = "multipart/form-data";
console.log("Hello api client");
// let requestDataPromise = new Promise((resolve) => resolve(data));
// if (this.isEncrypted) {
// contentType = "application/jose+json";
// accept = "application/jose+json";
// this.createJoseJsonParser();
// requestDataPromise = this.encryption.encrypt(data);
// }

var formData = {
my_field: 'my_value',
my_file: fs.createReadStream(data),
};

request.post({
url:`${this.server}/rest/v3/${partialUrl}`,
formData: formData},
function(err, httpResponse, body) {
if (err) {
return console.error('upload failed:', err);
}
console.log('Upload successful! Server responded with:', body);
});
// requestDataPromise.then((requestData) => {
// request
// .put(`${this.server}/rest/v3/${partialUrl}`)
// .auth(this.username, this.password)
// .set("User-Agent", `Hyperwallet Node SDK v${this.version}`)
// .type(contentType)
// .accept(accept)
// .query(params)
// .send(requestData)
// .end(this.wrapCallback("PUT", callback));
// }).catch(() => callback("Failed to encrypt body for PUT request", undefined, undefined));
let accept = "application/json";
/* eslint-disable no-unused-vars */
const keys = Object.keys(data); // eslint-disable-line @typescript-eslint/no-unused-vars
const values = Object.values(data);
/* eslint-enable no-unused-vars */
let requestDataPromise = new Promise((resolve) => resolve(data));
if (this.isEncrypted) {
contentType = "multipart/form-data";
accept = "application/jose+json";
this.createJoseJsonParser();
requestDataPromise = this.encryption.encrypt(data);
}
requestDataPromise.then(() => {
request
.put(`${this.server}/rest/v3/${partialUrl}`)
.auth(this.username, this.password)
.set("User-Agent", `Hyperwallet Node SDK v${this.version}`)
.type(contentType)
.accept(accept)
.field("data", JSON.stringify(values[0]))
.attach(JSON.stringify(keys[1]), values[1])
.attach(JSON.stringify(keys[2]), values[2])
.end(this.wrapCallback("PUT", callback));
}).catch((err) => callback(err, undefined, undefined));
}

/**
* Do a PUT call to the Hyperwallet API server
*
* @param {string} partialUrl - The api endpoint to call (gets prefixed by `server` and `/rest/v3/`)
* @param {string} partialUrl - The api endpoint to call (gets prefixed by server and /rest/v3/)
* @param {Object} data - The data to send to the server
* @param {Object} params - Query parameters to send in this call
* @param {api-callback} callback - The callback for this call
Expand Down
39 changes: 39 additions & 0 deletions test/Hyperwallet.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,45 @@ describe("Hyperwallet", () => {
});
});

describe("uploadDocuments()", () => {
let client;
let apiClientSpy;

beforeEach(() => {
apiClientSpy = sinon.spy();
client = new Hyperwallet({
username: "test-username",
password: "test-password",
});
client.client = {
doPutMultipart: apiClientSpy,
};
});

/** @test {Hyperwallet#uploadDocuments} */
it("should throw error if userToken is missing", () => {
const callback = () => null;
expect(() => client.uploadDocuments(undefined, {}, callback)).to.throw("userToken is required");
});

/** @test {Hyperwallet#uploadDocuments} */
it("should throw error if data is missing", () => {
const callback = () => null;
expect(() => client.uploadDocuments("test-user-token", undefined, callback)).to.throw("Files for upload are required");
});

/** @test {Hyperwallet#uploadDocuments} */
it("should do put call to upload multipart", () => {
const callback = () => null;

client.uploadDocuments("users/test-user-token", {
test: "value",
}, callback);

apiClientSpy.should.have.been.calledOnce();
});
});

//--------------------------------------
// Bank Cards
//--------------------------------------
Expand Down
Loading

0 comments on commit b438759

Please sign in to comment.