Skip to content

Commit

Permalink
[ECO-5196] Updated Massage.kt, ChatApi.kt, Messages.kt
Browse files Browse the repository at this point in the history
1. Marked message headers as nullable, this is needed for MessageCopy during message update operation
2. Added extension method `copy` to message that returns copy for a message
with text as mandatory and metadata, headers as optional params
3. Refactored messages.update method signature to use MessageCopy, updated
tests accordingly
  • Loading branch information
sacOO7 committed Feb 24, 2025
1 parent 15bea64 commit e253218
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 47 deletions.
8 changes: 4 additions & 4 deletions chat-android/src/main/java/com/ably/chat/ChatApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal class ChatApi(
text = messageJsonObject.requireString(MessageProperty.TEXT),
createdAt = messageJsonObject.requireLong(MessageProperty.CREATED_AT),
metadata = messageJsonObject.getAsJsonObject(MessageProperty.METADATA),
headers = messageJsonObject.get(MessageProperty.HEADERS)?.toMap() ?: mapOf(),
headers = messageJsonObject.get(MessageProperty.HEADERS)?.toMap(),
action = action,
version = messageJsonObject.requireString(MessageProperty.VERSION),
timestamp = messageJsonObject.requireLong(MessageProperty.TIMESTAMP),
Expand Down Expand Up @@ -75,7 +75,7 @@ internal class ChatApi(
text = params.text,
createdAt = createdAt,
metadata = params.metadata ?: MessageMetadata(),
headers = params.headers ?: mapOf(),
headers = params.headers,
action = MessageAction.MESSAGE_CREATE,
version = serial,
timestamp = createdAt,
Expand All @@ -87,7 +87,7 @@ internal class ChatApi(
/**
* Spec: CHA-M8
*/
suspend fun updateMessage(message: Message, params: UpdateMessageParams): Message {
suspend fun updateMessage(message: MessageCopy, params: UpdateMessageParams): Message {
val body = params.toJsonObject()
// CHA-M8c
return makeAuthorizedRequest(
Expand All @@ -105,7 +105,7 @@ internal class ChatApi(
text = params.message.text,
createdAt = message.createdAt,
metadata = params.message.metadata ?: MessageMetadata(),
headers = params.message.headers ?: mapOf(),
headers = params.message.headers,
action = MessageAction.MESSAGE_UPDATE,
version = version,
timestamp = timestamp,
Expand Down
27 changes: 26 additions & 1 deletion chat-android/src/main/java/com/ably/chat/Message.kt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ data class Message(
* Do not use the headers for authoritative information. There is no server-side
* validation. When reading the headers treat them like user input.
*/
val headers: MessageHeaders,
val headers: MessageHeaders?,

/**
* The latest action of the message. This can be used to determine if the message was created, updated, or deleted.
Expand All @@ -97,6 +97,31 @@ data class Message(
val operation: Message.Operation? = null,
)

fun com.ably.chat.Message.copy(text: String, metadata: MessageMetadata? = null, headers: MessageHeaders? = null): MessageCopy {
return MessageCopy(
message = this,
text = text,
metadata = metadata,
headers = headers,
)
}

data class MessageCopy(
val message: com.ably.chat.Message,
val text: String,
val metadata: MessageMetadata? = null,
val headers: MessageHeaders? = null,
) {
val serial: String = message.serial
val clientId: String = message.clientId
val roomId: String = message.roomId
val createdAt: Long = message.createdAt
val action: MessageAction = message.action
val version: String = message.version
val timestamp: Long = message.timestamp
val operation: Message.Operation? = message.operation
}

fun buildMessageOperation(jsonObject: JsonObject?): Message.Operation? {
if (jsonObject == null) {
return null
Expand Down
51 changes: 21 additions & 30 deletions chat-android/src/main/java/com/ably/chat/Messages.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,21 +79,11 @@ interface Messages : EmitsDiscontinuities {
* Spec: CHA-M8
*
* @param message The message to update.
* @param text The new text of the message.
* @param opDescription Optional description for the update action.
* @param opMetadata Optional metadata for the update action.
* @param metadata Optional metadata of the message.
* @param headers Optional headers of the message.
* @param operationDescription Optional description for the update action.
* @param operationMetadata Optional metadata for the update action.
* @returns updated message.
*/
suspend fun update(
message: Message,
text: String,
opDescription: String? = null,
opMetadata: OperationMetadata? = null,
metadata: MessageMetadata? = null,
headers: MessageHeaders? = null,
): Message
suspend fun update(message: MessageCopy, operationDescription: String? = null, operationMetadata: OperationMetadata? = null): Message

/**
* Delete a message in the chat room.
Expand All @@ -109,11 +99,11 @@ interface Messages : EmitsDiscontinuities {
*
* @returns when the message is deleted.
* @param message - The message to delete.
* @param opDescription - Optional description for the delete action.
* @param opMetadata - Optional metadata for the delete action.
* @param operationDescription - Optional description for the delete action.
* @param operationMetadata - Optional metadata for the delete action.
* @return A promise that resolves to the deleted message.
*/
suspend fun delete(message: Message, opDescription: String? = null, opMetadata: OperationMetadata? = null): Message
suspend fun delete(message: Message, operationDescription: String? = null, operationMetadata: OperationMetadata? = null): Message

/**
* An interface for listening to new messaging event
Expand Down Expand Up @@ -374,7 +364,7 @@ internal class DefaultMessages(
serial = pubSubMessage.serial,
text = data.text,
metadata = data.metadata,
headers = pubSubMessage.extras.asJsonObject().get("headers")?.toMap() ?: mapOf(),
headers = pubSubMessage.extras.asJsonObject().get("headers")?.toMap(),
action = pubSubMessage.action,
version = pubSubMessage.version,
timestamp = pubSubMessage.timestamp,
Expand Down Expand Up @@ -417,27 +407,28 @@ internal class DefaultMessages(
)

override suspend fun update(
message: Message,
text: String,
opDescription: String?,
opMetadata: OperationMetadata?,
metadata: MessageMetadata?,
headers: MessageHeaders?,
messageCopy: MessageCopy,
operationDescription: String?,
operationMetadata: OperationMetadata?,
): Message = chatApi.updateMessage(
message,
messageCopy,
UpdateMessageParams(
message = SendMessageParams(text, metadata, headers),
description = opDescription,
metadata = opMetadata,
message = SendMessageParams(messageCopy.text, messageCopy.metadata, messageCopy.headers),
description = operationDescription,
metadata = operationMetadata,
),
)

override suspend fun delete(message: Message, opDescription: String?, opMetadata: OperationMetadata?): Message =
override suspend fun delete(
message: Message,
operationDescription: String?,
operationMetadata: OperationMetadata?,
): Message =
chatApi.deleteMessage(
message,
DeleteMessageParams(
description = opDescription,
metadata = opMetadata,
description = operationDescription,
metadata = operationMetadata,
),
)

Expand Down
4 changes: 2 additions & 2 deletions chat-android/src/test/java/com/ably/chat/ChatApiTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class ChatApiTest {
text = "hello",
createdAt = 1_000_000L,
metadata = null,
headers = mapOf(),
headers = null,
action = MessageAction.MESSAGE_CREATE,
version = "timeserial",
timestamp = 1_000_000L,
Expand Down Expand Up @@ -105,7 +105,7 @@ class ChatApiTest {
clientId = "clientId",
text = "hello",
createdAt = 1_000_000L,
headers = mapOf(),
headers = null,
metadata = MessageMetadata(),
action = MessageAction.MESSAGE_CREATE,
version = "timeserial",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.ably.chat.MessageMetadata
import com.ably.chat.RoomOptions
import com.ably.chat.RoomStatus
import com.ably.chat.assertWaiter
import com.ably.chat.copy
import io.ably.lib.types.MessageAction
import java.util.UUID
import kotlinx.coroutines.CompletableDeferred
Expand Down Expand Up @@ -162,17 +163,16 @@ class MessagesIntegrationTest {
val updatedText = "hello updated"
val updatedMetadata = MessageMetadata()
updatedMetadata.addProperty("foo", "baz")
val description = "Updating message"
val opMetadata = mapOf("operation" to "update")
val headers = mapOf("headerKey" to "headerValue")

val opDescription = "Updating message"
val opMetadata = mapOf("operation" to "update")

val messageCopy = sentMessage.copy(updatedText, updatedMetadata, headers)
val updatedMessage = room.messages.update(
message = sentMessage,
text = updatedText,
opDescription = description,
opMetadata = opMetadata,
metadata = updatedMetadata,
headers = headers,
message = messageCopy,
opDescription,
opMetadata,
)

assertEquals(MessageAction.MESSAGE_UPDATE, updatedMessage.action)
Expand Down Expand Up @@ -223,8 +223,8 @@ class MessagesIntegrationTest {

val deletedMessage = room.messages.delete(
message = sentMessage,
opDescription = description,
opMetadata = opMetadata,
operationDescription = description,
operationMetadata = opMetadata,
)

assertEquals(MessageAction.MESSAGE_DELETE, deletedMessage.action)
Expand Down

0 comments on commit e253218

Please sign in to comment.