From 15f74ce29f19dc8f47610829b4b73d911d0e88b8 Mon Sep 17 00:00:00 2001 From: Aman Date: Fri, 29 Oct 2021 16:22:46 +0530 Subject: [PATCH 1/3] Added extensions parameter in upload API of javascript sdk --- README.md | 1 + package-lock.json | 2 +- package.json | 2 +- samples/sample-app/views/index.pug | 3 +- src/interfaces/UploadOptions.ts | 8 ++++ src/interfaces/UploadResponse.ts | 8 ++++ src/upload/index.ts | 13 ++++++- test/upload.js | 62 +++++++++++++++++++++++++++++- 8 files changed, 93 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 145887b..ebb5632 100644 --- a/README.md +++ b/README.md @@ -288,6 +288,7 @@ Sample usage file: file.files[0], fileName: "abc1.jpg", tags: ["tag1"] + extensions: [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}] }, function(err, result) { console.log(arguments); console.log(imagekit.url({ diff --git a/package-lock.json b/package-lock.json index bbb8b54..347e531 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "imagekit-javascript", - "version": "1.4.0", + "version": "1.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 47e78e5..889b6a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "imagekit-javascript", - "version": "1.4.1", + "version": "1.4.2", "description": "Javascript SDK for using ImageKit.io in the browser", "main": "dist/imagekit.cjs.js", "module": "dist/imagekit.esm.js", diff --git a/samples/sample-app/views/index.pug b/samples/sample-app/views/index.pug index e18bd7c..d37c1e1 100644 --- a/samples/sample-app/views/index.pug +++ b/samples/sample-app/views/index.pug @@ -37,7 +37,8 @@ html imagekit.upload({ file : file.files[0], fileName : file.files[0].name || "test_image.jpg", - tags : ["test_tag_1"] + tags : ["test_tag_1"], + extensions : [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}] }, function(err, result) { if (err) { statusEl.innerHTML = "Error uploading image. "+ err.message; diff --git a/src/interfaces/UploadOptions.ts b/src/interfaces/UploadOptions.ts index 396b6c0..5a9f7af 100644 --- a/src/interfaces/UploadOptions.ts +++ b/src/interfaces/UploadOptions.ts @@ -67,4 +67,12 @@ export interface UploadOptions { * For example, set the value of this field to tags,customCoordinates,isPrivateFile,metadata to get value of tags, customCoordinates, isPrivateFile , and metadata in the response. */ responseFields?: string; + /* + * Object with array of extensions to be processed on the image. + */ + extensions?: object[]; + /* + * Final status of pending extensions will be sent to this URL. + */ + webhookUrl?: string } diff --git a/src/interfaces/UploadResponse.ts b/src/interfaces/UploadResponse.ts index 6deaca1..e3e2f93 100644 --- a/src/interfaces/UploadResponse.ts +++ b/src/interfaces/UploadResponse.ts @@ -151,4 +151,12 @@ export interface UploadResponse { * The metadata of the upload file. Use responseFields property in request to get the metadata returned in response of upload API. */ metadata?: Metadata; + /* + * AITags field is populated only because the google-auto-tagging extension was executed synchronously and it received a successresponse. + */ + AITags?: object[]; + /* + * Field object which will contain the status of each extension at the time of completion of the update/upload request. + */ + extensionStatus?: { [key: string]: string } } diff --git a/src/upload/index.ts b/src/upload/index.ts index cf2f043..6c59d15 100644 --- a/src/upload/index.ts +++ b/src/upload/index.ts @@ -33,14 +33,23 @@ export const upload = ( return; } + if(uploadOptions.tags && Array.isArray(uploadOptions.tags)) + { + uploadOptions.tags = String(uploadOptions.tags); + } + var formData = new FormData(); let i: keyof typeof uploadOptions; for (i in uploadOptions) { const param = uploadOptions[i]; if (typeof param !== "undefined") { - if (typeof param === "string" || typeof param === "boolean") { + if (typeof param === "string" || typeof param === "boolean") { formData.append(i, String(param)); - } else { + } + else if(Array.isArray(param)) { + formData.append(i, JSON.stringify(param)); + } + else { formData.append(i, param); } } diff --git a/test/upload.js b/test/upload.js index fd0bc14..e765670 100644 --- a/test/upload.js +++ b/test/upload.js @@ -20,7 +20,9 @@ const uploadSuccessResponseObj = { "tags": ["t-shirt", "round-neck", "sale2019"], "isPrivateFile": false, "customCoordinates": null, - "fileType": "image" + "fileType": "image", + "AITags":[{"name":"Face","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Person","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Human","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Boy","confidence":87.6,"source":"aws-auto-tagging"},{"name":"Man","confidence":84.66,"source":"aws-auto-tagging"}], + "extensionStatus":{"aws-auto-tagging":"success"} }; function successSignature() { @@ -144,6 +146,22 @@ describe("File upload", function () { sinon.assert.calledWith(callback, { message: "Missing authentication endpoint for upload", help: "" }, null); }); + it('Missing public key', function(){ + const fileOptions = { + fileName: "test_file_name", + file: "test_file" + }; + + var callback = sinon.spy(); + + imagekit.upload(fileOptions, callback, { + publicKey : "" + }); + + expect(server.requests.length).to.be.equal(0); + sinon.assert.calledWith(callback, { message: "Missing public key for upload", help: "" }, null); + }); + it('Auth endpoint network error handling', function () { const fileOptions = { fileName: "test_file_name", @@ -336,6 +354,48 @@ describe("File upload", function () { sinon.assert.calledWith(callback, null, uploadSuccessResponseObj); }); + it('With extensions parameter', function(){ + const fileOptions = { + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions: [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}], + webhookUrl: "https://your-domain/?appId=some-id" + }; + var jsonStringifiedExtensions = JSON.stringify(fileOptions.extensions); + var callback = sinon.spy(); + + imagekit.upload(fileOptions, callback); + + expect(server.requests.length).to.be.equal(1); + successSignature(); + expect(server.requests.length).to.be.equal(2); + successUploadResponse(); + + var arg = server.requests[1].requestBody; + + expect(arg.get('file')).to.be.equal("test_file"); + expect(arg.get('fileName')).to.be.equal("test_file_name"); + expect(arg.get('token')).to.be.equal("test_token"); + expect(arg.get('expire')).to.be.equal("123"); + expect(arg.get('signature')).to.be.equal("test_signature"); + expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); + expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); + expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); + expect(arg.get('useUniqueFileName')).to.be.equal('false'); + expect(arg.get('isPrivateFile')).to.be.equal('true'); + expect(arg.get('publicKey')).to.be.equal('test_public_key'); + expect(arg.get('extensions')).to.be.equal(jsonStringifiedExtensions); + expect(arg.get('webhookUrl')).to.be.equal('https://your-domain/?appId=some-id') + + expect(callback.calledOnce).to.be.true; + sinon.assert.calledWith(callback, null, uploadSuccessResponseObj); + }); + it('Bare minimum request', function () { const fileOptions = { fileName: "test_file_name", From 6b993d1646622ac07b893d5eef0f1b62c09b2c0b Mon Sep 17 00:00:00 2001 From: Aman Date: Tue, 2 Nov 2021 11:04:29 +0530 Subject: [PATCH 2/3] Formatting changes --- samples/sample-app/views/index.pug | 8 +++++++- test/upload.js | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/samples/sample-app/views/index.pug b/samples/sample-app/views/index.pug index d37c1e1..2e56e84 100644 --- a/samples/sample-app/views/index.pug +++ b/samples/sample-app/views/index.pug @@ -38,7 +38,13 @@ html file : file.files[0], fileName : file.files[0].name || "test_image.jpg", tags : ["test_tag_1"], - extensions : [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}] + //- extensions: [ + //- { + //- name: "aws-auto-tagging", + //- minConfidence: 80, + //- maxTags: 10 + //- } + //- ], }, function(err, result) { if (err) { statusEl.innerHTML = "Error uploading image. "+ err.message; diff --git a/test/upload.js b/test/upload.js index e765670..65c794a 100644 --- a/test/upload.js +++ b/test/upload.js @@ -21,7 +21,7 @@ const uploadSuccessResponseObj = { "isPrivateFile": false, "customCoordinates": null, "fileType": "image", - "AITags":[{"name":"Face","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Person","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Human","confidence":99.95,"source":"aws-auto-tagging"},{"name":"Boy","confidence":87.6,"source":"aws-auto-tagging"},{"name":"Man","confidence":84.66,"source":"aws-auto-tagging"}], + "AITags":[{"name":"Face","confidence":99.95,"source":"aws-auto-tagging"}], "extensionStatus":{"aws-auto-tagging":"success"} }; @@ -363,7 +363,13 @@ describe("File upload", function () { responseFields: "tags, customCoordinates, isPrivateFile, metadata", useUniqueFileName: false, isPrivateFile: true, - extensions: [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}], + extensions: [ + { + name: "aws-auto-tagging", + minConfidence: 80, + maxTags: 10 + } + ], webhookUrl: "https://your-domain/?appId=some-id" }; var jsonStringifiedExtensions = JSON.stringify(fileOptions.extensions); From a27c0b601807b05284bc9b64a7ed01c490baa76d Mon Sep 17 00:00:00 2001 From: Aman Date: Tue, 2 Nov 2021 11:31:50 +0530 Subject: [PATCH 3/3] Formatting changes in Readme --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ebb5632..af96224 100644 --- a/README.md +++ b/README.md @@ -287,8 +287,14 @@ Sample usage imagekit.upload({ file: file.files[0], fileName: "abc1.jpg", - tags: ["tag1"] - extensions: [{name: "aws-auto-tagging", minConfidence: 80, maxTags: 10}] + tags: ["tag1"], + extensions: [ + { + name: "aws-auto-tagging", + minConfidence: 80, + maxTags: 10 + } + ] }, function(err, result) { console.log(arguments); console.log(imagekit.url({