From 41a874afd7d0285d95ff4bec0d210a040a83b193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Drobn=C3=ADk?= Date: Tue, 24 Aug 2021 10:36:43 +0200 Subject: [PATCH 1/4] ci: add release on push into version branch (#203) --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b46ad57a..2b24ae5b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,7 @@ on: push: branches: - master + - version/** # A release via GitHub releases will deploy a latest version release: types: [ published ] From 5e10356e4ffbdf47b4ce23c3233d2b6715095983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Drobn=C3=ADk?= Date: Tue, 24 Aug 2021 10:59:20 +0200 Subject: [PATCH 2/4] feat: changed passing token using request HTTP header instead of the request parameter for every API calls (#184) feat: changed passing token using request HTTP header instead of the request parameter for every API call --- .github/workflows/release.yml | 2 ++ CHANGELOG.md | 4 ++++ package.json | 2 +- src/base/api_client.js | 13 ------------- src/base/resource_client.js | 6 ++---- src/base/resource_collection_client.js | 5 ++--- src/http_client.js | 7 +++++++ src/index.js | 7 ++----- src/resource_clients/actor.js | 8 ++++---- src/resource_clients/build.js | 1 - src/resource_clients/dataset.js | 7 +++---- src/resource_clients/key_value_store.js | 5 +---- src/resource_clients/log.js | 3 +-- src/resource_clients/request_queue.js | 17 ++++++++--------- src/resource_clients/run.js | 6 +++--- src/resource_clients/schedule.js | 1 - src/resource_clients/task.js | 6 ++---- src/resource_clients/webhook.js | 1 - test/_helper.js | 15 +++++++++------ test/actors.test.js | 6 +++--- test/builds.test.js | 6 +++--- test/datasets.test.js | 6 +++--- test/key_value_stores.test.js | 6 +++--- test/logs.test.js | 6 +++--- test/request_queues.test.js | 6 +++--- test/runs.test.js | 6 +++--- test/schedules.test.js | 6 +++--- test/tasks.test.js | 6 +++--- test/users.test.js | 6 +++--- test/webhook_dispatches.test.js | 6 +++--- test/webhooks.test.js | 6 +++--- 31 files changed, 87 insertions(+), 101 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b24ae5b..e8ce6194 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,8 @@ on: push: branches: - master + # This will allow releasing beta versions from non-master releases. + # TODO: We need to release this version with other tags than beta. It can mess up the beta version as it will override it with older code. - version/** # A release via GitHub releases will deploy a latest version release: diff --git a/CHANGELOG.md b/CHANGELOG.md index 76c7d10a..7e52f4a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +1.4.0 / 2021/08/24 +=================== +- Changed passing token using request HTTP header instead of the request parameter for every API calls + 1.3.0 / 2021/07/15 =================== - Added new method `.test()` to the `WebhookClient` class diff --git a/package.json b/package.json index c3c96c2a..f4da133c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apify-client", - "version": "1.3.0", + "version": "1.4.0", "description": "Apify API client for JavaScript", "main": "src/index.js", "keywords": [ diff --git a/src/base/api_client.js b/src/base/api_client.js index 30fac7d9..9c89ff87 100644 --- a/src/base/api_client.js +++ b/src/base/api_client.js @@ -6,7 +6,6 @@ * @property {ApifyClient} options.apifyClient * @property {HttpClient} options.httpClient * @property {string} [options.id] - * @property {object} [options.params] * @private */ @@ -24,7 +23,6 @@ class ApiClient { httpClient, resourcePath, id, - params = {}, } = options; this.id = id; @@ -36,7 +34,6 @@ class ApiClient { : `${baseUrl}/${resourcePath}`; this.apifyClient = apifyClient; this.httpClient = httpClient; - this.params = params; } /** @@ -49,7 +46,6 @@ class ApiClient { baseUrl: this._url(), apifyClient: this.apifyClient, httpClient: this.httpClient, - params: this._params(), }; return { ...baseOptions, ...moreOptions }; } @@ -63,15 +59,6 @@ class ApiClient { return path ? `${this.url}/${path}` : this.url; } - /** - * @param {object} [endpointParams] - * @returns {object} - * @private - */ - _params(endpointParams) { - return { ...this.params, ...endpointParams }; - } - /** * @param {string} id * @return {string} diff --git a/src/base/resource_client.js b/src/base/resource_client.js index 6355d50e..34fb0d2f 100644 --- a/src/base/resource_client.js +++ b/src/base/resource_client.js @@ -30,7 +30,7 @@ class ResourceClient extends ApiClient { const requestOpts = { url: this._url(), method: 'GET', - params: this._params(options), + params: { ...options }, }; try { const response = await this.httpClient.call(requestOpts); @@ -48,7 +48,6 @@ class ResourceClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'PUT', - params: this._params(), data: newFields, }); return parseDateFields(pluckData(response.data)); @@ -63,7 +62,6 @@ class ResourceClient extends ApiClient { await this.httpClient.call({ url: this._url(), method: 'DELETE', - params: this._params(), }); } catch (err) { return catchNotFoundOrThrow(err); @@ -102,7 +100,7 @@ class ResourceClient extends ApiClient { const requestOpts = { url: this._url(), method: 'GET', - params: this._params({ waitForFinish }), + params: { waitForFinish }, }; try { const response = await this.httpClient.call(requestOpts); diff --git a/src/base/resource_collection_client.js b/src/base/resource_collection_client.js index 2389183c..2c63e815 100644 --- a/src/base/resource_collection_client.js +++ b/src/base/resource_collection_client.js @@ -19,7 +19,7 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'GET', - params: this._params(options), + params: options, }); return parseDateFields(pluckData(response.data)); } @@ -33,7 +33,6 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'POST', - params: this._params(), data: resource, }); return parseDateFields(pluckData(response.data)); @@ -52,7 +51,7 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'POST', - params: this._params({ name }), + params: { name }, }); return parseDateFields(pluckData(response.data)); } diff --git a/src/http_client.js b/src/http_client.js index f391008c..2f2d5426 100644 --- a/src/http_client.js +++ b/src/http_client.js @@ -24,8 +24,10 @@ class HttpClient { * @param {function[]} options.requestInterceptors * @param {number} options.timeoutSecs * @param {object} options.logger + * @param {string} [options.token] */ constructor(options) { + const { token } = options; this.stats = options.apifyClientStats; this.maxRetries = options.maxRetries; this.minDelayBetwenRetriesMillis = options.minDelayBetweenRetriesMillis; @@ -88,6 +90,11 @@ class HttpClient { this.axios.defaults.headers['User-Agent'] = userAgent; } + // Attach Authorization header for all requests if token was provided + if (token) { + this.axios.defaults.headers.Authorization = `Bearer ${token}`; + } + requestInterceptors.forEach((i) => this.axios.interceptors.request.use(i)); this.userProvidedRequestInterceptors.forEach((i) => this.axios.interceptors.request.use(i)); responseInterceptors.forEach((i) => this.axios.interceptors.response.use(i)); diff --git a/src/index.js b/src/index.js index 2ee8c0fd..5db0aed1 100644 --- a/src/index.js +++ b/src/index.js @@ -62,7 +62,6 @@ class ApifyClient { const tempBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, baseUrl.length - 1) : baseUrl; this.baseUrl = `${tempBaseUrl}/v2`; - this.token = token; this.stats = new Statistics(); this.logger = logger.child({ prefix: 'ApifyClient' }); this.httpClient = new HttpClient({ @@ -72,11 +71,12 @@ class ApifyClient { requestInterceptors, timeoutSecs, logger: this.logger, + token, }); } /** - * @return {{httpClient: HttpClient, apifyClient: ApifyClient, baseUrl: string, params: {token: string}}} + * @return {{httpClient: HttpClient, apifyClient: ApifyClient, baseUrl: string}} * @private */ _options() { @@ -84,9 +84,6 @@ class ApifyClient { baseUrl: this.baseUrl, apifyClient: this, httpClient: this.httpClient, - params: { - token: this.token, - }, }; } diff --git a/src/resource_clients/actor.js b/src/resource_clients/actor.js index a9846aa8..eb9452f5 100644 --- a/src/resource_clients/actor.js +++ b/src/resource_clients/actor.js @@ -91,7 +91,7 @@ class ActorClient extends ResourceClient { url: this._url('runs'), method: 'POST', data: input, - params: this._params(params), + params, // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -162,10 +162,10 @@ class ActorClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('builds'), method: 'POST', - params: this._params({ + params: { version: versionNumber, ...options, - }), + }, }); return parseDateFields(pluckData(response.data)); @@ -184,7 +184,7 @@ class ActorClient extends ResourceClient { return new RunClient(this._subResourceOptions({ id: 'last', - params: this._params(options), + params: options, resourcePath: 'runs', })); } diff --git a/src/resource_clients/build.js b/src/resource_clients/build.js index 04f1a3cb..6930693f 100644 --- a/src/resource_clients/build.js +++ b/src/resource_clients/build.js @@ -40,7 +40,6 @@ class BuildClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('abort'), method: 'POST', - params: this._params(), }); return parseDateFields(pluckData(response.data)); diff --git a/src/resource_clients/dataset.js b/src/resource_clients/dataset.js index 51dc2be5..fb3fa90b 100644 --- a/src/resource_clients/dataset.js +++ b/src/resource_clients/dataset.js @@ -71,7 +71,7 @@ class DatasetClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('items'), method: 'GET', - params: this._params(options), + params: options, }); return this._createPaginationList(response); } @@ -123,10 +123,10 @@ class DatasetClient extends ResourceClient { const { data } = await this.httpClient.call({ url: this._url('items'), method: 'GET', - params: this._params({ + params: { format, ...options, - }), + }, forceBuffer: true, }); return data; @@ -151,7 +151,6 @@ class DatasetClient extends ResourceClient { 'content-type': 'application/json; charset=utf-8', }, data: items, - params: this._params(), doNotRetryTimeouts: true, // see timeout handling in http-client }); } diff --git a/src/resource_clients/key_value_store.js b/src/resource_clients/key_value_store.js index 5b9093fc..ff72ed66 100644 --- a/src/resource_clients/key_value_store.js +++ b/src/resource_clients/key_value_store.js @@ -64,7 +64,7 @@ class KeyValueStoreClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('keys'), method: 'GET', - params: this._params(options), + params: options, }); return parseDateFields(pluckData(response.data)); } @@ -102,7 +102,6 @@ class KeyValueStoreClient extends ResourceClient { const requestOpts = { url: this._url(`records/${key}`), method: 'GET', - params: this._params(), }; if (options.buffer) requestOpts.forceBuffer = true; @@ -156,7 +155,6 @@ class KeyValueStoreClient extends ResourceClient { const uploadOpts = { url: this._url(`records/${key}`), method: 'PUT', - params: this._params(), data: value, headers: contentType && { 'content-type': contentType }, }; @@ -175,7 +173,6 @@ class KeyValueStoreClient extends ResourceClient { await this.httpClient.call({ url: this._url(`records/${key}`), method: 'DELETE', - params: this._params(), }); } } diff --git a/src/resource_clients/log.js b/src/resource_clients/log.js index a653e5fd..37df36b9 100644 --- a/src/resource_clients/log.js +++ b/src/resource_clients/log.js @@ -25,7 +25,6 @@ class LogClient extends ResourceClient { const requestOpts = { url: this._url(), method: 'GET', - params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -48,7 +47,7 @@ class LogClient extends ResourceClient { const requestOpts = { url: this._url(), method: 'GET', - params: this._params(params), + params, responseType: 'stream', }; diff --git a/src/resource_clients/request_queue.js b/src/resource_clients/request_queue.js index 0cb96f5a..8a53b9c2 100644 --- a/src/resource_clients/request_queue.js +++ b/src/resource_clients/request_queue.js @@ -62,10 +62,10 @@ class RequestQueueClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('head'), method: 'GET', - params: this._params({ + params: { limit: options.limit, clientKey: this.clientKey, - }), + }, }); return parseDateFields(pluckData(response.data)); } @@ -89,10 +89,10 @@ class RequestQueueClient extends ResourceClient { url: this._url('requests'), method: 'POST', data: request, - params: this._params({ + params: { forefront: options.forefront, clientKey: this.clientKey, - }), + }, }); return parseDateFields(pluckData(response.data)); } @@ -107,7 +107,6 @@ class RequestQueueClient extends ResourceClient { const requestOpts = { url: this._url(`requests/${id}`), method: 'GET', - params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -136,10 +135,10 @@ class RequestQueueClient extends ResourceClient { url: this._url(`requests/${request.id}`), method: 'PUT', data: request, - params: this._params({ + params: { forefront: options.forefront, clientKey: this.clientKey, - }), + }, }); return parseDateFields(pluckData(response.data)); } @@ -153,9 +152,9 @@ class RequestQueueClient extends ResourceClient { await this.httpClient.call({ url: this._url(`requests/${id}`), method: 'DELETE', - params: this._params({ + params: { clientKey: this.clientKey, - }), + }, }); } } diff --git a/src/resource_clients/run.js b/src/resource_clients/run.js index 4fb726ea..2827fc78 100644 --- a/src/resource_clients/run.js +++ b/src/resource_clients/run.js @@ -49,7 +49,7 @@ class RunClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('abort'), method: 'POST', - params: this._params(options), + params: options, }); return parseDateFields(pluckData(response.data)); @@ -83,7 +83,7 @@ class RunClient extends ResourceClient { url: this._url('metamorph'), method: 'POST', data: input, - params: this._params(params), + params, // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -116,7 +116,7 @@ class RunClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('resurrect'), method: 'POST', - params: this._params(options), + params: options, }); return parseDateFields(pluckData(response.data)); diff --git a/src/resource_clients/schedule.js b/src/resource_clients/schedule.js index 5b369e5d..2c9ddf0b 100644 --- a/src/resource_clients/schedule.js +++ b/src/resource_clients/schedule.js @@ -54,7 +54,6 @@ class ScheduleClient extends ResourceClient { const requestOpts = { url: this._url('log'), method: 'GET', - params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); diff --git a/src/resource_clients/task.js b/src/resource_clients/task.js index e23c5e10..24edfe67 100644 --- a/src/resource_clients/task.js +++ b/src/resource_clients/task.js @@ -87,7 +87,7 @@ class TaskClient extends ResourceClient { url: this._url('runs'), method: 'POST', data: input, - params: this._params(params), + params, // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -138,7 +138,6 @@ class TaskClient extends ResourceClient { const requestOpts = { url: this._url('input'), method: 'GET', - params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -156,7 +155,6 @@ class TaskClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('input'), method: 'PUT', - params: this._params(), data: newFields, }); return response.data; @@ -175,7 +173,7 @@ class TaskClient extends ResourceClient { return new RunClient(this._subResourceOptions({ id: 'last', - params: this._params(options), + params: options, resourcePath: 'runs', })); } diff --git a/src/resource_clients/webhook.js b/src/resource_clients/webhook.js index 70e23413..ba77be5d 100644 --- a/src/resource_clients/webhook.js +++ b/src/resource_clients/webhook.js @@ -55,7 +55,6 @@ class WebhookClient extends ResourceClient { const request = { url: this._url('test'), method: 'POST', - params: this._params(), }; try { diff --git a/test/_helper.js b/test/_helper.js index b13d8f4d..664940e9 100644 --- a/test/_helper.js +++ b/test/_helper.js @@ -9,7 +9,7 @@ class Browser { return this.browser; } - async getInjectedPage(baseUrl, DEFAULT_QUERY) { + async getInjectedPage(baseUrl, DEFAULT_OPTIONS) { const page = await this.browser.newPage(); await Apify.utils.puppeteer.injectFile(page, `${__dirname}/../dist/bundle.js`); @@ -20,7 +20,7 @@ class Browser { maxRetries: 0, ...defaultQuery, }); - }, baseUrl, DEFAULT_QUERY); + }, baseUrl, DEFAULT_OPTIONS); return page; } @@ -29,14 +29,13 @@ class Browser { } } -const DEFAULT_QUERY = { +const DEFAULT_OPTIONS = { token: 'default-token', }; const getExpectedQuery = (callQuery = {}) => { const query = optsToQuery(callQuery); return { - ...DEFAULT_QUERY, ...query, }; }; @@ -57,7 +56,11 @@ function optsToQuery(params) { }, {}); } -const validateRequest = (query = {}, params = {}, body = {}, headers = {}) => { +const validateRequest = (query = {}, params = {}, body = {}, additionalHeaders = {}) => { + const headers = { + authorization: `Bearer ${DEFAULT_OPTIONS.token}`, + ...additionalHeaders, + }; const request = mockServer.getLastRequest(); const expectedQuery = getExpectedQuery(query); if (query !== false) expect(request.query).toEqual(expectedQuery); @@ -74,6 +77,6 @@ const validateRequest = (query = {}, params = {}, body = {}, headers = {}) => { module.exports = { validateRequest, - DEFAULT_QUERY, + DEFAULT_OPTIONS, Browser, }; diff --git a/test/actors.test.js b/test/actors.test.js index ec310604..9bb4754a 100644 --- a/test/actors.test.js +++ b/test/actors.test.js @@ -1,7 +1,7 @@ const ApifyClient = require('../src'); const { stringifyWebhooksToBase64 } = require('../src/utils'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Actor methods', () => { let baseUrl; @@ -23,11 +23,11 @@ describe('Actor methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/builds.test.js b/test/builds.test.js index 90a9c5dc..8e508907 100644 --- a/test/builds.test.js +++ b/test/builds.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Build methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Build methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/datasets.test.js b/test/datasets.test.js index 8e3e360b..697a3b2b 100644 --- a/test/datasets.test.js +++ b/test/datasets.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Dataset methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Dataset methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/key_value_stores.test.js b/test/key_value_stores.test.js index 3886aaf0..965ff767 100644 --- a/test/key_value_stores.test.js +++ b/test/key_value_stores.test.js @@ -1,7 +1,7 @@ const { Readable } = require('stream'); const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Key-Value Store methods', () => { let baseUrl; @@ -23,11 +23,11 @@ describe('Key-Value Store methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/logs.test.js b/test/logs.test.js index fe7edfe3..a07bf070 100644 --- a/test/logs.test.js +++ b/test/logs.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Log methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Log methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/request_queues.test.js b/test/request_queues.test.js index ffe85914..c26c7c30 100644 --- a/test/request_queues.test.js +++ b/test/request_queues.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Request Queue methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Request Queue methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/runs.test.js b/test/runs.test.js index 4b0fc55c..fedc404a 100644 --- a/test/runs.test.js +++ b/test/runs.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Run methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Run methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/schedules.test.js b/test/schedules.test.js index 928c548d..bf2155f6 100644 --- a/test/schedules.test.js +++ b/test/schedules.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Schedule methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Schedule methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/tasks.test.js b/test/tasks.test.js index 9723f8f6..2cdc6da2 100644 --- a/test/tasks.test.js +++ b/test/tasks.test.js @@ -1,7 +1,7 @@ const ApifyClient = require('../src'); const { stringifyWebhooksToBase64 } = require('../src/utils'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Task methods', () => { let baseUrl; @@ -23,11 +23,11 @@ describe('Task methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/users.test.js b/test/users.test.js index 8c76712c..227c0f75 100644 --- a/test/users.test.js +++ b/test/users.test.js @@ -1,7 +1,7 @@ const { ME_USER_NAME_PLACEHOLDER } = require('@apify/consts'); const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('User methods', () => { let baseUrl; @@ -23,11 +23,11 @@ describe('User methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/webhook_dispatches.test.js b/test/webhook_dispatches.test.js index a97f59bd..19fa4bbd 100644 --- a/test/webhook_dispatches.test.js +++ b/test/webhook_dispatches.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Webhook Dispatch methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Webhook Dispatch methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { diff --git a/test/webhooks.test.js b/test/webhooks.test.js index ba58a3b9..855caa06 100644 --- a/test/webhooks.test.js +++ b/test/webhooks.test.js @@ -1,6 +1,6 @@ const ApifyClient = require('../src'); const mockServer = require('./mock_server/server'); -const { Browser, validateRequest, DEFAULT_QUERY } = require('./_helper'); +const { Browser, validateRequest, DEFAULT_OPTIONS } = require('./_helper'); describe('Webhook methods', () => { let baseUrl; @@ -22,11 +22,11 @@ describe('Webhook methods', () => { let client; let page; beforeEach(async () => { - page = await browser.getInjectedPage(baseUrl, DEFAULT_QUERY); + page = await browser.getInjectedPage(baseUrl, DEFAULT_OPTIONS); client = new ApifyClient({ baseUrl, maxRetries: 0, - ...DEFAULT_QUERY, + ...DEFAULT_OPTIONS, }); }); afterEach(async () => { From 72eb457d1006ccd3b0df5b823e8e071653df2102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Drobn=C3=ADk?= Date: Tue, 24 Aug 2021 15:17:34 +0200 Subject: [PATCH 3/4] fix: revert back passing params using ApifyClient _params method (#204) This reverts commit c766a50 --- src/base/api_client.js | 13 +++++++++++++ src/base/resource_client.js | 6 ++++-- src/base/resource_collection_client.js | 5 +++-- src/resource_clients/actor.js | 8 ++++---- src/resource_clients/build.js | 1 + src/resource_clients/dataset.js | 7 ++++--- src/resource_clients/key_value_store.js | 5 ++++- src/resource_clients/log.js | 3 ++- src/resource_clients/request_queue.js | 17 +++++++++-------- src/resource_clients/run.js | 6 +++--- src/resource_clients/schedule.js | 1 + src/resource_clients/task.js | 6 ++++-- src/resource_clients/webhook.js | 1 + test/actors.test.js | 5 +++-- 14 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/base/api_client.js b/src/base/api_client.js index 9c89ff87..30fac7d9 100644 --- a/src/base/api_client.js +++ b/src/base/api_client.js @@ -6,6 +6,7 @@ * @property {ApifyClient} options.apifyClient * @property {HttpClient} options.httpClient * @property {string} [options.id] + * @property {object} [options.params] * @private */ @@ -23,6 +24,7 @@ class ApiClient { httpClient, resourcePath, id, + params = {}, } = options; this.id = id; @@ -34,6 +36,7 @@ class ApiClient { : `${baseUrl}/${resourcePath}`; this.apifyClient = apifyClient; this.httpClient = httpClient; + this.params = params; } /** @@ -46,6 +49,7 @@ class ApiClient { baseUrl: this._url(), apifyClient: this.apifyClient, httpClient: this.httpClient, + params: this._params(), }; return { ...baseOptions, ...moreOptions }; } @@ -59,6 +63,15 @@ class ApiClient { return path ? `${this.url}/${path}` : this.url; } + /** + * @param {object} [endpointParams] + * @returns {object} + * @private + */ + _params(endpointParams) { + return { ...this.params, ...endpointParams }; + } + /** * @param {string} id * @return {string} diff --git a/src/base/resource_client.js b/src/base/resource_client.js index 34fb0d2f..6355d50e 100644 --- a/src/base/resource_client.js +++ b/src/base/resource_client.js @@ -30,7 +30,7 @@ class ResourceClient extends ApiClient { const requestOpts = { url: this._url(), method: 'GET', - params: { ...options }, + params: this._params(options), }; try { const response = await this.httpClient.call(requestOpts); @@ -48,6 +48,7 @@ class ResourceClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'PUT', + params: this._params(), data: newFields, }); return parseDateFields(pluckData(response.data)); @@ -62,6 +63,7 @@ class ResourceClient extends ApiClient { await this.httpClient.call({ url: this._url(), method: 'DELETE', + params: this._params(), }); } catch (err) { return catchNotFoundOrThrow(err); @@ -100,7 +102,7 @@ class ResourceClient extends ApiClient { const requestOpts = { url: this._url(), method: 'GET', - params: { waitForFinish }, + params: this._params({ waitForFinish }), }; try { const response = await this.httpClient.call(requestOpts); diff --git a/src/base/resource_collection_client.js b/src/base/resource_collection_client.js index 2c63e815..2389183c 100644 --- a/src/base/resource_collection_client.js +++ b/src/base/resource_collection_client.js @@ -19,7 +19,7 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'GET', - params: options, + params: this._params(options), }); return parseDateFields(pluckData(response.data)); } @@ -33,6 +33,7 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'POST', + params: this._params(), data: resource, }); return parseDateFields(pluckData(response.data)); @@ -51,7 +52,7 @@ class ResourceCollectionClient extends ApiClient { const response = await this.httpClient.call({ url: this._url(), method: 'POST', - params: { name }, + params: this._params({ name }), }); return parseDateFields(pluckData(response.data)); } diff --git a/src/resource_clients/actor.js b/src/resource_clients/actor.js index eb9452f5..a9846aa8 100644 --- a/src/resource_clients/actor.js +++ b/src/resource_clients/actor.js @@ -91,7 +91,7 @@ class ActorClient extends ResourceClient { url: this._url('runs'), method: 'POST', data: input, - params, + params: this._params(params), // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -162,10 +162,10 @@ class ActorClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('builds'), method: 'POST', - params: { + params: this._params({ version: versionNumber, ...options, - }, + }), }); return parseDateFields(pluckData(response.data)); @@ -184,7 +184,7 @@ class ActorClient extends ResourceClient { return new RunClient(this._subResourceOptions({ id: 'last', - params: options, + params: this._params(options), resourcePath: 'runs', })); } diff --git a/src/resource_clients/build.js b/src/resource_clients/build.js index 6930693f..04f1a3cb 100644 --- a/src/resource_clients/build.js +++ b/src/resource_clients/build.js @@ -40,6 +40,7 @@ class BuildClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('abort'), method: 'POST', + params: this._params(), }); return parseDateFields(pluckData(response.data)); diff --git a/src/resource_clients/dataset.js b/src/resource_clients/dataset.js index fb3fa90b..51dc2be5 100644 --- a/src/resource_clients/dataset.js +++ b/src/resource_clients/dataset.js @@ -71,7 +71,7 @@ class DatasetClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('items'), method: 'GET', - params: options, + params: this._params(options), }); return this._createPaginationList(response); } @@ -123,10 +123,10 @@ class DatasetClient extends ResourceClient { const { data } = await this.httpClient.call({ url: this._url('items'), method: 'GET', - params: { + params: this._params({ format, ...options, - }, + }), forceBuffer: true, }); return data; @@ -151,6 +151,7 @@ class DatasetClient extends ResourceClient { 'content-type': 'application/json; charset=utf-8', }, data: items, + params: this._params(), doNotRetryTimeouts: true, // see timeout handling in http-client }); } diff --git a/src/resource_clients/key_value_store.js b/src/resource_clients/key_value_store.js index ff72ed66..5b9093fc 100644 --- a/src/resource_clients/key_value_store.js +++ b/src/resource_clients/key_value_store.js @@ -64,7 +64,7 @@ class KeyValueStoreClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('keys'), method: 'GET', - params: options, + params: this._params(options), }); return parseDateFields(pluckData(response.data)); } @@ -102,6 +102,7 @@ class KeyValueStoreClient extends ResourceClient { const requestOpts = { url: this._url(`records/${key}`), method: 'GET', + params: this._params(), }; if (options.buffer) requestOpts.forceBuffer = true; @@ -155,6 +156,7 @@ class KeyValueStoreClient extends ResourceClient { const uploadOpts = { url: this._url(`records/${key}`), method: 'PUT', + params: this._params(), data: value, headers: contentType && { 'content-type': contentType }, }; @@ -173,6 +175,7 @@ class KeyValueStoreClient extends ResourceClient { await this.httpClient.call({ url: this._url(`records/${key}`), method: 'DELETE', + params: this._params(), }); } } diff --git a/src/resource_clients/log.js b/src/resource_clients/log.js index 37df36b9..a653e5fd 100644 --- a/src/resource_clients/log.js +++ b/src/resource_clients/log.js @@ -25,6 +25,7 @@ class LogClient extends ResourceClient { const requestOpts = { url: this._url(), method: 'GET', + params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -47,7 +48,7 @@ class LogClient extends ResourceClient { const requestOpts = { url: this._url(), method: 'GET', - params, + params: this._params(params), responseType: 'stream', }; diff --git a/src/resource_clients/request_queue.js b/src/resource_clients/request_queue.js index 8a53b9c2..0cb96f5a 100644 --- a/src/resource_clients/request_queue.js +++ b/src/resource_clients/request_queue.js @@ -62,10 +62,10 @@ class RequestQueueClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('head'), method: 'GET', - params: { + params: this._params({ limit: options.limit, clientKey: this.clientKey, - }, + }), }); return parseDateFields(pluckData(response.data)); } @@ -89,10 +89,10 @@ class RequestQueueClient extends ResourceClient { url: this._url('requests'), method: 'POST', data: request, - params: { + params: this._params({ forefront: options.forefront, clientKey: this.clientKey, - }, + }), }); return parseDateFields(pluckData(response.data)); } @@ -107,6 +107,7 @@ class RequestQueueClient extends ResourceClient { const requestOpts = { url: this._url(`requests/${id}`), method: 'GET', + params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -135,10 +136,10 @@ class RequestQueueClient extends ResourceClient { url: this._url(`requests/${request.id}`), method: 'PUT', data: request, - params: { + params: this._params({ forefront: options.forefront, clientKey: this.clientKey, - }, + }), }); return parseDateFields(pluckData(response.data)); } @@ -152,9 +153,9 @@ class RequestQueueClient extends ResourceClient { await this.httpClient.call({ url: this._url(`requests/${id}`), method: 'DELETE', - params: { + params: this._params({ clientKey: this.clientKey, - }, + }), }); } } diff --git a/src/resource_clients/run.js b/src/resource_clients/run.js index 2827fc78..4fb726ea 100644 --- a/src/resource_clients/run.js +++ b/src/resource_clients/run.js @@ -49,7 +49,7 @@ class RunClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('abort'), method: 'POST', - params: options, + params: this._params(options), }); return parseDateFields(pluckData(response.data)); @@ -83,7 +83,7 @@ class RunClient extends ResourceClient { url: this._url('metamorph'), method: 'POST', data: input, - params, + params: this._params(params), // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -116,7 +116,7 @@ class RunClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('resurrect'), method: 'POST', - params: options, + params: this._params(options), }); return parseDateFields(pluckData(response.data)); diff --git a/src/resource_clients/schedule.js b/src/resource_clients/schedule.js index 2c9ddf0b..5b369e5d 100644 --- a/src/resource_clients/schedule.js +++ b/src/resource_clients/schedule.js @@ -54,6 +54,7 @@ class ScheduleClient extends ResourceClient { const requestOpts = { url: this._url('log'), method: 'GET', + params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); diff --git a/src/resource_clients/task.js b/src/resource_clients/task.js index 24edfe67..e23c5e10 100644 --- a/src/resource_clients/task.js +++ b/src/resource_clients/task.js @@ -87,7 +87,7 @@ class TaskClient extends ResourceClient { url: this._url('runs'), method: 'POST', data: input, - params, + params: this._params(params), // Apify internal property. Tells the request serialization interceptor // to stringify functions to JSON, instead of omitting them. stringifyFunctions: true, @@ -138,6 +138,7 @@ class TaskClient extends ResourceClient { const requestOpts = { url: this._url('input'), method: 'GET', + params: this._params(), }; try { const response = await this.httpClient.call(requestOpts); @@ -155,6 +156,7 @@ class TaskClient extends ResourceClient { const response = await this.httpClient.call({ url: this._url('input'), method: 'PUT', + params: this._params(), data: newFields, }); return response.data; @@ -173,7 +175,7 @@ class TaskClient extends ResourceClient { return new RunClient(this._subResourceOptions({ id: 'last', - params: options, + params: this._params(options), resourcePath: 'runs', })); } diff --git a/src/resource_clients/webhook.js b/src/resource_clients/webhook.js index ba77be5d..70e23413 100644 --- a/src/resource_clients/webhook.js +++ b/src/resource_clients/webhook.js @@ -55,6 +55,7 @@ class WebhookClient extends ResourceClient { const request = { url: this._url('test'), method: 'POST', + params: this._params(), }; try { diff --git a/test/actors.test.js b/test/actors.test.js index 9bb4754a..e41dd743 100644 --- a/test/actors.test.js +++ b/test/actors.test.js @@ -273,8 +273,9 @@ describe('Actor methods', () => { 'log', ])('%s() works', async (method) => { const actorId = 'some-actor-id'; + const requestedStatus = 'SUCCEEDED'; - const lastRunClient = client.actor(actorId).lastRun(); + const lastRunClient = client.actor(actorId).lastRun({ status: requestedStatus }); const res = method === 'get' ? await lastRunClient.get() : await lastRunClient[method]().get(); @@ -284,7 +285,7 @@ describe('Actor methods', () => { } else { expect(res.id).toEqual(`last-run-${method}`); } - validateRequest({}, { actorId }); + validateRequest({ status: requestedStatus }, { actorId }); const browserRes = await page.evaluate((aId, mthd) => { const lrc = client.actor(aId).lastRun(); From 3bd277d48725c71e1b76b41e115f7cb0df40c749 Mon Sep 17 00:00:00 2001 From: drobnikj Date: Tue, 24 Aug 2021 16:07:31 +0200 Subject: [PATCH 4/4] ci: bump version --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e52f4a6..eadbb1f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -1.4.0 / 2021/08/24 +1.4.1 / 2021/08/24 =================== - Changed passing token using request HTTP header instead of the request parameter for every API calls diff --git a/package.json b/package.json index f4da133c..a6d5fd88 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apify-client", - "version": "1.4.0", + "version": "1.4.1", "description": "Apify API client for JavaScript", "main": "src/index.js", "keywords": [