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 06e1d77f5c7f..c00da5c2ab9a 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 @@ -277,7 +277,7 @@ constructor( channelType = channelType, channelId = channelId, message = SendMessageRequest( - message = with(dtoMapping) { message.toDto() }, + message = with(dtoMapping) { message.toMessageRequest() }, skip_push = message.skipPushNotification, skip_enrich_url = message.skipEnrichUrl, ), @@ -293,7 +293,7 @@ constructor( channelType = channelType, channelId = channelId, message = SendMessageRequest( - message = with(dtoMapping) { message.toDto() }, + message = with(dtoMapping) { message.toMessageRequest() }, ), ).mapDomain { response -> response.draft.toDomain() @@ -348,7 +348,7 @@ constructor( return messageApi.updateMessage( messageId = message.id, message = UpdateMessageRequest( - message = with(dtoMapping) { message.toDto() }, + message = with(dtoMapping) { message.toMessageRequest() }, skip_enrich_url = message.skipEnrichUrl, skip_push = message.skipPushNotification, ), @@ -1129,7 +1129,7 @@ constructor( return channelApi.truncateChannel( channelType = channelType, channelId = channelId, - body = with(dtoMapping) { TruncateChannelRequest(message = systemMessage?.toDto()) }, + body = with(dtoMapping) { TruncateChannelRequest(message = systemMessage?.toMessageRequest()) }, ).map(this::flattenChannel) } diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt index b8fca3a72988..54b93882f6d7 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt @@ -29,7 +29,6 @@ import io.getstream.chat.android.client.api2.model.dto.TypingIndicatorsDto import io.getstream.chat.android.client.api2.model.dto.UpstreamConnectedEventDto import io.getstream.chat.android.client.api2.model.dto.UpstreamLocationDto import io.getstream.chat.android.client.api2.model.dto.UpstreamMemberDataDto -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto import io.getstream.chat.android.client.api2.model.dto.UpstreamMuteDto import io.getstream.chat.android.client.api2.model.dto.UpstreamUserDto import io.getstream.chat.android.client.events.ConnectedEvent @@ -109,43 +108,6 @@ internal class DtoMapping( extraData = extraData, ) - /** - * Transforms [Message] to [UpstreamMessageDto]. - */ - internal fun Message.toDto(): UpstreamMessageDto = - messageTransformer.transform(this) - .run { - val upstreamType = if (type in supportedUpstreamMessageTypes) type else "" - UpstreamMessageDto( - attachments = attachments.map { it.toDto() }, - cid = cid, - command = command, - args = null, - html = html, - id = id, - type = upstreamType, - mentioned_users = mentionedUsersIds, - mentioned_here = mentionedHere, - mentioned_channel = mentionedChannel, - mentioned_group_ids = mentionedGroups.map(UserGroup::id), - mentioned_roles = mentionedRoles, - parent_id = parentId, - pin_expires = pinExpires, - pinned = pinned, - pinned_at = pinnedAt, - pinned_by = pinnedBy?.toDto(), - quoted_message_id = replyMessageId, - shadowed = shadowed, - show_in_channel = showInChannel, - silent = silent, - text = text, - thread_participants = threadParticipants.map { it.toDto() }, - restricted_visibility = restrictedVisibility, - shared_location = sharedLocation?.toDto(), - extraData = extraData, - ) - } - internal fun Location.toDto(): UpstreamLocationDto = UpstreamLocationDto( latitude = latitude, longitude = longitude, @@ -248,29 +210,21 @@ internal class DtoMapping( ) } - internal fun DraftMessage.toDto(): UpstreamMessageDto = UpstreamMessageDto( - attachments = attachments.map { it.toDto() }, - cid = cid, - command = command, - args = args, + /** + * Maps the domain [DraftMessage] to the generated network [MessageRequest] model. The draft endpoint + * takes the same request body as sending a message. + */ + internal fun DraftMessage.toMessageRequest(): MessageRequest = MessageRequest( id = id, - html = "", - mentioned_users = mentionedUsersIds, - parent_id = parentId, - pin_expires = null, - pinned = null, - pinned_at = null, - pinned_by = null, - quoted_message_id = replyMessage?.id, - shadowed = false, - show_in_channel = showInChannel, - silent = silent, text = text, - type = "regular", - thread_participants = emptyList(), - restricted_visibility = emptyList(), - shared_location = null, - extraData = extraData, + type = MessageRequest.Type.Regular, + attachments = attachments.map { it.toAttachmentRequest() }, + mentionedUsers = mentionedUsersIds, + parentId = parentId, + quotedMessageId = replyMessage?.id, + showInChannel = showInChannel, + silent = silent, + custom = extraData, ) /** diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt index f336215f704b..18a8c60576e8 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt @@ -21,44 +21,6 @@ import io.getstream.chat.android.core.internal.StreamHandsOff import io.getstream.chat.android.network.models.Attachment import java.util.Date -/** - * See [io.getstream.chat.android.client.parser2.adapters.UpstreamMessageDtoAdapter] for - * special [extraData] handling. - */ -@StreamHandsOff( - reason = "Field names can't be changed because [CustomObjectDtoAdapter] class uses reflections to add/remove " + - "content of [extraData] map", -) -@JsonClass(generateAdapter = true) -internal data class UpstreamMessageDto( - val attachments: List, - val cid: String, - val command: String?, - val args: String?, - val html: String, - val id: String, - val type: String, - val mentioned_users: List, - val mentioned_here: Boolean = false, - val mentioned_channel: Boolean = false, - val mentioned_group_ids: List = emptyList(), - val mentioned_roles: List = emptyList(), - val parent_id: String?, - val pin_expires: Date?, - val pinned: Boolean?, - val pinned_at: Date?, - val pinned_by: UpstreamUserDto?, - val quoted_message_id: String?, - val shadowed: Boolean, - val show_in_channel: Boolean, - val silent: Boolean, - val text: String, - val thread_participants: List, - val restricted_visibility: List, - val shared_location: UpstreamLocationDto?, - val extraData: Map, -) : ExtraDataDto - /** * See [io.getstream.chat.android.client.parser2.adapters.DownstreamMessageDtoAdapter] for * special [extraData] handling. diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/SendMessageRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/SendMessageRequest.kt index de76cddc85bc..f0d4a9e4ab80 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/SendMessageRequest.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/SendMessageRequest.kt @@ -18,7 +18,7 @@ package io.getstream.chat.android.client.api2.model.requests import com.squareup.moshi.JsonClass import io.getstream.chat.android.client.api2.endpoint.MessageApi -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto +import io.getstream.chat.android.network.models.MessageRequest /** * Used to form a send message request. @@ -32,7 +32,7 @@ import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto // REST documentation: https://getstream.io/chat/docs/rest/#messages-sendmessage @JsonClass(generateAdapter = true) internal data class SendMessageRequest( - val message: UpstreamMessageDto, + val message: MessageRequest, val skip_push: Boolean = false, val skip_enrich_url: Boolean = false, ) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/TruncateChannelRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/TruncateChannelRequest.kt index 750459b938df..7b93b1632a4e 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/TruncateChannelRequest.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/TruncateChannelRequest.kt @@ -17,7 +17,7 @@ package io.getstream.chat.android.client.api2.model.requests import com.squareup.moshi.JsonClass -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto +import io.getstream.chat.android.network.models.MessageRequest /** * Represents the body part of the truncate channel request. @@ -26,5 +26,5 @@ import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto */ @JsonClass(generateAdapter = true) internal data class TruncateChannelRequest( - val message: UpstreamMessageDto?, + val message: MessageRequest?, ) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/UpdateMessageRequest.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/UpdateMessageRequest.kt index 48e8f742e4b0..47bab542a444 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/UpdateMessageRequest.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/UpdateMessageRequest.kt @@ -18,7 +18,7 @@ package io.getstream.chat.android.client.api2.model.requests import com.squareup.moshi.JsonClass import io.getstream.chat.android.client.api2.endpoint.MessageApi -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto +import io.getstream.chat.android.network.models.MessageRequest /** * Used to form an update message request. @@ -31,7 +31,7 @@ import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto * */ @JsonClass(generateAdapter = true) internal data class UpdateMessageRequest( - val message: UpstreamMessageDto, + val message: MessageRequest, val skip_enrich_url: Boolean = false, val skip_push: Boolean = false, ) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt index c265afdffde6..40f11127a7ed 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/MoshiChatParser.kt @@ -64,7 +64,6 @@ import io.getstream.chat.android.client.parser2.adapters.ReactionResponseAdapter import io.getstream.chat.android.client.parser2.adapters.UpdatePollOptionRequestAdapter import io.getstream.chat.android.client.parser2.adapters.UpdatePollRequestAdapter import io.getstream.chat.android.client.parser2.adapters.UpstreamMemberDataDtoAdapter -import io.getstream.chat.android.client.parser2.adapters.UpstreamMessageDtoAdapter import io.getstream.chat.android.client.parser2.adapters.UpstreamReactionDtoAdapter import io.getstream.chat.android.client.parser2.adapters.UpstreamUserDtoAdapter import io.getstream.chat.android.client.parser2.adapters.UserRequestAdapter @@ -98,7 +97,6 @@ internal class MoshiChatParser( .add(EventAdapterFactory()) .add(DownstreamMessageDtoAdapter) .add(DownstreamModerationDetailsDtoAdapter) - .add(UpstreamMessageDtoAdapter) .add(DownstreamChannelDtoAdapter) .add(AttachmentDtoAdapter) .add(DownstreamReactionDtoAdapter) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/MessageDtoAdapters.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/DownstreamMessageDtoAdapter.kt similarity index 70% rename from stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/MessageDtoAdapters.kt rename to stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/DownstreamMessageDtoAdapter.kt index 6a2d90ad20f9..6c19aed52ccf 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/MessageDtoAdapters.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/DownstreamMessageDtoAdapter.kt @@ -22,7 +22,6 @@ import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter import com.squareup.moshi.ToJson import io.getstream.chat.android.client.api2.model.dto.DownstreamMessageDto -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto internal object DownstreamMessageDtoAdapter : CustomObjectDtoAdapter(DownstreamMessageDto::class) { @@ -38,19 +37,3 @@ internal object DownstreamMessageDtoAdapter : @Suppress("UNUSED_PARAMETER") fun toJson(jsonWriter: JsonWriter, value: DownstreamMessageDto): Unit = error("Can't convert this to Json") } - -internal object UpstreamMessageDtoAdapter : - CustomObjectDtoAdapter(UpstreamMessageDto::class) { - - @FromJson - @Suppress("UNUSED_PARAMETER") - fun fromJson(jsonReader: JsonReader): UpstreamMessageDto = error("Can't parse this from Json") - - @ToJson - fun toJson( - jsonWriter: JsonWriter, - message: UpstreamMessageDto?, - mapAdapter: JsonAdapter>, - messageAdapter: JsonAdapter, - ) = serializeWithExtraData(jsonWriter, message, mapAdapter, messageAdapter) -} diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt index 041f8b636013..6a873e135cd8 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt @@ -28,7 +28,6 @@ import io.getstream.chat.android.client.api2.model.dto.ReadReceiptsDto import io.getstream.chat.android.client.api2.model.dto.TypingIndicatorsDto import io.getstream.chat.android.client.api2.model.dto.UpstreamConnectedEventDto import io.getstream.chat.android.client.api2.model.dto.UpstreamMemberDataDto -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto import io.getstream.chat.android.client.api2.model.dto.UpstreamMuteDto import io.getstream.chat.android.client.api2.model.dto.UpstreamUserDto import io.getstream.chat.android.client.test.randomConnectedEvent @@ -53,7 +52,9 @@ import io.getstream.chat.android.randomMemberData import io.getstream.chat.android.randomMessage import io.getstream.chat.android.randomMute import io.getstream.chat.android.randomReaction +import io.getstream.chat.android.randomString import io.getstream.chat.android.randomUser +import io.getstream.chat.android.randomUserGroup import org.amshove.kluent.shouldBeEqualTo import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest @@ -119,77 +120,32 @@ internal class DtoMappingTest { } @Test - fun `DraftMessage is correctly mapped to Dto`() { - val message = randomDraftMessage() - val mapping = Fixture().get() - val dto = with(mapping) { message.toDto() } - val expected = UpstreamMessageDto( - attachments = message.attachments.map { with(mapping) { it.toDto() } }, - cid = message.cid, - command = message.command, - args = message.args, - html = "", - id = message.id, - type = "regular", - mentioned_users = message.mentionedUsersIds, - parent_id = message.parentId, - pin_expires = null, - pinned = null, - pinned_at = null, - pinned_by = null, - quoted_message_id = message.replyMessage?.id, - shadowed = false, - show_in_channel = message.showInChannel, - silent = message.silent, - text = message.text, - thread_participants = emptyList(), - restricted_visibility = emptyList(), - shared_location = null, - extraData = message.extraData, + fun `DraftMessage is correctly mapped to the generated request model`() { + // Pinned rather than random: an empty extraData or a random `silent` would let a mapper + // that drops either of them pass. + val message = randomDraftMessage( + silent = true, + extraData = mapOf("draftKey" to "draftValue"), + attachments = listOf(randomAttachment()), + mentionedUsers = listOf(randomUser()), ) - dto shouldBeEqualTo expected - } + val mapping = Fixture().get() - @Test - fun `Message is correctly mapped to Dto`() { - val messageTransformer = spy(NoOpMessageTransformer) - val message = randomMessage(type = MessageType.REGULAR) - val mapping = Fixture() - .withMessageTransformer(messageTransformer) - .get() - val dto = with(mapping) { message.toDto() } - val expected = UpstreamMessageDto( - attachments = message.attachments.map { with(mapping) { it.toDto() } }, - cid = message.cid, - command = message.command, - args = null, - html = message.html, + val request = with(mapping) { message.toMessageRequest() } + + val expected = MessageRequest( id = message.id, - type = message.type, - mentioned_users = message.mentionedUsersIds, - mentioned_here = message.mentionedHere, - mentioned_channel = message.mentionedChannel, - mentioned_roles = message.mentionedRoles, - mentioned_group_ids = message.mentionedGroups.map(UserGroup::id), - parent_id = message.parentId, - pin_expires = message.pinExpires, - pinned = message.pinned, - pinned_at = message.pinnedAt, - pinned_by = message.pinnedBy?.let { with(mapping) { it.toDto() } }, - quoted_message_id = message.replyMessageId, - shadowed = message.shadowed, - show_in_channel = message.showInChannel, - silent = message.silent, text = message.text, - thread_participants = message.threadParticipants.map { with(mapping) { it.toDto() } }, - restricted_visibility = message.restrictedVisibility, - shared_location = message.sharedLocation?.let { with(mapping) { it.toDto() } }, - extraData = message.extraData, + type = MessageRequest.Type.Regular, + attachments = message.attachments.map { with(mapping) { it.toAttachmentRequest() } }, + mentionedUsers = message.mentionedUsersIds, + parentId = message.parentId, + quotedMessageId = message.replyMessage?.id, + showInChannel = message.showInChannel, + silent = message.silent, + custom = message.extraData, ) - - dto shouldBeEqualTo expected - // Verify the transformer is called - verify(messageTransformer, times(1)).transform(message) + request shouldBeEqualTo expected } @Test @@ -269,7 +225,19 @@ internal class DtoMappingTest { @Test fun `Message is correctly mapped to the generated request model`() { - val message = randomMessage(type = MessageType.REGULAR) + // Pinned rather than random: the helper leaves attachments empty, which would let a mapper + // that drops them pass. + // Every collection is populated: the helper leaves them empty, so a mapper that drops one + // maps to the same empty list the assertion expects. + val message = randomMessage( + type = MessageType.REGULAR, + extraData = mutableMapOf("messageKey" to "messageValue"), + attachments = listOf(randomAttachment()), + mentionedUsers = listOf(randomUser()), + mentionedGroups = listOf(randomUserGroup()), + mentionedRoles = listOf(randomString()), + restrictedVisibility = listOf(randomString()), + ) val messageTransformer = spy(NoOpMessageTransformer) val mapping = Fixture().withMessageTransformer(messageTransformer).get() @@ -292,6 +260,7 @@ internal class DtoMappingTest { request.showInChannel shouldBeEqualTo message.showInChannel request.silent shouldBeEqualTo message.silent request.restrictedVisibility shouldBeEqualTo message.restrictedVisibility + request.sharedLocation shouldBeEqualTo with(mapping) { message.sharedLocation?.toSharedLocation() } request.custom shouldBeEqualTo message.extraData verify(messageTransformer, times(1)).transform(message) } @@ -310,17 +279,6 @@ internal class DtoMappingTest { request.type shouldBeEqualTo MessageRequest.Type.fromString(expectedType) } - @ParameterizedTest - @MethodSource("messageTypeCoercionInput") - fun `Message toDto coerces type to allowed upstream values`(inputType: String, expectedType: String) { - val message = randomMessage(type = inputType) - val mapping = Fixture().get() - - val dto = with(mapping) { message.toDto() } - - dto.type shouldBeEqualTo expectedType - } - @Test fun `Mute is correctly mapped to Dto`() { val mute = randomMute() diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/UpstreamMessageDtoAdapterTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageRequestAdapterTest.kt similarity index 88% rename from stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/UpstreamMessageDtoAdapterTest.kt rename to stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageRequestAdapterTest.kt index 70f2eb7ff76a..ad8cd54a1caf 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/UpstreamMessageDtoAdapterTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/MessageRequestAdapterTest.kt @@ -16,17 +16,17 @@ package io.getstream.chat.android.client.parser2 -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto import io.getstream.chat.android.client.parser2.testdata.MessageDtoTestData.upstreamJson import io.getstream.chat.android.client.parser2.testdata.MessageDtoTestData.upstreamJsonWithoutExtraData import io.getstream.chat.android.client.parser2.testdata.MessageDtoTestData.upstreamMessage import io.getstream.chat.android.client.parser2.testdata.MessageDtoTestData.upstreamMessageWithoutExtraData +import io.getstream.chat.android.network.models.MessageRequest import io.kotest.assertions.json.shouldEqualJson import org.amshove.kluent.invoking import org.amshove.kluent.shouldThrow import org.junit.jupiter.api.Test -internal class UpstreamMessageDtoAdapterTest { +internal class MessageRequestAdapterTest { private val parser = ParserFactory.createMoshiChatParser() @Test @@ -42,9 +42,9 @@ internal class UpstreamMessageDtoAdapterTest { } @Test - fun `Can't parse upstream message`() { + fun `Can't parse message request`() { invoking { - parser.fromJson(upstreamJson, UpstreamMessageDto::class.java) + parser.fromJson(upstreamJson, MessageRequest::class.java) }.shouldThrow(RuntimeException::class) } } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageDtoTestData.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageDtoTestData.kt index 8952f0c8ee33..3e8ab311505b 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageDtoTestData.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageDtoTestData.kt @@ -20,7 +20,7 @@ import io.getstream.chat.android.client.api2.model.dto.DownstreamMessageDto import io.getstream.chat.android.client.api2.model.dto.DownstreamModerationDetailsDto import io.getstream.chat.android.client.api2.model.dto.DownstreamReactionGroupDto import io.getstream.chat.android.client.api2.model.dto.DownstreamUserGroupDto -import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto +import io.getstream.chat.android.network.models.MessageRequest import org.intellij.lang.annotations.Language import java.util.Date @@ -391,25 +391,49 @@ internal object MessageDtoTestData { deleted_for_me = null, ) + /** + * The request body as the generated model serialises it: custom data flattened to the root, and + * none of the legacy fields the server discards (`cid`, `html`, `shadowed`, `thread_participants`). + */ @Language("JSON") val upstreamJson = """{ - "attachments": [${AttachmentDtoTestData.json}], - "cid": "cid", - "html": "html", "id": "8584452-6d711169-0224-41c2-b9aa-1adbe624521b", + "text": "text", "type": "regular", + "attachments": [ + { + "asset_url": "assetUrl", + "author_name": "authorName", + "author_link": "authorLink", + "fallback": "fallback", + "image_url": "imageUrl", + "og_scrape_url": "ogScrapeUrl", + "text": "text", + "thumb_url": "thumbUrl", + "title": "title", + "title_link": "titleLink", + "type": "type", + "original_height": 100, + "original_width": 100, + "actions": [], + "fields": [], + "draft": true, + "file_size": 1.0, + "image": "image", + "mime_type": "mimeType", + "name": "name" + } + ], "mentioned_users": [], "mentioned_here": false, "mentioned_channel": false, "mentioned_group_ids": [], "mentioned_roles": [], "pinned": true, - "shadowed": false, "show_in_channel": false, "silent": false, - "text": "text", - "thread_participants": [], + "restricted_visibility": [], "extraData": { "key1": "value1", "key2": true, @@ -423,92 +447,67 @@ internal object MessageDtoTestData { "a", "b", "c" - ], - "restricted_visibility": ["jc"] + ] }""".withoutWhitespace() - val upstreamMessage = UpstreamMessageDto( + + val upstreamMessage = MessageRequest( id = "8584452-6d711169-0224-41c2-b9aa-1adbe624521b", - type = "regular", - cid = "cid", text = "text", - html = "html", - parent_id = null, - command = null, - args = null, + type = MessageRequest.Type.Regular, + attachments = listOf(AttachmentDtoTestData.generatedAttachment), + mentionedUsers = emptyList(), + mentionedHere = false, + mentionedChannel = false, + mentionedGroupIds = emptyList(), + mentionedRoles = emptyList(), + pinned = true, + showInChannel = false, silent = false, - shadowed = false, - extraData = mapOf( + restrictedVisibility = emptyList(), + custom = mapOf( "extraData" to mapOf( "key1" to "value1", "key2" to true, - "key3" to mapOf( - "key4" to "val4", - ), + "key3" to mapOf("key4" to "val4"), ), "customKey1" to "customVal1", "customKey2" to true, - "customKey3" to listOf( - "a", - "b", - "c", - ), + "customKey3" to listOf("a", "b", "c"), ), - show_in_channel = false, - mentioned_users = emptyList(), - thread_participants = emptyList(), - attachments = listOf(AttachmentDtoTestData.attachment), - quoted_message_id = null, - pinned = true, - pinned_by = null, - pinned_at = null, - pin_expires = null, - restricted_visibility = listOf("jc"), - shared_location = null, ) @Language("JSON") val upstreamJsonWithoutExtraData = """{ - "attachments": [], - "cid": "cid", - "html": "", "id": "8584452-6d711169-0224-41c2-b9aa-1adbe624521b", + "text": "", "type": "regular", + "attachments": [], "mentioned_users": [], "mentioned_here": false, "mentioned_channel": false, "mentioned_group_ids": [], "mentioned_roles": [], "pinned": false, - "shadowed": false, "show_in_channel": false, "silent": false, - "text": "", - "thread_participants": [], "restricted_visibility": [] }""".withoutWhitespace() - val upstreamMessageWithoutExtraData = UpstreamMessageDto( + + val upstreamMessageWithoutExtraData = MessageRequest( id = "8584452-6d711169-0224-41c2-b9aa-1adbe624521b", - type = "regular", - cid = "cid", text = "", - html = "", - parent_id = null, - command = null, - args = null, - silent = false, - shadowed = false, - extraData = emptyMap(), - show_in_channel = false, - mentioned_users = emptyList(), - thread_participants = emptyList(), + type = MessageRequest.Type.Regular, attachments = emptyList(), - quoted_message_id = null, + mentionedUsers = emptyList(), + mentionedHere = false, + mentionedChannel = false, + mentionedGroupIds = emptyList(), + mentionedRoles = emptyList(), pinned = false, - pinned_by = null, - pinned_at = null, - pin_expires = null, - restricted_visibility = emptyList(), - shared_location = null, + showInChannel = false, + silent = false, + restrictedVisibility = emptyList(), + custom = emptyMap(), ) }