Skip to content

Commit

Permalink
Merge pull request adobe#36 from sangeetha5491/CI-5874
Browse files Browse the repository at this point in the history
Add provider filtering options
  • Loading branch information
sangeetha5491 committed Jun 27, 2023
2 parents bbf6f3c + 5a5c136 commit 19d643b
Show file tree
Hide file tree
Showing 8 changed files with 304 additions and 23 deletions.
38 changes: 36 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ and max number of retries</p>
<dl>
<dt><a href="#EventsCoreAPIOptions">EventsCoreAPIOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#ProviderFilterOptions">ProviderFilterOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#ProviderOptions">ProviderOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#ProviderInputModel">ProviderInputModel</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#EventMetadataInputModel">EventMetadataInputModel</a> : <code>object</code></dt>
Expand Down Expand Up @@ -145,11 +149,12 @@ and max number of retries
* [.apiKey](#EventsCoreAPI+apiKey)
* [.accessToken](#EventsCoreAPI+accessToken)
* [.init(organizationId, apiKey, accessToken, [httpOptions])](#EventsCoreAPI+init)[<code>Promise.&lt;EventsCoreAPI&gt;</code>](#EventsCoreAPI)
* [.getAllProviders(consumerOrgId)](#EventsCoreAPI+getAllProviders) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getAllProviders(consumerOrgId, providerOptions)](#EventsCoreAPI+getAllProviders) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getProvider(providerId, [fetchEventMetadata])](#EventsCoreAPI+getProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.createProvider(consumerOrgId, projectId, workspaceId, body)](#EventsCoreAPI+createProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.updateProvider(consumerOrgId, projectId, workspaceId, providerId, body)](#EventsCoreAPI+updateProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.deleteProvider(consumerOrgId, projectId, workspaceId, providerId)](#EventsCoreAPI+deleteProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getProviderMetadata()](#EventsCoreAPI+getProviderMetadata) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getAllEventMetadataForProvider(providerId)](#EventsCoreAPI+getAllEventMetadataForProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getEventMetadataForProvider(providerId, eventCode)](#EventsCoreAPI+getEventMetadataForProvider) ⇒ <code>Promise.&lt;object&gt;</code>
* [.createEventMetadataForProvider(consumerOrgId, projectId, workspaceId, providerId, body)](#EventsCoreAPI+createEventMetadataForProvider) ⇒ <code>Promise.&lt;object&gt;</code>
Expand Down Expand Up @@ -208,7 +213,7 @@ Initialize SDK.

<a name="EventsCoreAPI+getAllProviders"></a>

### eventsCoreAPI.getAllProviders(consumerOrgId) ⇒ <code>Promise.&lt;object&gt;</code>
### eventsCoreAPI.getAllProviders(consumerOrgId, providerOptions) ⇒ <code>Promise.&lt;object&gt;</code>
Fetch all the providers

**Kind**: instance method of [<code>EventsCoreAPI</code>](#EventsCoreAPI)
Expand All @@ -217,6 +222,7 @@ Fetch all the providers
| Param | Type | Description |
| --- | --- | --- |
| consumerOrgId | <code>string</code> | Consumer Org Id from the console |
| providerOptions | [<code>ProviderOptions</code>](#ProviderOptions) | Provider options |

<a name="EventsCoreAPI+getProvider"></a>

Expand Down Expand Up @@ -277,6 +283,11 @@ Delete a provider given the id
| workspaceId | <code>string</code> | Workspace Id from the console |
| providerId | <code>string</code> | The id that uniquely identifies the provider to be deleted |

<a name="EventsCoreAPI+getProviderMetadata"></a>

### eventsCoreAPI.getProviderMetadata() ⇒ <code>Promise.&lt;object&gt;</code>
**Kind**: instance method of [<code>EventsCoreAPI</code>](#EventsCoreAPI)
**Returns**: <code>Promise.&lt;object&gt;</code> - Returns the list of all entitled provider metadata for the org
<a name="EventsCoreAPI+getAllEventMetadataForProvider"></a>

### eventsCoreAPI.getAllEventMetadataForProvider(providerId) ⇒ <code>Promise.&lt;object&gt;</code>
Expand Down Expand Up @@ -544,6 +555,29 @@ Returns a Promise that resolves with a new EventsCoreAPI object.
| [eventsBaseURL] | <code>string</code> | Base URL for Events Default https://api.adobe.io (optional) |
| [eventsIngressURL] | <code>string</code> | Ingress URL for Events. Default https://eventsingress.adobe.io (optional) |

<a name="ProviderFilterOptions"></a>

## ProviderFilterOptions : <code>object</code>
**Kind**: global typedef
**Properties**

| Name | Type | Description |
| --- | --- | --- |
| [providerMetadataId] | <code>string</code> | Fetch by providerMetadataId for the consumer org |
| [instanceId] | <code>string</code> | For Self registered providers, instanceId is a must while fetching by providerMetadataId |
| [providerMetadataIds] | <code>Array.&lt;string&gt;</code> | Fetch all providers ( and all instances ) for the list of provider metadata ids |

<a name="ProviderOptions"></a>

## ProviderOptions : <code>object</code>
**Kind**: global typedef
**Properties**

| Name | Type | Description |
| --- | --- | --- |
| fetchEventMetadata | <code>boolean</code> | Option to fetch event metadata for each of the the providers in the list |
| filterBy | [<code>ProviderFilterOptions</code>](#ProviderFilterOptions) | Provider filtering options based on either (providerMetadataId and instanceId) or list of providerMetadataIds |

<a name="ProviderInputModel"></a>

## ProviderInputModel : <code>object</code>
Expand Down
1 change: 1 addition & 0 deletions src/SDKErrors.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ E('ERROR_GET_PROVIDER', '%s')
E('ERROR_CREATE_PROVIDER', '%s')
E('ERROR_UPDATE_PROVIDER', '%s')
E('ERROR_DELETE_PROVIDER', '%s')
E('ERROR_GET_ALL_PROVIDER_METADATA', '%s')
E('ERROR_GET_ALL_EVENTMETADATA', '%s')
E('ERROR_GET_EVENTMETADATA', '%s')
E('ERROR_CREATE_EVENTMETADATA', '%s')
Expand Down
18 changes: 8 additions & 10 deletions src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,19 @@ function reduceError (error = {}) {
* Appends querystring key/value pairs to a url
*
* @param {string} url URL
* @param {object} qs Object/map with all the query paratemers as key value pairs
* @param {object} qs Object/map with all the query parameters as key value pairs
* @returns {string} URL with appended querystring key/value pairs
*/
function appendQueryParams (url, qs) {
let result = url
if (qs) {
let separator = (url.indexOf('?') >= 0) ? '&' : '?'
for (const key of Object.getOwnPropertyNames(qs)) {
if (qs[key]) {
const escKey = querystring.escape(key)
const escValue = querystring.escape(qs[key])
result += `${separator}${escKey}=${escValue}`
separator = '&'
}
if (qs && !(Object.keys(qs).length === 0)) {
const filteredQs = Object.entries(qs).filter(([k, v]) => !(v === null || v === undefined))
if (Object.keys(filteredQs).length === 0) {
return result
}
const separator = (url.indexOf('?') >= 0) ? '&' : '?'
const queryParams = querystring.stringify(Object.fromEntries(filteredQs))
result += `${separator}${queryParams}`
}
return result
}
Expand Down
49 changes: 44 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,17 +111,35 @@ class EventsCoreAPI {
* =========================================================================
*/

/**
* @typedef {object} ProviderFilterOptions
* @property {string} [providerMetadataId] Fetch by providerMetadataId for the consumer org
* @property {string} [instanceId] For Self registered providers, instanceId is a must while fetching by providerMetadataId
* @property {Array.<string>} [providerMetadataIds] Fetch all providers ( and all instances ) for the list of provider metadata ids
*/
/**
* @typedef {object} ProviderOptions
* @property {boolean} fetchEventMetadata Option to fetch event metadata for each of the the providers in the list
* @property {ProviderFilterOptions} filterBy Provider filtering options based on either (providerMetadataId and instanceId) or list of providerMetadataIds
*/
/**
* Fetch all the providers
*
* @param {string} consumerOrgId Consumer Org Id from the console
* @param {ProviderOptions} providerOptions Provider options
* @returns {Promise<object>} Returns list of providers for the org
*/
getAllProviders (consumerOrgId) {
getAllProviders (consumerOrgId, providerOptions = {}) {
const headers = {}
const filterOptions = providerOptions.filterBy
if (filterOptions && filterOptions.providerMetadataIds && filterOptions.providerMetadataId) {
return Promise.reject(new codes.ERROR_GET_ALL_PROVIDERS({ messageValues: 'Only one of providerMetadataIds or providerMetadataId can be set' }))
}
const requestOptions = this.__createRequest('GET', headers)
const url = this.__getUrl(`/events/${consumerOrgId}/providers`)
const sdkDetails = { requestOptions: requestOptions, url: url }
let urlWithQueryParams = helpers.appendQueryParams(url, filterOptions)
urlWithQueryParams = helpers.appendQueryParams(urlWithQueryParams, { eventmetadata: providerOptions.fetchEventMetadata })
const sdkDetails = { requestOptions: requestOptions, url: urlWithQueryParams }
return this.__handleRequest(sdkDetails, codes.ERROR_GET_ALL_PROVIDERS)
}

Expand All @@ -135,8 +153,9 @@ class EventsCoreAPI {
getProvider (providerId, fetchEventMetadata = false) {
const headers = {}
const requestOptions = this.__createRequest('GET', headers)
const url = this.__getUrl(`/events/providers/${providerId}?eventmetadata=${fetchEventMetadata}`)
const sdkDetails = { requestOptions: requestOptions, url: url }
const url = this.__getUrl(`/events/providers/${providerId}`)
const urlWithQueryParams = helpers.appendQueryParams(url, { eventmetadata: fetchEventMetadata })
const sdkDetails = { requestOptions: requestOptions, url: urlWithQueryParams }
return this.__handleRequest(sdkDetails, codes.ERROR_GET_PROVIDER)
}

Expand Down Expand Up @@ -200,6 +219,23 @@ class EventsCoreAPI {
return this.__handleRequest(sdkDetails, codes.ERROR_DELETE_PROVIDER)
}

/**
* =========================================================================
* GET Entitled Provider Metadata
* =========================================================================
*/

/**
* @returns {Promise<object>} Returns the list of all entitled provider metadata for the org
*/
getProviderMetadata () {
const headers = {}
const requestOptions = this.__createRequest('GET', headers)
const url = this.__getUrl('/events/providermetadata')
const sdkDetails = { requestOptions: requestOptions, url: url }
return this.__handleRequest(sdkDetails, codes.ERROR_GET_ALL_PROVIDER_METADATA)
}

/**
* =========================================================================
* GET/POST/PUT/DELETE Event Metadata
Expand Down Expand Up @@ -424,7 +460,7 @@ class EventsCoreAPI {
* @param {Page} [page] page size and page number
* @returns {Promise<object>} Paginated response of all webhook/journal registrations for an org
*/
getAllRegistrationsForOrg (consumerOrgId, page) {
getAllRegistrationsForOrg (consumerOrgId, page = {}) {
const headers = {}
const requestOptions = this.__createRequest('GET', headers)
const url = this.__getUrl(`/events/${consumerOrgId}/registrations`)
Expand Down Expand Up @@ -633,6 +669,9 @@ class EventsCoreAPI {
.then((response) => {
if (!response.ok) {
sdkDetails.requestId = response.headers.get('x-request-id')
if (response.status === 409) {
sdkDetails.conflictingId = response.headers.get('x-conflicting-id')
}
throw Error(helpers.reduceError(response))
}
if (response.status === 204) { resolve() } else { resolve(response.json()) }
Expand Down
25 changes: 25 additions & 0 deletions test/helpers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,31 @@ describe('Append query params test', () => {
const url = helpers.appendQueryParams('https://base-url.adobe.io?limit=2&latest=true', queryParams3)
expect(url).toBe('https://base-url.adobe.io?limit=2&latest=true&interval=10')
})
it('Append query params to url with array query params', () => {
const queryParams3 = { values: ['value1', 'value 2', 'value3'] }
const url = helpers.appendQueryParams('https://base-url.adobe.io', queryParams3)
expect(url).toBe('https://base-url.adobe.io?values=value1&values=value%202&values=value3')
})
it('Do not append undefined query params to url with query params', () => {
const queryParams3 = { values: undefined, interval: 10 }
const url = helpers.appendQueryParams('https://base-url.adobe.io', queryParams3)
expect(url).toBe('https://base-url.adobe.io?interval=10')
})
it('Append false value query params to url with query params', () => {
const queryParams3 = { value1: false, value2: false, value3: null, interval: 10 }
const url = helpers.appendQueryParams('https://base-url.adobe.io', queryParams3)
expect(url).toBe('https://base-url.adobe.io?value1=false&value2=false&interval=10')
})
it('Do not append undefined query params to url with array query params', () => {
const queryParams3 = { values: undefined, interval: [10, 20, 30] }
const url = helpers.appendQueryParams('https://base-url.adobe.io', queryParams3)
expect(url).toBe('https://base-url.adobe.io?interval=10&interval=20&interval=30')
})
it('Do not append undefined query params to url ', () => {
const queryParams3 = { values: undefined }
const url = helpers.appendQueryParams('https://base-url.adobe.io', queryParams3)
expect(url).toBe('https://base-url.adobe.io')
})
})

describe('Proper Payload Test', () => {
Expand Down
74 changes: 74 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ const gAccessToken = 'test-token'
const journalUrl = 'http://journal-url/events/organizations/orgId/integrations/integId/regId'
const EVENTS_BASE_URL = 'https://api.adobe.io/events'
const EVENTS_INGRESS_URL = 'https://eventsingress.adobe.io'
const CONFLICTING_ID = 'conflictingId'

// /////////////////////////////////////////////

Expand Down Expand Up @@ -128,6 +129,53 @@ describe('test get all providers', () => {
expect(res._embedded.providers[0].id).toBe('test-id-1')
expect(res._embedded.providers[1].id).toBe('test-id-2')
})
it('Success on get all providers for provider metadata ids list', async () => {
const sdkClient = await createSdkClient()
exponentialBackoffMockReturnValue(mock.data.getAllProvidersResponse, { status: 200, statusText: 'OK' })
const res = await sdkClient.getAllProviders('consumerId',
{
fetchEventMetadata: false,
filterBy: { providerMetadataIds: ['pm-1', 'pm-2'] }
})
expect(res._embedded.providers.length).toBe(2)
expect(res._embedded.providers[0].provider_metadata).toBe('pm-1')
expect(res._embedded.providers[1].provider_metadata).toBe('pm-2')
})
it('Success on get all providers for a provider metadata id and instance id', async () => {
const sdkClient = await createSdkClient()
const returnedValue = mock.data.getAllProvidersResponse
returnedValue._embedded.providers.pop()
exponentialBackoffMockReturnValue(returnedValue, { status: 200, statusText: 'OK' })
const res = await sdkClient.getAllProviders('consumerId',
{
fetchEventMetadata: false,
filterBy: { providerMetadataId: 'pm-1', instanceId: 'instance-1' }
})
expect(res._embedded.providers.length).toBe(1)
expect(res._embedded.providers[0].id).toBe('test-id-1')
expect(res._embedded.providers[0].provider_metadata).toBe('pm-1')
expect(res._embedded.providers[0].instance_id).toBe('instance-1')
})
it('Success on get all providers with eventmetadata', async () => {
const sdkClient = await createSdkClient()
exponentialBackoffMockReturnValue(mock.data.getAllProvidersWithEventMetadataResponse, { status: 200, statusText: 'OK' })
const res = await sdkClient.getAllProviders('consumerId', { fetchEventMetadata: true })
expect(res._embedded.providers.length).toBe(1)
expect(res._embedded.providers[0].id).toBe('test-id-1')
expect(res._embedded.providers[0]._embedded.eventmetadata[0].event_code).toBe('com.adobe.events.sdk.event.test')
})
it('Error on get all providers with providerMetadataIds list and providerMetadatataId query params', async () => {
const api = 'getAllProviders'
await checkErrorResponse(api, new errorSDK.codes.ERROR_GET_ALL_PROVIDERS(), ['consumerId',
{
fetchEventMetadata: false,
filterBy: {
providerMetadataIds: ['pm1', 'pm2'],
providerMetadataId: 'pm1'
}
}
])
})
it('Not found error on get all providers ', async () => {
const api = 'getAllProviders'
exponentialBackoffMockReturnValue({}, { status: 404, statusText: 'Not Found' })
Expand Down Expand Up @@ -218,6 +266,22 @@ describe('test delete provider', () => {
})
})

// ////////////////////////////////////////////

describe('test get provider metadata', () => {
it('Success on get provider metadata for org', async () => {
const sdkClient = await createSdkClient()
exponentialBackoffMockReturnValue(mock.data.getProviderMetadataForOrg, { status: 200, statusText: 'OK' })
const res = await sdkClient.getProviderMetadata()
expect(res._embedded.providermetadata.length).toBe(2)
})
it('Not found error on get provider metadata', async () => {
const api = 'getProviderMetadata'
exponentialBackoffMockReturnValue({}, { status: 400, statusText: 'Bad Request' })
await checkErrorResponse(api, new errorSDK.codes.ERROR_GET_ALL_PROVIDER_METADATA())
})
})

// /////////////////////////////////////////////

describe('Get all event metadata for provider', () => {
Expand Down Expand Up @@ -348,6 +412,13 @@ describe('Create registration', () => {
exponentialBackoffMockReturnValue({}, { status: 400, statusText: 'Bad Request' })
await checkErrorResponse(api, new errorSDK.codes.ERROR_CREATE_REGISTRATION(), ['consumerId', 'projectId', 'workspaceId', mock.data.createRegistrationBadRequest])
})
it('Conflcit in name on create registration', async () => {
const api = 'createRegistration'
const mockHeaders = {}
mockHeaders['x-conflicting-id'] = CONFLICTING_ID
exponentialBackoffMockReturnValue({}, { status: 409, statusText: 'Conflict', headers: mockHeaders })
await checkErrorResponse(api, new errorSDK.codes.ERROR_CREATE_REGISTRATION(), ['consumerId', 'projectId', 'workspaceId', mock.data.createRegistrationBadRequest])
})
})

describe('Update registration', () => {
Expand Down Expand Up @@ -689,6 +760,9 @@ async function checkErrorResponse (fn, error, args = []) {
.catch(e => {
expect(e.name).toEqual(error.name)
expect(e.code).toEqual(error.code)
if (e.code === 409) {
expect(e.conflictingId).toEqual(CONFLICTING_ID)
}
resolve()
})
})
Expand Down
Loading

0 comments on commit 19d643b

Please sign in to comment.