Skip to content

Commit b1ec0a5

Browse files
committed
also adjust SpecificTimeAvailability after Passthru team fix
1 parent e5e18f9 commit b1ec0a5

4 files changed

Lines changed: 64 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
- `activeCredentialId` field in `Connector` response model
1212
- `activeCredentialId` field in `UpdateConnectorRequest` for setting the active credential on a Connector
1313
* Enhanced `CredentialData.ConnectorOverride` to support optional `clientId` and `clientSecret` fields
14-
* Support for `specific_time_availability` field in `AvailabilityParticipant` to override open hours configurations for specific dates and time ranges
14+
* Support for `specific_time_availability` and `only_specific_time_availability` fields in `AvailabilityParticipant` to override open hours configurations for specific dates and time ranges
1515
* `smtpRequired` field in `UrlForAuthenticationConfig` to ensure users enter their SMTP settings during hosted authentication
1616

1717
### Deprecated

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ data class AvailabilityParticipant(
2828
*/
2929
@Json(name = "specific_time_availability")
3030
val specificTimeAvailability: List<SpecificTimeAvailability>? = null,
31+
/**
32+
* When set to true, only the times specified in [specificTimeAvailability] are considered available,
33+
* ignoring the [openHours] configuration.
34+
*/
35+
@Json(name = "only_specific_time_availability")
36+
val onlySpecificTimeAvailability: Boolean? = null,
3137
) {
3238
/**
3339
* A builder for creating an [AvailabilityParticipant].
@@ -39,6 +45,7 @@ data class AvailabilityParticipant(
3945
private var calendarIds: List<String>? = null
4046
private var openHours: List<OpenHours>? = null
4147
private var specificTimeAvailability: List<SpecificTimeAvailability>? = null
48+
private var onlySpecificTimeAvailability: Boolean? = null
4249

4350
/**
4451
* Set the calendar IDs associated with each participant's email address.
@@ -61,6 +68,14 @@ data class AvailabilityParticipant(
6168
*/
6269
fun specificTimeAvailability(specificTimeAvailability: List<SpecificTimeAvailability>) = apply { this.specificTimeAvailability = specificTimeAvailability }
6370

71+
/**
72+
* Set whether only the times specified in [SpecificTimeAvailability] are considered available.
73+
* When set to true, the [OpenHours] configuration is ignored.
74+
* @param onlySpecificTimeAvailability Whether to only use specific time availability.
75+
* @return The builder.
76+
*/
77+
fun onlySpecificTimeAvailability(onlySpecificTimeAvailability: Boolean) = apply { this.onlySpecificTimeAvailability = onlySpecificTimeAvailability }
78+
6479
/**
6580
* Build the [AvailabilityParticipant].
6681
* @return The [AvailabilityParticipant].
@@ -70,6 +85,7 @@ data class AvailabilityParticipant(
7085
calendarIds,
7186
openHours,
7287
specificTimeAvailability,
88+
onlySpecificTimeAvailability,
7389
)
7490
}
7591
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,25 @@ data class SpecificTimeAvailability(
2222
*/
2323
@Json(name = "end")
2424
val end: String,
25+
/**
26+
* IANA time zone database formatted string (e.g. America/Toronto).
27+
* @see <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">List of tz database time zones</a>
28+
*/
29+
@Json(name = "timezone")
30+
val timezone: String,
2531
) {
2632
/**
2733
* A builder for creating a [SpecificTimeAvailability].
2834
* @param date The date in YYYY-MM-DD format.
2935
* @param start The start time in HH:MM format.
3036
* @param end The end time in HH:MM format.
37+
* @param timezone IANA time zone database formatted string (e.g. America/Toronto).
3138
*/
3239
data class Builder(
3340
private val date: String,
3441
private val start: String,
3542
private val end: String,
43+
private val timezone: String,
3644
) {
3745
/**
3846
* Build the [SpecificTimeAvailability].
@@ -42,6 +50,7 @@ data class SpecificTimeAvailability(
4250
date,
4351
start,
4452
end,
53+
timezone,
4554
)
4655
}
4756
}

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

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,15 @@ class CalendarsTest {
105105
@Nested
106106
inner class SpecificTimeAvailabilityTests {
107107
@Test
108-
fun `SpecificTimeAvailability serializes properly`() {
108+
fun `SpecificTimeAvailability deserializes properly`() {
109109
val adapter = JsonHelper.moshi().adapter(SpecificTimeAvailability::class.java)
110110
val jsonBuffer = Buffer().writeUtf8(
111111
"""
112112
{
113113
"date": "2026-03-18",
114114
"start": "09:00",
115-
"end": "17:00"
115+
"end": "17:00",
116+
"timezone": "America/Toronto"
116117
}
117118
""".trimIndent(),
118119
)
@@ -122,6 +123,7 @@ class CalendarsTest {
122123
assertEquals("2026-03-18", specificTimeAvailability.date)
123124
assertEquals("09:00", specificTimeAvailability.start)
124125
assertEquals("17:00", specificTimeAvailability.end)
126+
assertEquals("America/Toronto", specificTimeAvailability.timezone)
125127
}
126128

127129
@Test
@@ -131,10 +133,11 @@ class CalendarsTest {
131133
date = "2026-03-18",
132134
start = "09:00",
133135
end = "17:00",
136+
timezone = "America/Toronto",
134137
)
135138

136139
val json = adapter.toJson(specificTimeAvailability)
137-
assertEquals("""{"date":"2026-03-18","start":"09:00","end":"17:00"}""", json)
140+
assertEquals("""{"date":"2026-03-18","start":"09:00","end":"17:00","timezone":"America/Toronto"}""", json)
138141
}
139142

140143
@Test
@@ -144,13 +147,15 @@ class CalendarsTest {
144147
date = "2026-03-18",
145148
start = "09:00",
146149
end = "17:00",
150+
timezone = "America/Toronto",
147151
)
148152

149153
val json = adapter.toJson(original)
150154
val deserialized = adapter.fromJson(json)!!
151155
assertEquals(original.date, deserialized.date)
152156
assertEquals(original.start, deserialized.start)
153157
assertEquals(original.end, deserialized.end)
158+
assertEquals(original.timezone, deserialized.timezone)
154159
}
155160

156161
@Test
@@ -159,15 +164,17 @@ class CalendarsTest {
159164
date = "2026-03-18",
160165
start = "09:00",
161166
end = "17:00",
167+
timezone = "America/Toronto",
162168
).build()
163169

164170
assertEquals("2026-03-18", specificTimeAvailability.date)
165171
assertEquals("09:00", specificTimeAvailability.start)
166172
assertEquals("17:00", specificTimeAvailability.end)
173+
assertEquals("America/Toronto", specificTimeAvailability.timezone)
167174
}
168175

169176
@Test
170-
fun `AvailabilityParticipant serializes with specificTimeAvailability`() {
177+
fun `AvailabilityParticipant serializes with specificTimeAvailability and onlySpecificTimeAvailability`() {
171178
val adapter = JsonHelper.moshi().adapter(AvailabilityParticipant::class.java)
172179
val participant = AvailabilityParticipant(
173180
email = "test@nylas.com",
@@ -177,8 +184,10 @@ class CalendarsTest {
177184
date = "2026-03-18",
178185
start = "09:00",
179186
end = "17:00",
187+
timezone = "America/Toronto",
180188
),
181189
),
190+
onlySpecificTimeAvailability = true,
182191
)
183192

184193
val json = adapter.toJson(participant)
@@ -188,10 +197,12 @@ class CalendarsTest {
188197
assertEquals("2026-03-18", deserialized.specificTimeAvailability?.get(0)?.date)
189198
assertEquals("09:00", deserialized.specificTimeAvailability?.get(0)?.start)
190199
assertEquals("17:00", deserialized.specificTimeAvailability?.get(0)?.end)
200+
assertEquals("America/Toronto", deserialized.specificTimeAvailability?.get(0)?.timezone)
201+
assertEquals(true, deserialized.onlySpecificTimeAvailability)
191202
}
192203

193204
@Test
194-
fun `AvailabilityParticipant serializes without specificTimeAvailability for backward compatibility`() {
205+
fun `AvailabilityParticipant serializes without new fields for backward compatibility`() {
195206
val adapter = JsonHelper.moshi().adapter(AvailabilityParticipant::class.java)
196207
val participant = AvailabilityParticipant(
197208
email = "test@nylas.com",
@@ -202,11 +213,12 @@ class CalendarsTest {
202213
val deserialized = adapter.fromJson(json)!!
203214
assertEquals("test@nylas.com", deserialized.email)
204215
assertEquals(null, deserialized.specificTimeAvailability)
216+
assertEquals(null, deserialized.onlySpecificTimeAvailability)
205217
assertEquals(null, deserialized.openHours)
206218
}
207219

208220
@Test
209-
fun `AvailabilityParticipant deserializes JSON with specific_time_availability`() {
221+
fun `AvailabilityParticipant deserializes JSON with all new fields`() {
210222
val adapter = JsonHelper.moshi().adapter(AvailabilityParticipant::class.java)
211223
val jsonBuffer = Buffer().writeUtf8(
212224
"""
@@ -217,9 +229,11 @@ class CalendarsTest {
217229
{
218230
"date": "2026-03-18",
219231
"start": "09:00",
220-
"end": "17:00"
232+
"end": "17:00",
233+
"timezone": "America/Toronto"
221234
}
222-
]
235+
],
236+
"only_specific_time_availability": true
223237
}
224238
""".trimIndent(),
225239
)
@@ -231,10 +245,12 @@ class CalendarsTest {
231245
assertEquals("2026-03-18", participant.specificTimeAvailability?.get(0)?.date)
232246
assertEquals("09:00", participant.specificTimeAvailability?.get(0)?.start)
233247
assertEquals("17:00", participant.specificTimeAvailability?.get(0)?.end)
248+
assertEquals("America/Toronto", participant.specificTimeAvailability?.get(0)?.timezone)
249+
assertEquals(true, participant.onlySpecificTimeAvailability)
234250
}
235251

236252
@Test
237-
fun `AvailabilityParticipant deserializes JSON without specific_time_availability for backward compatibility`() {
253+
fun `AvailabilityParticipant deserializes JSON without new fields for backward compatibility`() {
238254
val adapter = JsonHelper.moshi().adapter(AvailabilityParticipant::class.java)
239255
val jsonBuffer = Buffer().writeUtf8(
240256
"""
@@ -248,10 +264,11 @@ class CalendarsTest {
248264
val participant = adapter.fromJson(jsonBuffer)!!
249265
assertEquals("test@nylas.com", participant.email)
250266
assertEquals(null, participant.specificTimeAvailability)
267+
assertEquals(null, participant.onlySpecificTimeAvailability)
251268
}
252269

253270
@Test
254-
fun `AvailabilityParticipant Builder works with specificTimeAvailability`() {
271+
fun `AvailabilityParticipant Builder works with all new fields`() {
255272
val participant = AvailabilityParticipant.Builder("test@nylas.com")
256273
.calendarIds(listOf("primary"))
257274
.specificTimeAvailability(
@@ -260,9 +277,11 @@ class CalendarsTest {
260277
date = "2026-03-18",
261278
start = "09:00",
262279
end = "17:00",
280+
timezone = "America/Toronto",
263281
),
264282
),
265283
)
284+
.onlySpecificTimeAvailability(true)
266285
.build()
267286

268287
assertEquals("test@nylas.com", participant.email)
@@ -271,16 +290,19 @@ class CalendarsTest {
271290
assertEquals("2026-03-18", participant.specificTimeAvailability?.get(0)?.date)
272291
assertEquals("09:00", participant.specificTimeAvailability?.get(0)?.start)
273292
assertEquals("17:00", participant.specificTimeAvailability?.get(0)?.end)
293+
assertEquals("America/Toronto", participant.specificTimeAvailability?.get(0)?.timezone)
294+
assertEquals(true, participant.onlySpecificTimeAvailability)
274295
}
275296

276297
@Test
277-
fun `AvailabilityParticipant Builder works without specificTimeAvailability for backward compatibility`() {
298+
fun `AvailabilityParticipant Builder works without new fields for backward compatibility`() {
278299
val participant = AvailabilityParticipant.Builder("test@nylas.com")
279300
.calendarIds(listOf("calendar-123"))
280301
.build()
281302

282303
assertEquals("test@nylas.com", participant.email)
283304
assertEquals(null, participant.specificTimeAvailability)
305+
assertEquals(null, participant.onlySpecificTimeAvailability)
284306
}
285307
}
286308

@@ -527,19 +549,21 @@ class CalendarsTest {
527549
fun `getting availability with specificTimeAvailability calls requests with the correct params`() {
528550
val adapter = JsonHelper.moshi().adapter(GetAvailabilityRequest::class.java)
529551
val getAvailabilityRequest = GetAvailabilityRequest(
530-
startTime = 1737540000,
531-
endTime = 1737712800,
552+
startTime = 1773248400,
553+
endTime = 1774458000,
532554
participants = listOf(
533555
AvailabilityParticipant(
534-
email = "nylastest8@gmail.com",
556+
email = "teotoplak95@gmail.com",
535557
calendarIds = listOf("primary"),
536558
specificTimeAvailability = listOf(
537559
SpecificTimeAvailability(
538560
date = "2026-03-18",
539561
start = "09:00",
540562
end = "17:00",
563+
timezone = "America/Toronto",
541564
),
542565
),
566+
onlySpecificTimeAvailability = true,
543567
),
544568
),
545569
durationMinutes = 30,

0 commit comments

Comments
 (0)