From 457477a7af0f8e3721e9498e08f3c99b14f20e05 Mon Sep 17 00:00:00 2001 From: Mostafa Rashed <17770919+mrashed-dev@users.noreply.github.com> Date: Fri, 17 May 2024 15:56:20 -0400 Subject: [PATCH] Added support for filtering by event type when listing events (#564) This PR adds support for filtering events by event type. Note that this feature is only for Google events. --- CHANGELOG.md | 5 +++++ src/apiClient.ts | 18 +++++++++++++++--- src/models/events.ts | 14 ++++++++++++++ tests/apiClient.spec.ts | 18 ++++++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 571f65b5..b5ba5d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### Unreleased +* Added support for filtering by event type when listing events +* Added support for filtering a list of folders +* Fixed query parameters not being formatted properly + ### 7.4.0 / 2024-05-01 * Added support for `provider` field in code exchange response * Added clean messages support diff --git a/src/apiClient.ts b/src/apiClient.ts index 2018b0b9..40113d10 100644 --- a/src/apiClient.ts +++ b/src/apiClient.ts @@ -8,6 +8,7 @@ import { import { objKeysToCamelCase, objKeysToSnakeCase } from './utils.js'; import { SDK_VERSION } from './version.js'; import * as FormData from 'form-data'; +import { snakeCase } from 'change-case'; /** * Options for a request to the Nylas API @@ -92,8 +93,8 @@ export default class APIClient { queryParams?: Record ): URL { if (queryParams) { - const snakeCaseParams = objKeysToSnakeCase(queryParams, ['metadataPair']); - for (const [key, value] of Object.entries(snakeCaseParams)) { + for (const [key, value] of Object.entries(queryParams)) { + const snakeCaseKey = snakeCase(key); if (key == 'metadataPair') { // The API understands a metadata_pair filter in the form of: // : @@ -104,8 +105,19 @@ export default class APIClient { ); } url.searchParams.set('metadata_pair', metadataPair.join(',')); + } else if (Array.isArray(value)) { + for (const item of value) { + url.searchParams.append(snakeCaseKey, item as string); + } + } else if (typeof value === 'object') { + for (const item in value) { + url.searchParams.append( + snakeCaseKey, + `${item}:${(value as Record)[item]}` + ); + } } else { - url.searchParams.set(key, value as string); + url.searchParams.set(snakeCaseKey, value as string); } } } diff --git a/src/models/events.ts b/src/models/events.ts index 2e943c03..4eb07f45 100644 --- a/src/models/events.ts +++ b/src/models/events.ts @@ -274,6 +274,11 @@ export interface ListEventQueryParams extends ListQueryParams { * This value should be taken from the {@link NylasListResponse.nextCursor} response field. */ pageToken?: string; + /** + * (Google only) Filter events by event type. + * You can pass the query parameter multiple times to select or exclude multiple event types. + */ + eventType?: EventType[]; } /** @@ -593,3 +598,12 @@ export interface EmailName { */ name?: string; } + +/** + * Type representing the event type to filter by. + */ +export type EventType = + | 'default' + | 'outOfOffice' + | 'focusTime' + | 'workingLocation'; diff --git a/tests/apiClient.spec.ts b/tests/apiClient.spec.ts index 19fbbda8..63ad43f0 100644 --- a/tests/apiClient.spec.ts +++ b/tests/apiClient.spec.ts @@ -100,6 +100,24 @@ describe('APIClient', () => { ) ); }); + + it('should handle all the different types of query params', () => { + const options = client.requestOptions({ + path: '/test', + method: 'GET', + queryParams: { + foo: 'bar', + list: ['a', 'b', 'c'], + map: { key1: 'value1', key2: 'value2' }, + }, + }); + + expect(options.url).toEqual( + new URL( + 'https://api.us.nylas.com/test?foo=bar&list=a&list=b&list=c&map=key1%3Avalue1&map=key2%3Avalue2' + ) + ); + }); }); describe('newRequest', () => {