From 7454abecdaa8a49423fef9ffa7019ee38436e24b Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 08:37:24 -0700 Subject: [PATCH 1/5] Added logo option and ability to turn off Nylas branding --- CHANGELOG.md | 8 +++ .../models/ConfigurationSchedulerSettings.kt | 56 ++++++++++++++++++- .../com/nylas/resources/ConfigurationsTest.kt | 48 ++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fdc7d1f..f6337f73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Nylas Java SDK Changelog +## [2.11.0] - Release 2025-06-13 + +### 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 +* Added `Builder` pattern to `EmailTemplate` class for consistent SDK experience with new `logo()` and `showNylasBranding()` methods +* Enhanced scheduler configuration support to allow complete email template customization for booking confirmations + ## [2.10.0] - Release 2025-06-12 ### Added diff --git a/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt b/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt index c67bb771..8fb9f287 100644 --- a/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt +++ b/src/main/kotlin/com/nylas/models/ConfigurationSchedulerSettings.kt @@ -262,7 +262,61 @@ data class EmailTemplate( */ @Json(name = "booking_confirmed") val bookingConfirmed: BookingConfirmedTemplate? = null, -) + /** + * URL of a custom logo to appear in booking emails. + */ + @Json(name = "logo") + val logo: String? = null, + /** + * Boolean flag to toggle Nylas branding visibility. + */ + @Json(name = "show_nylas_branding") + val showNylasBranding: Boolean? = null, +) { + /** + * Builder for [EmailTemplate]. + */ + class Builder { + private var bookingConfirmed: BookingConfirmedTemplate? = null + private var logo: String? = null + private var showNylasBranding: Boolean? = null + + /** + * Set the configurable settings specifically for booking confirmed emails. + * + * @param bookingConfirmed Configurable settings specifically for booking confirmed emails. + * @return The builder. + */ + fun bookingConfirmed(bookingConfirmed: BookingConfirmedTemplate) = apply { this.bookingConfirmed = bookingConfirmed } + + /** + * Set the URL of a custom logo to appear in booking emails. + * + * @param logo URL of a custom logo to appear in booking emails. + * @return The builder. + */ + fun logo(logo: String) = apply { this.logo = logo } + + /** + * Set the boolean flag to toggle Nylas branding visibility. + * + * @param showNylasBranding Boolean flag to toggle Nylas branding visibility. + * @return The builder. + */ + fun showNylasBranding(showNylasBranding: Boolean) = apply { this.showNylasBranding = showNylasBranding } + + /** + * Build the [EmailTemplate]. + * + * @return The [EmailTemplate] + */ + fun build() = EmailTemplate( + bookingConfirmed, + logo, + showNylasBranding, + ) + } +} /** * Class representation of booking confirmed template settings. diff --git a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt index d7c06f91..5c06a8fc 100644 --- a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt +++ b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt @@ -182,6 +182,54 @@ class ConfigurationsTest { assertEquals("Test", config.participants.first().name) assertEquals("", config.participants.first().timezone) } + + @Test + fun `EmailTemplate with new fields serializes properly`() { + val adapter = JsonHelper.moshi().adapter(EmailTemplate::class.java) + val jsonBuffer = Buffer().writeUtf8( + """ + { + "booking_confirmed": { + "title": "Custom Booking Title", + "body": "Thank you for booking with us!" + }, + "logo": "https://example.com/logo.png", + "show_nylas_branding": false + } + """.trimIndent(), + ) + + val emailTemplate = adapter.fromJson(jsonBuffer)!! + assertIs(emailTemplate) + assertEquals("https://example.com/logo.png", emailTemplate.logo) + assertEquals(false, emailTemplate.showNylasBranding) + assertEquals("Custom Booking Title", emailTemplate.bookingConfirmed?.title) + assertEquals("Thank you for booking with us!", emailTemplate.bookingConfirmed?.body) + + // Test serialization back to JSON + val serializedJson = adapter.toJson(emailTemplate) + assert(serializedJson.contains("\"logo\":\"https://example.com/logo.png\"")) + assert(serializedJson.contains("\"show_nylas_branding\":false")) + } + + @Test + fun `EmailTemplate Builder works correctly`() { + val bookingConfirmed = BookingConfirmedTemplate( + title = "Custom Title", + body = "Custom Body" + ) + + val emailTemplate = EmailTemplate.Builder() + .bookingConfirmed(bookingConfirmed) + .logo("https://company.com/logo.svg") + .showNylasBranding(true) + .build() + + assertEquals("https://company.com/logo.svg", emailTemplate.logo) + assertEquals(true, emailTemplate.showNylasBranding) + assertEquals("Custom Title", emailTemplate.bookingConfirmed?.title) + assertEquals("Custom Body", emailTemplate.bookingConfirmed?.body) + } } @Nested From ad8a9670dd60bb729a3035e8c9ac2219c5162e16 Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 08:44:08 -0700 Subject: [PATCH 2/5] fix linting issues for Github tests --- src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt index 5c06a8fc..106fd8ef 100644 --- a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt +++ b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt @@ -216,9 +216,9 @@ class ConfigurationsTest { fun `EmailTemplate Builder works correctly`() { val bookingConfirmed = BookingConfirmedTemplate( title = "Custom Title", - body = "Custom Body" + body = "Custom Body", ) - + val emailTemplate = EmailTemplate.Builder() .bookingConfirmed(bookingConfirmed) .logo("https://company.com/logo.svg") From 5d77be1cefda467f92b4a1f5260c1ed9c07a5db7 Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 08:47:53 -0700 Subject: [PATCH 3/5] Update CHANGELOG.md Co-authored-by: Aaron de Mello <314152+AaronDDM@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6337f73..fe9f1b5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Nylas Java SDK Changelog -## [2.11.0] - Release 2025-06-13 +## [Unreleased] ### Added * Support for `logo` field in `EmailTemplate` class to specify a custom logo URL for booking emails From a6ca51b04cf66b88d0285191613de795f9cfaf73 Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 08:48:35 -0700 Subject: [PATCH 4/5] Update CHANGELOG.md Co-authored-by: Aaron de Mello <314152+AaronDDM@users.noreply.github.com> --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe9f1b5a..cfcf6ce9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ ### 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 -* Added `Builder` pattern to `EmailTemplate` class for consistent SDK experience with new `logo()` and `showNylasBranding()` methods -* Enhanced scheduler configuration support to allow complete email template customization for booking confirmations ## [2.10.0] - Release 2025-06-12 From 1a64fc8cf9b4a1e06776f5f82ad2ee346093dddd Mon Sep 17 00:00:00 2001 From: ajay-k Date: Fri, 13 Jun 2025 08:55:33 -0700 Subject: [PATCH 5/5] Include test using the new fields --- .../com/nylas/resources/ConfigurationsTest.kt | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt index 106fd8ef..e1fee7a7 100644 --- a/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt +++ b/src/test/kotlin/com/nylas/resources/ConfigurationsTest.kt @@ -450,5 +450,85 @@ class ConfigurationsTest { assertEquals("v3/grants/$grantId/scheduling/configurations/$configId", pathCaptor.firstValue) assertEquals(DeleteResponse::class.java, typeCaptor.firstValue) } + + @Test + fun `creating a configuration with custom email template 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 EmailTemplate with new logo and showNylasBranding fields + val emailTemplate = EmailTemplate.Builder() + .logo("https://company.com/custom-logo.png") + .showNylasBranding(false) + .bookingConfirmed( + BookingConfirmedTemplate( + title = "Your Meeting is Confirmed", + body = "Thank you for booking! We look forward to meeting with you.", + ), + ) + .build() + + // Create scheduler settings with the email template + val schedulerSettings = ConfigurationSchedulerSettings.Builder() + .emailTemplate(emailTemplate) + .availableDaysInFuture(14) + .minBookingNotice(120) + .build() + + val participants = ArrayList() + participants.add(configurationParticipant) + + val createConfigurationRequest = CreateConfigurationRequest.Builder( + participants, + configurationAvailability, + configurationEventBooking, + ) + .name("Configuration with Custom Email Template") + .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 EmailTemplate fields + assert(serializedRequest.contains("\"logo\":\"https://company.com/custom-logo.png\"")) + assert(serializedRequest.contains("\"show_nylas_branding\":false")) + assert(serializedRequest.contains("\"booking_confirmed\"")) + assert(serializedRequest.contains("Your Meeting is Confirmed")) + } } }