diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/MoshiChatApi.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/MoshiChatApi.kt index fdb38f927e5..788e80e8166 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/MoshiChatApi.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/MoshiChatApi.kt @@ -58,13 +58,11 @@ import io.getstream.chat.android.client.api2.model.requests.FlagUserRequest import io.getstream.chat.android.client.api2.model.requests.GuestUserRequest import io.getstream.chat.android.client.api2.model.requests.InviteMembersRequest import io.getstream.chat.android.client.api2.model.requests.MuteUserRequest -import io.getstream.chat.android.client.api2.model.requests.PartialUpdateMessageRequest import io.getstream.chat.android.client.api2.model.requests.PartialUpdateUsersRequest import io.getstream.chat.android.client.api2.model.requests.PinnedMessagesRequest import io.getstream.chat.android.client.api2.model.requests.QueryBannedUsersRequest import io.getstream.chat.android.client.api2.model.requests.QueryDraftMessagesRequest import io.getstream.chat.android.client.api2.model.requests.RejectInviteRequest -import io.getstream.chat.android.client.api2.model.requests.ReminderRequest import io.getstream.chat.android.client.api2.model.requests.RemoveMembersRequest import io.getstream.chat.android.client.api2.model.requests.SendEventRequest import io.getstream.chat.android.client.api2.model.requests.SendMessageRequest @@ -145,6 +143,7 @@ import io.getstream.chat.android.network.models.CastPollVoteRequest import io.getstream.chat.android.network.models.CreateDeviceRequest import io.getstream.chat.android.network.models.CreatePollOptionRequest import io.getstream.chat.android.network.models.CreatePollRequest +import io.getstream.chat.android.network.models.CreateReminderRequest import io.getstream.chat.android.network.models.CreateUserGroupRequest import io.getstream.chat.android.network.models.CreateUserGroupResponse import io.getstream.chat.android.network.models.DeliveredMessagePayload @@ -171,8 +170,10 @@ import io.getstream.chat.android.network.models.SortParamRequest import io.getstream.chat.android.network.models.UnblockUsersRequest import io.getstream.chat.android.network.models.UpdateChannelPartialRequest import io.getstream.chat.android.network.models.UpdateMemberPartialRequest +import io.getstream.chat.android.network.models.UpdateMessagePartialRequest import io.getstream.chat.android.network.models.UpdatePollOptionRequest import io.getstream.chat.android.network.models.UpdatePollPartialRequest +import io.getstream.chat.android.network.models.UpdateReminderRequest import io.getstream.chat.android.network.models.UpdateThreadPartialRequest import io.getstream.chat.android.network.models.UpdateUserGroupRequest import io.getstream.chat.android.network.models.UpdateUserGroupResponse @@ -363,10 +364,10 @@ constructor( ): Call { return messageApi.partialUpdateMessage( messageId = messageId, - body = PartialUpdateMessageRequest( + body = UpdateMessagePartialRequest( set = set.toDto(), unset = unset, - skip_enrich_url = skipEnrichUrl, + skipEnrichUrl = skipEnrichUrl, ), ).mapDomain { response -> response.message.toDomain() @@ -1948,14 +1949,14 @@ constructor( override fun createReminder(messageId: String, remindAt: Date?): Call { return remindersApi.createReminder( messageId = messageId, - body = ReminderRequest(remind_at = remindAt), + body = CreateReminderRequest(remindAt = remindAt), ).mapDomain { it.reminder.toDomain() } } override fun updateReminder(messageId: String, remindAt: Date?): Call { return remindersApi.updateReminder( messageId = messageId, - body = ReminderRequest(remind_at = remindAt), + body = UpdateReminderRequest(remindAt = remindAt), ).mapDomain { it.reminder.toDomain() } } diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/MessageApi.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/MessageApi.kt index 8b34c0e33ce..f77f84a14fa 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/MessageApi.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/MessageApi.kt @@ -17,7 +17,6 @@ package io.getstream.chat.android.client.api2.endpoint import io.getstream.chat.android.client.api.AuthenticatedApi -import io.getstream.chat.android.client.api2.model.requests.PartialUpdateMessageRequest import io.getstream.chat.android.client.api2.model.requests.QueryDraftMessagesRequest import io.getstream.chat.android.client.api2.model.requests.SendMessageRequest import io.getstream.chat.android.client.api2.model.requests.UpdateMessageRequest @@ -35,6 +34,7 @@ import io.getstream.chat.android.network.models.QueryDraftsRequest import io.getstream.chat.android.network.models.QueryReactionsRequest import io.getstream.chat.android.network.models.Response import io.getstream.chat.android.network.models.SendReactionRequest +import io.getstream.chat.android.network.models.UpdateMessagePartialRequest import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET @@ -100,7 +100,7 @@ internal interface MessageApi { @PUT("/messages/{id}") fun partialUpdateMessage( @Path("id") messageId: String, - @Body body: PartialUpdateMessageRequest, + @Body body: UpdateMessagePartialRequest, ): RetrofitCall @DELETE("/messages/{id}") diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/RemindersApi.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/RemindersApi.kt index 267e25b4a17..6b45ee531d8 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/RemindersApi.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/endpoint/RemindersApi.kt @@ -17,12 +17,13 @@ package io.getstream.chat.android.client.api2.endpoint import io.getstream.chat.android.client.api.AuthenticatedApi -import io.getstream.chat.android.client.api2.model.requests.ReminderRequest import io.getstream.chat.android.client.api2.model.response.QueryRemindersResponse import io.getstream.chat.android.client.api2.model.response.ReminderResponse import io.getstream.chat.android.client.call.RetrofitCall +import io.getstream.chat.android.network.models.CreateReminderRequest import io.getstream.chat.android.network.models.QueryRemindersRequest import io.getstream.chat.android.network.models.Response +import io.getstream.chat.android.network.models.UpdateReminderRequest import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.PATCH @@ -54,7 +55,7 @@ internal interface RemindersApi { @POST("/messages/{id}/reminders") fun createReminder( @Path("id") messageId: String, - @Body body: ReminderRequest, + @Body body: CreateReminderRequest, ): RetrofitCall /** @@ -66,7 +67,7 @@ internal interface RemindersApi { @PATCH("/messages/{id}/reminders") fun updateReminder( @Path("id") messageId: String, - @Body body: ReminderRequest, + @Body body: UpdateReminderRequest, ): RetrofitCall /** diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/PartialUpdateMessageRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/PartialUpdateMessageRequest.kt deleted file mode 100644 index 2b48b8d7e6b..00000000000 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/PartialUpdateMessageRequest.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.chat.android.client.api2.model.requests - -import com.squareup.moshi.JsonClass -import io.getstream.chat.android.client.api2.endpoint.MessageApi - -/** - * Used to form a partial message update request. - * @see [MessageApi.partialUpdateMessage] - * - * @param set Sets new field values. - * @param unset Array of field names to unset. - * @param skip_enrich_url If the message should skip enriching the URL. If URl is not enriched, it will not be - * displayed as a link attachment. False by default. - */ -@JsonClass(generateAdapter = true) -internal data class PartialUpdateMessageRequest( - val set: Map, - val unset: List, - val skip_enrich_url: Boolean = false, -) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/ReminderRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/CreateReminderRequest.kt similarity index 63% rename from stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/ReminderRequest.kt rename to stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/CreateReminderRequest.kt index 8703cdbff53..8ce49526c67 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/ReminderRequest.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/CreateReminderRequest.kt @@ -14,15 +14,23 @@ * limitations under the License. */ -package io.getstream.chat.android.client.api2.model.requests +@file:Suppress( + "ArrayInDataClass", + "EnumEntryName", + "RemoveRedundantQualifierName", + "UnusedImport", +) -import com.squareup.moshi.JsonClass -import java.util.Date +package io.getstream.chat.android.network.models + +import com.squareup.moshi.Json /** - * Request object for creating/updating a reminder. * - * @property remind_at The date when the reminder should be sent. */ -@JsonClass(generateAdapter = true) -internal data class ReminderRequest(val remind_at: Date?) + +@com.squareup.moshi.JsonClass(generateAdapter = true) +internal data class CreateReminderRequest( + @Json(name = "remind_at") + val remindAt: java.util.Date? = null, +) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateMessagePartialRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateMessagePartialRequest.kt new file mode 100644 index 00000000000..8ac35b22e51 --- /dev/null +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateMessagePartialRequest.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress( + "ArrayInDataClass", + "EnumEntryName", + "RemoveRedundantQualifierName", + "UnusedImport", +) + +package io.getstream.chat.android.network.models + +import com.squareup.moshi.Json +import kotlin.collections.List +import kotlin.collections.Map + +/** + * + */ + +@com.squareup.moshi.JsonClass(generateAdapter = true) +internal data class UpdateMessagePartialRequest( + @Json(name = "skip_enrich_url") + val skipEnrichUrl: kotlin.Boolean? = null, + + @Json(name = "skip_push") + val skipPush: kotlin.Boolean? = null, + + @Json(name = "unset") + val unset: kotlin.collections.List? = emptyList(), + + @Json(name = "set") + val set: kotlin.collections.Map? = emptyMap(), +) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateReminderRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateReminderRequest.kt new file mode 100644 index 00000000000..261f506bf28 --- /dev/null +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/network/models/UpdateReminderRequest.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress( + "ArrayInDataClass", + "EnumEntryName", + "RemoveRedundantQualifierName", + "UnusedImport", +) + +package io.getstream.chat.android.network.models + +import com.squareup.moshi.Json + +/** + * + */ + +@com.squareup.moshi.JsonClass(generateAdapter = true) +internal data class UpdateReminderRequest( + @Json(name = "remind_at") + val remindAt: java.util.Date? = null, +) diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/MoshiChatApiTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/MoshiChatApiTest.kt index 1de9ddee53d..53ed4345630 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/MoshiChatApiTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/MoshiChatApiTest.kt @@ -52,12 +52,10 @@ import io.getstream.chat.android.client.api2.model.requests.FlagMessageRequest import io.getstream.chat.android.client.api2.model.requests.FlagUserRequest import io.getstream.chat.android.client.api2.model.requests.GuestUserRequest import io.getstream.chat.android.client.api2.model.requests.MuteUserRequest -import io.getstream.chat.android.client.api2.model.requests.PartialUpdateMessageRequest import io.getstream.chat.android.client.api2.model.requests.PartialUpdateUsersRequest import io.getstream.chat.android.client.api2.model.requests.PinnedMessagesRequest import io.getstream.chat.android.client.api2.model.requests.QueryBannedUsersRequest import io.getstream.chat.android.client.api2.model.requests.RejectInviteRequest -import io.getstream.chat.android.client.api2.model.requests.ReminderRequest import io.getstream.chat.android.client.api2.model.requests.SendEventRequest import io.getstream.chat.android.client.api2.model.requests.UpdateCooldownRequest import io.getstream.chat.android.client.api2.model.requests.UpdateLiveLocationRequest @@ -144,6 +142,7 @@ import io.getstream.chat.android.network.models.CastPollVoteRequest import io.getstream.chat.android.network.models.CreateDeviceRequest import io.getstream.chat.android.network.models.CreatePollOptionRequest import io.getstream.chat.android.network.models.CreatePollRequest +import io.getstream.chat.android.network.models.CreateReminderRequest import io.getstream.chat.android.network.models.CreateUserGroupRequest import io.getstream.chat.android.network.models.CreateUserGroupResponse import io.getstream.chat.android.network.models.DeliveredMessagePayload @@ -175,8 +174,10 @@ import io.getstream.chat.android.network.models.UnblockUsersRequest import io.getstream.chat.android.network.models.UnblockUsersResponse import io.getstream.chat.android.network.models.UpdateChannelPartialRequest import io.getstream.chat.android.network.models.UpdateMemberPartialRequest +import io.getstream.chat.android.network.models.UpdateMessagePartialRequest import io.getstream.chat.android.network.models.UpdatePollOptionRequest import io.getstream.chat.android.network.models.UpdatePollPartialRequest +import io.getstream.chat.android.network.models.UpdateReminderRequest import io.getstream.chat.android.network.models.UpdateThreadPartialRequest import io.getstream.chat.android.network.models.UpdateUserGroupRequest import io.getstream.chat.android.network.models.UpdateUserGroupResponse @@ -372,10 +373,10 @@ internal class MoshiChatApiTest { val skipEnrichUrl = randomBoolean() val result = sut.partialUpdateMessage(messageId, set, unset, skipEnrichUrl).await() // then - val expectedRequest = PartialUpdateMessageRequest( + val expectedRequest = UpdateMessagePartialRequest( set = set, unset = unset, - skip_enrich_url = skipEnrichUrl, + skipEnrichUrl = skipEnrichUrl, ) result `should be instance of` expected verify(api, times(1)).partialUpdateMessage(messageId, expectedRequest) @@ -2859,7 +2860,7 @@ internal class MoshiChatApiTest { val remindAt = randomDate() val result = sut.createReminder(messageId, remindAt).await() // then - val expectedBody = ReminderRequest(remind_at = remindAt) + val expectedBody = CreateReminderRequest(remindAt = remindAt) result `should be instance of` expected verify(api, times(1)).createReminder(messageId, expectedBody) } @@ -2878,7 +2879,7 @@ internal class MoshiChatApiTest { val remindAt = randomDate() val result = sut.updateReminder(messageId, remindAt).await() // then - val expectedBody = ReminderRequest(remind_at = remindAt) + val expectedBody = UpdateReminderRequest(remindAt = remindAt) result `should be instance of` expected verify(api, times(1)).updateReminder(messageId, expectedBody) } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageAndReminderRequestAdapterTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageAndReminderRequestAdapterTest.kt new file mode 100644 index 00000000000..ebdcbbe23fd --- /dev/null +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageAndReminderRequestAdapterTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.chat.android.client.parser2 + +import io.getstream.chat.android.client.parser2.testdata.MessageAndReminderRequestTestData +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test + +internal class MessageAndReminderRequestAdapterTest { + private val parser = ParserFactory.createMoshiChatParser() + + @Test + fun `Serialize UpdateMessagePartialRequest with all fields`() { + val json = parser.toJson(MessageAndReminderRequestTestData.updateMessagePartialRequest) + Assertions.assertEquals(MessageAndReminderRequestTestData.updateMessagePartialRequestJson, json) + } + + @Test + fun `Serialize UpdateMessagePartialRequest with default fields`() { + val json = parser.toJson(MessageAndReminderRequestTestData.updateMessagePartialRequestWithDefaults) + Assertions.assertEquals(MessageAndReminderRequestTestData.updateMessagePartialRequestJsonWithDefaults, json) + } + + @Test + fun `Serialize CreateReminderRequest with remind at`() { + val json = parser.toJson(MessageAndReminderRequestTestData.createReminderRequest) + Assertions.assertEquals(MessageAndReminderRequestTestData.createReminderRequestJson, json) + } + + @Test + fun `Serialize CreateReminderRequest without remind at`() { + val json = parser.toJson(MessageAndReminderRequestTestData.createReminderRequestWithDefaults) + Assertions.assertEquals(MessageAndReminderRequestTestData.createReminderRequestJsonWithDefaults, json) + } + + @Test + fun `Serialize UpdateReminderRequest with remind at`() { + val json = parser.toJson(MessageAndReminderRequestTestData.updateReminderRequest) + Assertions.assertEquals(MessageAndReminderRequestTestData.updateReminderRequestJson, json) + } + + @Test + fun `Serialize UpdateReminderRequest without remind at`() { + val json = parser.toJson(MessageAndReminderRequestTestData.updateReminderRequestWithDefaults) + Assertions.assertEquals(MessageAndReminderRequestTestData.updateReminderRequestJsonWithDefaults, json) + } +} diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageAndReminderRequestTestData.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageAndReminderRequestTestData.kt new file mode 100644 index 00000000000..98f9f609db6 --- /dev/null +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageAndReminderRequestTestData.kt @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.chat.android.client.parser2.testdata + +import io.getstream.chat.android.network.models.CreateReminderRequest +import io.getstream.chat.android.network.models.UpdateMessagePartialRequest +import io.getstream.chat.android.network.models.UpdateReminderRequest +import org.intellij.lang.annotations.Language +import java.util.Date + +internal object MessageAndReminderRequestTestData { + + // UpdateMessagePartialRequest + + @Language("JSON") + val updateMessagePartialRequestJson = + """{ + "skip_enrich_url": true, + "skip_push": false, + "unset": [ + "pinned" + ], + "set": { + "text": "updated" + } + }""".withoutWhitespace() + + val updateMessagePartialRequest = UpdateMessagePartialRequest( + skipEnrichUrl = true, + skipPush = false, + unset = listOf("pinned"), + set = mapOf("text" to "updated"), + ) + + @Language("JSON") + val updateMessagePartialRequestJsonWithDefaults = + """{ + "unset": [], + "set": {} + }""".withoutWhitespace() + + val updateMessagePartialRequestWithDefaults = UpdateMessagePartialRequest() + + // CreateReminderRequest + + private val remindAt = Date(1591787071588) + + @Language("JSON") + val createReminderRequestJson = + """{ + "remind_at": "2020-06-10T11:04:31.588Z" + }""".withoutWhitespace() + + val createReminderRequest = CreateReminderRequest(remindAt = remindAt) + + @Language("JSON") + val createReminderRequestJsonWithDefaults = """{}""".withoutWhitespace() + + val createReminderRequestWithDefaults = CreateReminderRequest() + + // UpdateReminderRequest + + @Language("JSON") + val updateReminderRequestJson = + """{ + "remind_at": "2020-06-10T11:04:31.588Z" + }""".withoutWhitespace() + + val updateReminderRequest = UpdateReminderRequest(remindAt = remindAt) + + @Language("JSON") + val updateReminderRequestJsonWithDefaults = """{}""".withoutWhitespace() + + val updateReminderRequestWithDefaults = UpdateReminderRequest() +}