From c577d3d2ee30208e93bed75ae0919c90efc0ab3a Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 12:22:01 -0700 Subject: [PATCH 1/2] Add support for Metadata --- CHANGELOG.md | 4 + .../models/ConfigurationSchedulerSettings.kt | 5 +- .../com/nylas/resources/ConfigurationsTest.kt | 117 ++++++++++++++++++ 3 files changed, 125 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfcf6ce9..c93e3477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ ### Added * Support for `logo` field in `EmailTemplate` class to specify a custom logo URL for booking emails * Support for `show_nylas_branding` field in `EmailTemplate` class to control Nylas branding visibility in booking emails +* Support for `metadata` field type in `AdditionalFieldType` enum for scheduler additional fields + +### Fixed +* Missing `metadata` field type in `AdditionalFieldType` enum that was supported by the API but not available in the SDK ## [2.10.0] - Release 2025-06-12 diff --git a/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt b/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt index 8fb9f287..ce2fcbc2 100644 --- a/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt +++ b/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt @@ -225,7 +225,7 @@ data class AdditionalField( val label: String, /** * The field type. - * Supported values are text, multi_line_text, email, phone_number, dropdown, date, checkbox, and radio_button. + * Supported values are text, multi_line_text, email, phone_number, dropdown, date, checkbox, radio_button, and metadata. */ @Json(name = "type") val type: AdditionalFieldType, @@ -361,6 +361,9 @@ enum class AdditionalFieldType { @Json(name = "radio_button") RADIO_BUTTON, + + @Json(name = "metadata") + METADATA, } /** diff --git a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt index e1fee7a7..917997fb 100644 --- a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt +++ b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt @@ -230,6 +230,33 @@ class ConfigurationsTest { assertEquals("Custom Title", emailTemplate.bookingConfirmed?.title) assertEquals("Custom Body", emailTemplate.bookingConfirmed?.body) } + + @Test + fun `AdditionalFieldType METADATA serializes correctly`() { + val adapter = JsonHelper.moshi().adapter(AdditionalField::class.java) + val jsonBuffer = Buffer().writeUtf8( + """ + { + "label": "Additional Information", + "type": "metadata", + "required": true, + "order": 1 + } + """.trimIndent(), + ) + + val additionalField = adapter.fromJson(jsonBuffer)!! + assertIs(additionalField) + assertEquals("Additional Information", additionalField.label) + assertEquals(AdditionalFieldType.METADATA, additionalField.type) + assertEquals(true, additionalField.required) + assertEquals(1, additionalField.order) + + // Test serialization back to JSON + val serializedJson = adapter.toJson(additionalField) + assert(serializedJson.contains("\"type\":\"metadata\"")) + assert(serializedJson.contains("\"label\":\"Additional Information\"")) + } } @Nested @@ -530,5 +557,95 @@ class ConfigurationsTest { assert(serializedRequest.contains("\"booking_confirmed\"")) assert(serializedRequest.contains("Your Meeting is Confirmed")) } + + @Test + fun `creating a configuration with metadata additional fields calls requests with the correct params`() { + val adapter = JsonHelper.moshi().adapter(CreateConfigurationRequest::class.java) + val participantCalendarIds = ArrayList() + participantCalendarIds.add("primary") + + val configurationAvailabilityParticipant = ConfigurationAvailabilityParticipant.Builder().calendarIds(participantCalendarIds).build() + + val configurationBookingParticipant = ConfigurationBookingParticipant.Builder().calendarId("primary").build() + + val configurationParticipant = ConfigurationParticipant.Builder("test@nylas.com") + .availability(configurationAvailabilityParticipant) + .booking(configurationBookingParticipant) + .name("Test Participant") + .isOrganizer(true) + .build() + + val configurationAvailability = ConfigurationAvailability.Builder().intervalMinutes(30).build() + + val configurationEventBooking = ConfigurationEventBooking.Builder().title("Test Event Booking").build() + + // Create additional fields including the new METADATA field type + val additionalFields = mapOf( + "department" to AdditionalField( + label = "Department", + type = AdditionalFieldType.TEXT, + required = true, + order = 1, + ), + "project_info" to AdditionalField( + label = "Project Information", + type = AdditionalFieldType.METADATA, + required = false, + order = 2, + ), + "contact_preference" to AdditionalField( + label = "Contact Preference", + type = AdditionalFieldType.DROPDOWN, + required = true, + order = 3, + ), + ) + + // Create scheduler settings with additional fields + val schedulerSettings = ConfigurationSchedulerSettings.Builder() + .additionalFields(additionalFields) + .availableDaysInFuture(14) + .minBookingNotice(120) + .build() + + val participants = ArrayList() + participants.add(configurationParticipant) + + val createConfigurationRequest = CreateConfigurationRequest.Builder( + participants, + configurationAvailability, + configurationEventBooking, + ) + .name("Configuration with Metadata Additional Fields") + .scheduler(schedulerSettings) + .build() + + configurations.create(grantId, createConfigurationRequest) + + val pathCaptor = argumentCaptor() + val typeCaptor = argumentCaptor() + val requestBodyCaptor = argumentCaptor() + val queryParamCaptor = argumentCaptor() + val overrideParamCaptor = argumentCaptor() + verify(mockNylasClient).executePost>( + pathCaptor.capture(), + typeCaptor.capture(), + requestBodyCaptor.capture(), + queryParamCaptor.capture(), + overrideParamCaptor.capture(), + ) + + assertEquals("v3/grants/$grantId/scheduling/configurations", pathCaptor.firstValue) + assertEquals(Types.newParameterizedType(Response::class.java, Configuration::class.java), typeCaptor.firstValue) + + val serializedRequest = adapter.toJson(createConfigurationRequest) + assertEquals(serializedRequest, requestBodyCaptor.firstValue) + + // Verify that the JSON contains the new METADATA field type + assert(serializedRequest.contains("\"type\":\"metadata\"")) + assert(serializedRequest.contains("\"project_info\"")) + assert(serializedRequest.contains("\"Project Information\"")) + assert(serializedRequest.contains("\"additional_fields\"")) + } } } From 1de3dbf76bb526668f049ab707a9eb8685aefb78 Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 12:30:48 -0700 Subject: [PATCH 2/2] Update CHANGELOG.md Co-authored-by: Aaron de Mello <314152+AaronDDM@users.noreply.github.com> --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c93e3477..40eb19bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,6 @@ * Support for `show_nylas_branding` field in `EmailTemplate` class to control Nylas branding visibility in booking emails * Support for `metadata` field type in `AdditionalFieldType` enum for scheduler additional fields -### Fixed -* Missing `metadata` field type in `AdditionalFieldType` enum that was supported by the API but not available in the SDK - ## [2.10.0] - Release 2025-06-12 ### Added