diff --git a/src/main/kotlin/com/nylas/models/Event.kt b/src/main/kotlin/com/nylas/models/Event.kt index bd476a54..0931cb3f 100644 --- a/src/main/kotlin/com/nylas/models/Event.kt +++ b/src/main/kotlin/com/nylas/models/Event.kt @@ -110,7 +110,7 @@ data class Event( @Json(name = "reminders") val reminders: Reminders? = null, /** - * Status of the event. + * Status of the event. Possible values: "confirmed", "tentative", "cancelled", "maybe". */ @Json(name = "status") val status: EventStatus? = null, diff --git a/src/main/kotlin/com/nylas/models/EventStatus.kt b/src/main/kotlin/com/nylas/models/EventStatus.kt index 8c86995e..0e69e1c4 100644 --- a/src/main/kotlin/com/nylas/models/EventStatus.kt +++ b/src/main/kotlin/com/nylas/models/EventStatus.kt @@ -9,6 +9,13 @@ enum class EventStatus { @Json(name = "confirmed") CONFIRMED, + @Json(name = "maybe") + MAYBE, + + @Deprecated( + message = "Use MAYBE instead. TENTATIVE is a legacy alias and will be removed in a future release.", + replaceWith = ReplaceWith("MAYBE"), + ) @Json(name = "tentative") TENTATIVE, diff --git a/src/main/kotlin/com/nylas/util/EventStatusJsonAdapter.kt b/src/main/kotlin/com/nylas/util/EventStatusJsonAdapter.kt new file mode 100644 index 00000000..25ad2bf7 --- /dev/null +++ b/src/main/kotlin/com/nylas/util/EventStatusJsonAdapter.kt @@ -0,0 +1,37 @@ +package com.nylas.util + +import com.nylas.models.EventStatus +import com.squareup.moshi.FromJson +import com.squareup.moshi.JsonReader +import com.squareup.moshi.JsonWriter +import com.squareup.moshi.ToJson + +/** + * Normalizes legacy event status values and avoids failing deserialization on new values. + */ +class EventStatusJsonAdapter { + @FromJson + fun fromJson(reader: JsonReader): EventStatus? { + if (reader.peek() == JsonReader.Token.NULL) { + return reader.nextNull() + } + + return when (reader.nextString()) { + "confirmed" -> EventStatus.CONFIRMED + "maybe", "tentative" -> EventStatus.MAYBE + "cancelled" -> EventStatus.CANCELLED + else -> null + } + } + + @ToJson + @Suppress("DEPRECATION") + fun toJson(writer: JsonWriter, value: EventStatus?) { + when (value) { + null -> writer.nullValue() + EventStatus.CONFIRMED -> writer.value("confirmed") + EventStatus.MAYBE, EventStatus.TENTATIVE -> writer.value("maybe") + EventStatus.CANCELLED -> writer.value("cancelled") + } + } +} diff --git a/src/main/kotlin/com/nylas/util/JsonHelper.kt b/src/main/kotlin/com/nylas/util/JsonHelper.kt index baa79ca2..c2b80a4e 100644 --- a/src/main/kotlin/com/nylas/util/JsonHelper.kt +++ b/src/main/kotlin/com/nylas/util/JsonHelper.kt @@ -36,6 +36,7 @@ class JsonHelper { .add(IMessageAdapter()) .add(UpdateConnectorAdapter()) .add(CredentialDataAdapter()) + .add(EventStatusJsonAdapter()) .add(CreateAttachmentRequestAdapter()) .add(MicrosoftAdminConsentCredentialDataAdapter()) .add(GoogleServiceAccountCredentialDataAdapter()) diff --git a/src/test/kotlin/com/nylas/resources/EventsTests.kt b/src/test/kotlin/com/nylas/resources/EventsTests.kt index df38cd9d..8778d122 100644 --- a/src/test/kotlin/com/nylas/resources/EventsTests.kt +++ b/src/test/kotlin/com/nylas/resources/EventsTests.kt @@ -223,6 +223,90 @@ class EventsTests { assertEquals("2024-06-18", whenDate.date) } + @Test + fun `Event deserializes maybe status properly`() { + val adapter = JsonHelper.moshi().adapter(Event::class.java) + val jsonBuffer = + Buffer().writeUtf8( + """ + { + "id": "5d3qmne77v32r8l4phyuksl2x", + "grant_id": "41009df5-bf11-4c97-aa18-b285b5f2e386", + "calendar_id": "7d93zl2palhxqdy6e5qinsakt", + "object": "event", + "status": "maybe", + "when": { + "date": "2024-06-18", + "object": "date" + } + } + """.trimIndent(), + ) + + val event = adapter.fromJson(jsonBuffer)!! + + assertEquals(EventStatus.MAYBE, event.status) + } + + @Test + fun `Event deserializes tentative status as maybe`() { + val adapter = JsonHelper.moshi().adapter(Event::class.java) + val jsonBuffer = + Buffer().writeUtf8( + """ + { + "id": "5d3qmne77v32r8l4phyuksl2x", + "grant_id": "41009df5-bf11-4c97-aa18-b285b5f2e386", + "calendar_id": "7d93zl2palhxqdy6e5qinsakt", + "object": "event", + "status": "tentative", + "when": { + "date": "2024-06-18", + "object": "date" + } + } + """.trimIndent(), + ) + + val event = adapter.fromJson(jsonBuffer)!! + + assertEquals(EventStatus.MAYBE, event.status) + } + + @Test + fun `Event deserializes unknown status as null`() { + val adapter = JsonHelper.moshi().adapter(Event::class.java) + val jsonBuffer = + Buffer().writeUtf8( + """ + { + "id": "5d3qmne77v32r8l4phyuksl2x", + "grant_id": "41009df5-bf11-4c97-aa18-b285b5f2e386", + "calendar_id": "7d93zl2palhxqdy6e5qinsakt", + "object": "event", + "status": "unexpected_status", + "when": { + "date": "2024-06-18", + "object": "date" + } + } + """.trimIndent(), + ) + + val event = adapter.fromJson(jsonBuffer)!! + + assertEquals(null, event.status) + } + + @Suppress("DEPRECATION") + @Test + fun `Event status serializes tentative as maybe`() { + val adapter = JsonHelper.moshi().adapter(EventStatus::class.java) + + assertEquals("\"maybe\"", adapter.toJson(EventStatus.MAYBE)) + assertEquals("\"maybe\"", adapter.toJson(EventStatus.TENTATIVE)) + } + @Test fun `CreateEventAutoConferencingProvider serializes properly`() { val adapter = JsonHelper.moshi().adapter(CreateEventAutoConferencingProvider::class.java)