Skip to content

Commit d1300c5

Browse files
authored
Round-trip active command through draft messages (#6389)
* Add command and args fields to DraftMessage. Mirrors the iOS SDK's wire format so an active slash command can be round-tripped through draft messages cross-SDK. * Round-trip command/args for drafts on the wire. DraftMessage.toDto() previously hardcoded command = null; now passes the model's command and args through. DownstreamDraftDto.toDomain() reads the same two fields from the wire payload. UpstreamMessageDto and DownstreamDraftMessageDto gain args; command is reused on UpstreamMessageDto and added to DownstreamDraftMessageDto. * Persist command and args in offline draft cache. * Round-trip active command in draft save/restore.
1 parent 02668d8 commit d1300c5

16 files changed

Lines changed: 423 additions & 50 deletions

File tree

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,8 @@ internal class DomainMapping(
269269
mentionedUsersIds = message.mentioned_users?.map { it.id } ?: emptyList(),
270270
silent = message.silent,
271271
text = message.text,
272+
command = message.command,
273+
args = message.args,
272274
extraData = message.extraData ?: emptyMap(),
273275
)
274276

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ internal class DtoMapping(
125125
attachments = attachments.map { it.toDto() },
126126
cid = cid,
127127
command = command,
128+
args = null,
128129
html = html,
129130
id = id,
130131
type = type,
@@ -156,7 +157,8 @@ internal class DtoMapping(
156157
internal fun DraftMessage.toDto(): UpstreamMessageDto = UpstreamMessageDto(
157158
attachments = attachments.map { it.toDto() },
158159
cid = cid,
159-
command = null,
160+
command = command,
161+
args = args,
160162
id = id,
161163
html = "",
162164
mentioned_users = mentionedUsersIds,

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal data class UpstreamMessageDto(
3333
val attachments: List<AttachmentDto>,
3434
val cid: String,
3535
val command: String?,
36+
val args: String?,
3637
val html: String,
3738
val id: String,
3839
val type: String,
@@ -119,6 +120,8 @@ internal data class DownstreamDraftDto(
119120
internal data class DownstreamDraftMessageDto(
120121
val id: String,
121122
val text: String,
123+
val command: String? = null,
124+
val args: String? = null,
122125
val attachments: List<AttachmentDto>? = null,
123126
val mentioned_users: List<DownstreamUserDto>? = null,
124127
val silent: Boolean = false,

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/database/internal/ChatDatabase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ import io.getstream.chat.android.client.internal.offline.repository.domain.user.
8888
ThreadOrderEntity::class,
8989
DraftMessageEntity::class,
9090
],
91-
version = 102,
91+
version = 103,
9292
exportSchema = false,
9393
)
9494
@TypeConverters(

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/domain/message/internal/DraftMessageEntity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ internal data class DraftMessageEntity(
3232
val silent: Boolean,
3333
val showInChannel: Boolean,
3434
val replyMessageId: String? = null,
35+
val command: String? = null,
36+
val args: String? = null,
3537
val extraData: Map<String, Any> = mapOf(),
3638
)
3739

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/domain/message/internal/MessageMapper.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ internal fun DraftMessage.toEntity(): DraftMessageEntity = DraftMessageEntity(
237237
showInChannel = showInChannel,
238238
replyMessageId = replyMessage?.id,
239239
text = text,
240+
command = command,
241+
args = args,
240242
extraData = extraData,
241243
)
242244

@@ -251,6 +253,8 @@ internal suspend fun DraftMessageEntity.toModel(
251253
showInChannel = showInChannel,
252254
replyMessage = replyMessageId?.let { getMessage(it) },
253255
text = text,
256+
command = command,
257+
args = args,
254258
extraData = extraData,
255259
)
256260

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/Mother.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,13 +261,17 @@ internal object Mother {
261261
fun randomDownstreamDraftMessageDto(
262262
id: String = randomString(),
263263
text: String = randomString(),
264+
command: String? = null,
265+
args: String? = null,
264266
attachments: List<AttachmentDto>? = emptyList(),
265267
mentionedUsers: List<DownstreamUserDto>? = emptyList(),
266268
silent: Boolean = randomBoolean(),
267269
showInChannel: Boolean = randomBoolean(),
268270
): DownstreamDraftMessageDto = DownstreamDraftMessageDto(
269271
id = id,
270272
text = text,
273+
command = command,
274+
args = args,
271275
attachments = attachments,
272276
mentioned_users = mentionedUsers,
273277
silent = silent,

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,12 @@ internal class DomainMappingTest {
166166

167167
@Test
168168
fun `DownstreamDraftDto is correctly mapped to DraftMessage`() {
169-
val draftMessageResponse = randomDownstreamDraftDto()
169+
val draftMessageResponse = randomDownstreamDraftDto(
170+
message = randomDownstreamDraftMessageDto(
171+
command = "giphy",
172+
args = "cat",
173+
),
174+
)
170175
val sut = Fixture()
171176
.get()
172177
val expectedMappedDraftMessage = with(sut) {
@@ -183,6 +188,8 @@ internal class DomainMappingTest {
183188
extraData = draftMessageResponse.message.extraData ?: emptyMap(),
184189
silent = draftMessageResponse.message.silent,
185190
showInChannel = draftMessageResponse.message.show_in_channel,
191+
command = draftMessageResponse.message.command,
192+
args = draftMessageResponse.message.args,
186193
)
187194
}
188195

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ internal class DtoMappingTest {
141141
val expected = UpstreamMessageDto(
142142
attachments = message.attachments.map { with(mapping) { it.toDto() } },
143143
cid = message.cid,
144-
command = null,
144+
command = message.command,
145+
args = message.args,
145146
html = "",
146147
id = message.id,
147148
type = "regular",
@@ -176,6 +177,7 @@ internal class DtoMappingTest {
176177
attachments = message.attachments.map { with(mapping) { it.toDto() } },
177178
cid = message.cid,
178179
command = message.command,
180+
args = null,
179181
html = message.html,
180182
id = message.id,
181183
type = message.type,

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser2/testdata/MessageDtoTestData.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ internal object MessageDtoTestData {
415415
html = "html",
416416
parent_id = null,
417417
command = null,
418+
args = null,
418419
silent = false,
419420
shadowed = false,
420421
extraData = mapOf(
@@ -471,6 +472,7 @@ internal object MessageDtoTestData {
471472
html = "",
472473
parent_id = null,
473474
command = null,
475+
args = null,
474476
silent = false,
475477
shadowed = false,
476478
extraData = emptyMap(),

0 commit comments

Comments
 (0)