Skip to content

Commit 1b8e2a0

Browse files
Merge pull request #623 from cloudinary/visual-search
feat: visual search api
2 parents 16854d4 + ee9ad78 commit 1b8e2a0

File tree

11 files changed

+122
-10
lines changed

11 files changed

+122
-10
lines changed

lib-es5/api.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ exports.update = function update(public_id, callback) {
183183
if (options.moderation_status != null) {
184184
params.moderation_status = options.moderation_status;
185185
}
186-
if (options.clear_invalid !== null) {
186+
if (options.clear_invalid != null) {
187187
params.clear_invalid = options.clear_invalid;
188188
}
189189
return call_api("post", uri, params, callback, options);
@@ -588,6 +588,13 @@ exports.search = function search(params, callback) {
588588
return call_api("post", "resources/search", params, callback, options);
589589
};
590590

591+
exports.visual_search = function visual_search(params, callback) {
592+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
593+
594+
var allowedParams = pickOnlyExistingValues(params, 'image_url', 'image_asset_id', 'text');
595+
return call_api('get', ['resources', 'visual_search'], allowedParams, callback, options);
596+
};
597+
591598
exports.search_folders = function search_folders(params, callback) {
592599
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
593600

lib-es5/utils/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,8 @@ function build_upload_params(options) {
388388
use_filename_as_display_name: utils.as_safe_bool(options.use_filename_as_display_name),
389389
quality_override: options.quality_override,
390390
accessibility_analysis: utils.as_safe_bool(options.accessibility_analysis),
391-
use_asset_folder_as_public_id_prefix: utils.as_safe_bool(options.use_asset_folder_as_public_id_prefix)
391+
use_asset_folder_as_public_id_prefix: utils.as_safe_bool(options.use_asset_folder_as_public_id_prefix),
392+
visual_search: utils.as_safe_bool(options.visual_search)
392393
};
393394
return utils.updateable_resource_params(options, params);
394395
}
@@ -747,6 +748,9 @@ function updateable_resource_params(options) {
747748
if (options.unique_display_name != null) {
748749
params.unique_display_name = options.unique_display_name;
749750
}
751+
if (options.visual_search != null) {
752+
params.visual_search = options.visual_search;
753+
}
750754
return params;
751755
}
752756

lib-es5/v2/api.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ v1_adapters(exports, api, {
5656
update_resources_access_mode_by_ids: 2,
5757
search: 1,
5858
search_folders: 1,
59+
visual_search: 1,
5960
delete_derived_by_transformation: 2,
6061
add_metadata_field: 1,
6162
list_metadata_fields: 1,

lib/api.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,11 @@ exports.search = function search(params, callback, options = {}) {
439439
return call_api("post", "resources/search", params, callback, options);
440440
};
441441

442+
exports.visual_search = function visual_search(params, callback, options = {}) {
443+
const allowedParams = pickOnlyExistingValues(params, 'image_url', 'image_asset_id', 'text');
444+
return call_api('get', ['resources', 'visual_search'], allowedParams, callback, options);
445+
};
446+
442447
exports.search_folders = function search_folders(params, callback, options = {}) {
443448
options.content_type = 'json';
444449
return call_api("post", "folders/search", params, callback, options);

lib/utils/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,8 @@ function build_upload_params(options) {
370370
use_filename_as_display_name: utils.as_safe_bool(options.use_filename_as_display_name),
371371
quality_override: options.quality_override,
372372
accessibility_analysis: utils.as_safe_bool(options.accessibility_analysis),
373-
use_asset_folder_as_public_id_prefix: utils.as_safe_bool(options.use_asset_folder_as_public_id_prefix)
373+
use_asset_folder_as_public_id_prefix: utils.as_safe_bool(options.use_asset_folder_as_public_id_prefix),
374+
visual_search: utils.as_safe_bool(options.visual_search)
374375
};
375376
return utils.updateable_resource_params(options, params);
376377
}
@@ -672,6 +673,9 @@ function updateable_resource_params(options, params = {}) {
672673
if (options.unique_display_name != null) {
673674
params.unique_display_name = options.unique_display_name;
674675
}
676+
if (options.visual_search != null) {
677+
params.visual_search = options.visual_search;
678+
}
675679
return params;
676680
}
677681

lib/v2/api.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ v1_adapters(exports, api, {
5454
update_resources_access_mode_by_ids: 2,
5555
search: 1,
5656
search_folders: 1,
57+
visual_search: 1,
5758
delete_derived_by_transformation: 2,
5859
add_metadata_field: 1,
5960
list_metadata_fields: 1,

test/integration/api/admin/api_spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,17 @@ describe("api", function () {
914914
}
915915
});
916916
});
917+
it('should support visual_search parameter', () => {
918+
this.timeout(TIMEOUT.LONG);
919+
return uploadImage()
920+
.then(upload_result => {
921+
return cloudinary.v2.api.update(upload_result.public_id, {
922+
visual_search: true
923+
});
924+
}).then(() => {
925+
sinon.assert.calledWith(writeSpy, sinon.match(/visual_search=true/));
926+
});
927+
});
917928
});
918929
describe("quality override", function () {
919930
const mocked = helper.mockTest();
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const helper = require('../../../spechelper');
2+
const cloudinary = require('../../../../cloudinary');
3+
const {
4+
strictEqual,
5+
deepStrictEqual
6+
} = require('assert');
7+
const {TEST_CLOUD_NAME} = require('../../../testUtils/testConstants');
8+
9+
describe('Visual search', () => {
10+
it('should pass the image_url parameter to the api call', () => {
11+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
12+
cloudinary.v2.api.visual_search({image_url: 'test-image-url'});
13+
14+
const [calledWithUrl] = requestSpy.firstCall.args;
15+
strictEqual(calledWithUrl.method, 'GET');
16+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/visual_search?image_url=test-image-url`);
17+
});
18+
});
19+
20+
it('should pass the image_url parameter to the api call', () => {
21+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
22+
cloudinary.v2.api.visual_search({image_asset_id: 'image-asset-id'});
23+
24+
const [calledWithUrl] = requestSpy.firstCall.args;
25+
strictEqual(calledWithUrl.method, 'GET');
26+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/visual_search?image_asset_id=image-asset-id`);
27+
});
28+
});
29+
30+
it('should pass the image_url parameter to the api call', () => {
31+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
32+
cloudinary.v2.api.visual_search({text: 'visual-search-input'});
33+
34+
const [calledWithUrl] = requestSpy.firstCall.args;
35+
strictEqual(calledWithUrl.method, 'GET');
36+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/visual_search?text=visual-search-input`);
37+
});
38+
});
39+
});

test/integration/api/uploader/uploader_spec.js

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,13 @@ describe("uploader", function () {
106106
expect(result.signature).to.eql(expected_signature);
107107
});
108108
});
109-
110-
111-
112109
it("should successfully override original_filename", function () {
113110
return cloudinary.v2.uploader.upload("http://cloudinary.com/images/old_logo.png", {
114111
filename_override: 'overridden'
115112
}).then((result) => {
116113
expect(result.original_filename).to.eql('overridden');
117114
});
118115
});
119-
120116
it("Should upload a valid docx file as base64", function () {
121117
let data = 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,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';
122118

@@ -125,7 +121,6 @@ describe("uploader", function () {
125121
tags: UPLOAD_TAGS
126122
});
127123
});
128-
129124
it('should allow upload with url safe base64 in overlay', function () {
130125
const overlayUrl = 'https://res.cloudinary.com/demo/image/upload/logos/cloudinary_full_logo_white_small.png';
131126
const baseImageUrl ='http://cloudinary.com/images/old_logo.png';
@@ -136,7 +131,6 @@ describe("uploader", function () {
136131
expect(result).to.have.key("created_at");
137132
});
138133
});
139-
140134
describe("remote urls ", function () {
141135
const mocked = helper.mockTest();
142136
it("should send s3:// URLs to server", function () {
@@ -158,7 +152,6 @@ describe("uploader", function () {
158152
sinon.assert.calledWith(mocked.write, sinon.match(helper.uploadParamMatcher('file', "ftp://example.com/1.jpg")));
159153
});
160154
});
161-
162155
describe("rename", function () {
163156
this.timeout(TIMEOUT.LONG);
164157
it("should successfully rename a file", function () {
@@ -634,6 +627,31 @@ describe("uploader", function () {
634627
expect(result).to.have.key("quality_analysis");
635628
});
636629
});
630+
631+
describe('when passing visual_search in parameters', () => {
632+
var spy, xhr;
633+
spy = void 0;
634+
xhr = void 0;
635+
before(function () {
636+
xhr = sinon.useFakeXMLHttpRequest();
637+
spy = sinon.spy(ClientRequest.prototype, 'write');
638+
});
639+
after(function () {
640+
spy.restore();
641+
return xhr.restore();
642+
});
643+
644+
it('should pass its value to the upload api', () => {
645+
cloudinary.v2.uploader.upload(IMAGE_FILE, {
646+
visual_search: true
647+
});
648+
649+
expect(spy.calledWith(sinon.match((arg) => {
650+
return arg.toString().match(/visual_search=true/);
651+
})));
652+
});
653+
});
654+
637655
describe("upload_chunked", function () {
638656
this.timeout(TIMEOUT.LONG * 10);
639657
it("should specify chunk size", function (done) {

types/cloudinary_ts_spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,21 @@ cloudinary.v2.api.search_folders("search input", function (error, result) {
540540
console.log(result);
541541
});
542542

543+
// $ExpectType Promise<any>
544+
cloudinary.v2.api.visual_search({image_url: 'image-url'}, function (error, result) {
545+
console.log(result);
546+
});
547+
548+
// $ExpectType Promise<any>
549+
cloudinary.v2.api.visual_search({image_asset_id: 'image-asset-id'}, function (error, result) {
550+
console.log(result);
551+
});
552+
553+
// $ExpectType Promise<any>
554+
cloudinary.v2.api.visual_search({text: 'visual-search-input'}, function (error, result) {
555+
console.log(result);
556+
});
557+
543558
// $ExpectType Promise<any>
544559
cloudinary.v2.api.transformation({width: 150, height: 100, crop: 'fill'},
545560
function (error, result) {

0 commit comments

Comments
 (0)