Skip to content

Commit 1ab79b2

Browse files
ajay-kAaronDDM
andauthored
Add support for Metadata (#284)
Fixed missing metadata field type in AdditionalFieldType enum that was supported by the API but not available in the SDK. Changes - Added METADATA enum value with "Json"(name = "metadata") annotation - Updated documentation to include metadata in supported field types - Added tests for serialization and API integration # License <!-- Your PR comment must contain the following line for us to merge the PR. --> I confirm that this contribution is made under the terms of the MIT license and that I have the authority necessary to make this contribution on behalf of its copyright owner. --------- Co-authored-by: Aaron de Mello <314152+AaronDDM@users.noreply.github.com>
1 parent ce3598c commit 1ab79b2

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
### Added
77
* Support for `logo` field in `EmailTemplate` class to specify a custom logo URL for booking emails
88
* Support for `show_nylas_branding` field in `EmailTemplate` class to control Nylas branding visibility in booking emails
9+
* Support for `metadata` field type in `AdditionalFieldType` enum for scheduler additional fields
910

1011
## [2.10.0] - Release 2025-06-12
1112

src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ data class AdditionalField(
225225
val label: String,
226226
/**
227227
* The field type.
228-
* Supported values are text, multi_line_text, email, phone_number, dropdown, date, checkbox, and radio_button.
228+
* Supported values are text, multi_line_text, email, phone_number, dropdown, date, checkbox, radio_button, and metadata.
229229
*/
230230
@Json(name = "type")
231231
val type: AdditionalFieldType,
@@ -361,6 +361,9 @@ enum class AdditionalFieldType {
361361

362362
@Json(name = "radio_button")
363363
RADIO_BUTTON,
364+
365+
@Json(name = "metadata")
366+
METADATA,
364367
}
365368

366369
/**

src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,33 @@ class ConfigurationsTest {
230230
assertEquals("Custom Title", emailTemplate.bookingConfirmed?.title)
231231
assertEquals("Custom Body", emailTemplate.bookingConfirmed?.body)
232232
}
233+
234+
@Test
235+
fun `AdditionalFieldType METADATA serializes correctly`() {
236+
val adapter = JsonHelper.moshi().adapter(AdditionalField::class.java)
237+
val jsonBuffer = Buffer().writeUtf8(
238+
"""
239+
{
240+
"label": "Additional Information",
241+
"type": "metadata",
242+
"required": true,
243+
"order": 1
244+
}
245+
""".trimIndent(),
246+
)
247+
248+
val additionalField = adapter.fromJson(jsonBuffer)!!
249+
assertIs<AdditionalField>(additionalField)
250+
assertEquals("Additional Information", additionalField.label)
251+
assertEquals(AdditionalFieldType.METADATA, additionalField.type)
252+
assertEquals(true, additionalField.required)
253+
assertEquals(1, additionalField.order)
254+
255+
// Test serialization back to JSON
256+
val serializedJson = adapter.toJson(additionalField)
257+
assert(serializedJson.contains("\"type\":\"metadata\""))
258+
assert(serializedJson.contains("\"label\":\"Additional Information\""))
259+
}
233260
}
234261

235262
@Nested
@@ -530,5 +557,95 @@ class ConfigurationsTest {
530557
assert(serializedRequest.contains("\"booking_confirmed\""))
531558
assert(serializedRequest.contains("Your Meeting is Confirmed"))
532559
}
560+
561+
@Test
562+
fun `creating a configuration with metadata additional fields calls requests with the correct params`() {
563+
val adapter = JsonHelper.moshi().adapter(CreateConfigurationRequest::class.java)
564+
val participantCalendarIds = ArrayList<String>()
565+
participantCalendarIds.add("primary")
566+
567+
val configurationAvailabilityParticipant = ConfigurationAvailabilityParticipant.Builder().calendarIds(participantCalendarIds).build()
568+
569+
val configurationBookingParticipant = ConfigurationBookingParticipant.Builder().calendarId("primary").build()
570+
571+
val configurationParticipant = ConfigurationParticipant.Builder("test@nylas.com")
572+
.availability(configurationAvailabilityParticipant)
573+
.booking(configurationBookingParticipant)
574+
.name("Test Participant")
575+
.isOrganizer(true)
576+
.build()
577+
578+
val configurationAvailability = ConfigurationAvailability.Builder().intervalMinutes(30).build()
579+
580+
val configurationEventBooking = ConfigurationEventBooking.Builder().title("Test Event Booking").build()
581+
582+
// Create additional fields including the new METADATA field type
583+
val additionalFields = mapOf(
584+
"department" to AdditionalField(
585+
label = "Department",
586+
type = AdditionalFieldType.TEXT,
587+
required = true,
588+
order = 1,
589+
),
590+
"project_info" to AdditionalField(
591+
label = "Project Information",
592+
type = AdditionalFieldType.METADATA,
593+
required = false,
594+
order = 2,
595+
),
596+
"contact_preference" to AdditionalField(
597+
label = "Contact Preference",
598+
type = AdditionalFieldType.DROPDOWN,
599+
required = true,
600+
order = 3,
601+
),
602+
)
603+
604+
// Create scheduler settings with additional fields
605+
val schedulerSettings = ConfigurationSchedulerSettings.Builder()
606+
.additionalFields(additionalFields)
607+
.availableDaysInFuture(14)
608+
.minBookingNotice(120)
609+
.build()
610+
611+
val participants = ArrayList<ConfigurationParticipant>()
612+
participants.add(configurationParticipant)
613+
614+
val createConfigurationRequest = CreateConfigurationRequest.Builder(
615+
participants,
616+
configurationAvailability,
617+
configurationEventBooking,
618+
)
619+
.name("Configuration with Metadata Additional Fields")
620+
.scheduler(schedulerSettings)
621+
.build()
622+
623+
configurations.create(grantId, createConfigurationRequest)
624+
625+
val pathCaptor = argumentCaptor<String>()
626+
val typeCaptor = argumentCaptor<Type>()
627+
val requestBodyCaptor = argumentCaptor<String>()
628+
val queryParamCaptor = argumentCaptor<ListConfigurationsQueryParams>()
629+
val overrideParamCaptor = argumentCaptor<RequestOverrides>()
630+
verify(mockNylasClient).executePost<Response<Configuration>>(
631+
pathCaptor.capture(),
632+
typeCaptor.capture(),
633+
requestBodyCaptor.capture(),
634+
queryParamCaptor.capture(),
635+
overrideParamCaptor.capture(),
636+
)
637+
638+
assertEquals("v3/grants/$grantId/scheduling/configurations", pathCaptor.firstValue)
639+
assertEquals(Types.newParameterizedType(Response::class.java, Configuration::class.java), typeCaptor.firstValue)
640+
641+
val serializedRequest = adapter.toJson(createConfigurationRequest)
642+
assertEquals(serializedRequest, requestBodyCaptor.firstValue)
643+
644+
// Verify that the JSON contains the new METADATA field type
645+
assert(serializedRequest.contains("\"type\":\"metadata\""))
646+
assert(serializedRequest.contains("\"project_info\""))
647+
assert(serializedRequest.contains("\"Project Information\""))
648+
assert(serializedRequest.contains("\"additional_fields\""))
649+
}
533650
}
534651
}

0 commit comments

Comments
 (0)