Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ import io.getstream.chat.android.client.api2.model.dto.DisconnectedEventDto
import io.getstream.chat.android.client.api2.model.dto.ErrorEventDto
import io.getstream.chat.android.client.api2.model.dto.GeneratedEventDto
import io.getstream.chat.android.client.api2.model.dto.HealthEventDto
import io.getstream.chat.android.client.api2.model.dto.MessageDeletedEventDto
import io.getstream.chat.android.client.api2.model.dto.MessageUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NewMessageEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationAddedToChannelEventDto
import io.getstream.chat.android.client.api2.model.dto.ReactionDeletedEventDto
Expand Down Expand Up @@ -124,8 +122,10 @@ import io.getstream.chat.android.network.models.DraftUpdatedEvent as GeneratedDr
import io.getstream.chat.android.network.models.MemberAddedEvent as GeneratedMemberAddedEvent
import io.getstream.chat.android.network.models.MemberRemovedEvent as GeneratedMemberRemovedEvent
import io.getstream.chat.android.network.models.MemberUpdatedEvent as GeneratedMemberUpdatedEvent
import io.getstream.chat.android.network.models.MessageDeletedEvent as GeneratedMessageDeletedEvent
import io.getstream.chat.android.network.models.MessageDeliveredEvent as GeneratedMessageDeliveredEvent
import io.getstream.chat.android.network.models.MessageReadEvent as GeneratedMessageReadEvent
import io.getstream.chat.android.network.models.MessageUpdatedEvent as GeneratedMessageUpdatedEvent
import io.getstream.chat.android.network.models.NotificationChannelDeletedEvent as GeneratedNotificationChannelDeletedEvent
import io.getstream.chat.android.network.models.NotificationChannelMutesUpdatedEvent as GeneratedNotificationChannelMutesUpdatedEvent
import io.getstream.chat.android.network.models.NotificationChannelTruncatedEvent as GeneratedNotificationChannelTruncatedEvent
Expand Down Expand Up @@ -183,8 +183,6 @@ internal class EventMapping(
is DisconnectedEventDto -> toDomain()
is ErrorEventDto -> toDomain()
is HealthEventDto -> toDomain()
is MessageDeletedEventDto -> toDomain()
is MessageUpdatedEventDto -> toDomain()
is NotificationAddedToChannelEventDto -> toDomain()
is ReactionDeletedEventDto -> toDomain()
is ReactionNewEventDto -> toDomain()
Expand Down Expand Up @@ -240,21 +238,23 @@ internal class EventMapping(
}

/**
* Transforms [MessageDeletedEventDto] to [MessageDeletedEvent].
* Transforms the generated [GeneratedMessageDeletedEvent] to [MessageDeletedEvent].
*/
private fun MessageDeletedEventDto.toDomain(): MessageDeletedEvent = with(domainMapping) {
MessageDeletedEvent(
private fun GeneratedMessageDeletedEvent.toDomain(): MessageDeletedEvent = with(domainMapping) {
val cid = requireNotNull(cid)
val (channelType, channelId) = cid.cidToTypeAndId()
return MessageDeletedEvent(
type = type,
createdAt = created_at.date,
rawCreatedAt = created_at.rawDate,
createdAt = createdAt.date,
rawCreatedAt = createdAt.raw,
user = user?.toDomain(),
cid = cid,
channelType = channel_type,
channelId = channel_id,
channelType = channelType,
channelId = channelId,
message = message.toDomain(),
hardDelete = hard_delete ?: false,
channelMessageCount = channel_message_count,
deletedForMe = deleted_for_me ?: false,
hardDelete = hardDelete ?: false,
channelMessageCount = channelMessageCount,
deletedForMe = deletedForMe ?: false,
)
}

Expand Down Expand Up @@ -294,17 +294,19 @@ internal class EventMapping(
}

/**
* Transforms [MessageUpdatedEventDto] to [MessageUpdatedEvent].
* Transforms the generated [GeneratedMessageUpdatedEvent] to [MessageUpdatedEvent].
*/
private fun MessageUpdatedEventDto.toDomain(): MessageUpdatedEvent = with(domainMapping) {
MessageUpdatedEvent(
private fun GeneratedMessageUpdatedEvent.toDomain(): MessageUpdatedEvent = with(domainMapping) {
val cid = requireNotNull(cid)
val (channelType, channelId) = cid.cidToTypeAndId()
return MessageUpdatedEvent(
type = type,
createdAt = created_at.date,
rawCreatedAt = created_at.rawDate,
user = user.toDomain(),
createdAt = createdAt.date,
rawCreatedAt = createdAt.raw,
user = requireNotNull(user).toDomain(),
cid = cid,
channelType = channel_type,
channelId = channel_id,
channelType = channelType,
channelId = channelId,
message = message.toDomain(),
)
}
Expand Down Expand Up @@ -539,6 +541,8 @@ internal class EventMapping(
is GeneratedUserDeletedEvent -> toDomain()
is GeneratedMessageReadEvent -> toDomain()
is GeneratedMessageDeliveredEvent -> toDomain()
is GeneratedMessageDeletedEvent -> toDomain()
is GeneratedMessageUpdatedEvent -> toDomain()
is GeneratedNotificationMarkReadEvent -> toDomain()
is GeneratedChannelUpdatedEvent -> toDomain()
is GeneratedChannelTruncatedEvent -> toDomain()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,31 +59,6 @@ internal data class HealthEventDto(
val connection_id: String,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
internal data class MessageDeletedEventDto(
val type: String,
val created_at: ExactDate,
val user: DownstreamUserDto?,
val cid: String,
val channel_type: String,
val channel_id: String,
val message: DownstreamMessageDto,
val hard_delete: Boolean?,
val channel_message_count: Int? = null,
val deleted_for_me: Boolean? = null,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
internal data class MessageUpdatedEventDto(
val type: String,
val created_at: ExactDate,
val user: DownstreamUserDto,
val cid: String,
val channel_type: String,
val channel_id: String,
val message: DownstreamMessageDto,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
internal data class NewMessageEventDto(
val type: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ import io.getstream.chat.android.client.api2.model.dto.ConnectionErrorEventDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamUserDto
import io.getstream.chat.android.client.api2.model.dto.GeneratedEventDto
import io.getstream.chat.android.client.api2.model.dto.HealthEventDto
import io.getstream.chat.android.client.api2.model.dto.MessageDeletedEventDto
import io.getstream.chat.android.client.api2.model.dto.MessageUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NewMessageEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationAddedToChannelEventDto
import io.getstream.chat.android.client.api2.model.dto.ReactionDeletedEventDto
Expand All @@ -52,8 +50,10 @@ import io.getstream.chat.android.network.models.DraftUpdatedEvent
import io.getstream.chat.android.network.models.MemberAddedEvent
import io.getstream.chat.android.network.models.MemberRemovedEvent
import io.getstream.chat.android.network.models.MemberUpdatedEvent
import io.getstream.chat.android.network.models.MessageDeletedEvent
import io.getstream.chat.android.network.models.MessageDeliveredEvent
import io.getstream.chat.android.network.models.MessageReadEvent
import io.getstream.chat.android.network.models.MessageUpdatedEvent
import io.getstream.chat.android.network.models.NotificationChannelDeletedEvent
import io.getstream.chat.android.network.models.NotificationChannelMutesUpdatedEvent
import io.getstream.chat.android.network.models.NotificationChannelTruncatedEvent
Expand Down Expand Up @@ -113,8 +113,9 @@ internal class EventDtoAdapter(
private val draftMessageUpdatedEventAdapter = generatedEventAdapter<DraftUpdatedEvent> { mapOf("draft" to draft) }
private val draftMessageDeletedEventAdapter = generatedEventAdapter<DraftDeletedEvent> { mapOf("draft" to draft) }
private val newMessageEventAdapter = moshi.adapter(NewMessageEventDto::class.java)
private val messageDeletedEventAdapter = moshi.adapter(MessageDeletedEventDto::class.java)
private val messageUpdatedEventAdapter = moshi.adapter(MessageUpdatedEventDto::class.java)
private val messageDeletedEventAdapter = generatedEventAdapter<MessageDeletedEvent> { mapOf("cid" to cid) }
private val messageUpdatedEventAdapter =
generatedEventAdapter<MessageUpdatedEvent> { mapOf("cid" to cid, "user" to user) }
private val messageReadEventAdapter = generatedEventAdapter<MessageReadEvent> {
mapOf("cid" to cid, "channel_type" to channelType, "channel_id" to channelId, "user" to user)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* 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 MessageChangeSet(
@Json(name = "attachments")
internal val attachments: Boolean,

@Json(name = "custom")
internal val custom: Boolean,

@Json(name = "html")
internal val html: Boolean,

@Json(name = "mentioned_user_ids")
internal val mentionedUserIds: Boolean,

@Json(name = "mml")
internal val mml: Boolean,

@Json(name = "pin")
internal val pin: Boolean,

@Json(name = "quoted_message_id")
internal val quotedMessageId: Boolean,

@Json(name = "silent")
internal val silent: Boolean,

@Json(name = "text")
internal val text: Boolean,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* 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

/**
* Emitted when a message is deleted.
*/
@com.squareup.moshi.JsonClass(generateAdapter = true)
internal data class MessageDeletedEvent(
@Json(name = "created_at")
internal val createdAt: io.getstream.chat.android.network.infrastructure.ExactDate,

// Patched: the spec marks `hard_delete` and `message_id` required, but backends before v239.47.0 (CHA-3482,
// chat#17545) replay message.deleted on /sync without them, and a parse failure fails the whole /sync response.
// On regen, make them required again only once every region runs v239.47.0 or later.
@Json(name = "hard_delete")
internal val hardDelete: Boolean? = null,

@Json(name = "message_id")
internal val messageId: String? = null,

@Json(name = "custom")
internal val custom: Map<String, Any?> = emptyMap(),

@Json(name = "message")
internal val message: io.getstream.chat.android.network.models.MessageResponse,

@Json(name = "type")
internal val type: String = "message.deleted",

@Json(name = "channel_id")
internal val channelId: String? = null,

@Json(name = "channel_member_count")
internal val channelMemberCount: Int? = null,

@Json(name = "channel_message_count")
internal val channelMessageCount: Int? = null,

@Json(name = "channel_type")
internal val channelType: String? = null,

@Json(name = "cid")
internal val cid: String? = null,

@Json(name = "deleted_for_me")
internal val deletedForMe: Boolean? = null,

@Json(name = "received_at")
internal val receivedAt: java.util.Date? = null,

@Json(name = "team")
internal val team: String? = null,

@Json(name = "channel_custom")
internal val channelCustom: Map<String, Any?>? = null,

@Json(name = "user")
internal val user: io.getstream.chat.android.network.models.UserResponseCommonFields? = null,
) :
io.getstream.chat.android.network.models.WSClientEvent, io.getstream.chat.android.network.models.WSEvent {

override fun getWSClientEventType(): String {
return type
}

override fun getWSEventType(): String {
return type
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* 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 MessageUpdate(
@Json(name = "old_text")
internal val oldText: String? = null,

@Json(name = "change_set")
internal val changeSet: io.getstream.chat.android.network.models.MessageChangeSet? = null,
)
Loading
Loading