Skip to content

Commit 29005a2

Browse files
committed
chore: add backwards compatibility with v1.chat
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 597fa8d commit 29005a2

24 files changed

Lines changed: 823 additions & 137 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.getcode.mapper
2+
3+
4+
import com.getcode.model.MessageStatus
5+
import com.getcode.model.chat.Chat
6+
import com.getcode.model.chat.ChatMessage
7+
import com.getcode.model.chat.MessageContent
8+
import javax.inject.Inject
9+
import com.codeinc.gen.chat.v1.ChatService.ChatMessage as ApiChatMessage
10+
import com.getcode.model.chat.ChatMessage as DomainChatMessage
11+
12+
@Deprecated("Replace by V2")
13+
class ChatMessageV1Mapper @Inject constructor(
14+
): Mapper<Pair<Chat, ApiChatMessage>, DomainChatMessage> {
15+
override fun map(from: Pair<Chat, ApiChatMessage>): ChatMessage {
16+
val (chat, message) = from
17+
18+
val messageId = message.messageId.toByteArray().toList()
19+
val contents = message.contentList.mapNotNull { MessageContent.fromV1(it) }
20+
val isFromSelf = contents.firstOrNull { it.isFromSelf } != null
21+
22+
return ChatMessage(
23+
id = messageId,
24+
senderId = emptyList(),
25+
isFromSelf = isFromSelf,
26+
cursor = message.cursor.value.toList(),
27+
dateMillis = message.ts.seconds * 1_000L,
28+
contents = contents,
29+
status = if (isFromSelf) MessageStatus.Sent else MessageStatus.Incoming
30+
)
31+
}
32+
}

api/src/main/java/com/getcode/mapper/ChatMessageMapper.kt renamed to api/src/main/java/com/getcode/mapper/ChatMessageV2Mapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import com.codeinc.gen.chat.v2.ChatService.ChatMessage as ApiChatMessage
1111
import com.getcode.model.chat.ChatMessage as DomainChatMessage
1212

1313

14-
class ChatMessageMapper @Inject constructor(
14+
class ChatMessageV2Mapper @Inject constructor(
1515
): Mapper<Pair<Chat, ApiChatMessage>, DomainChatMessage> {
1616
override fun map(from: Pair<Chat, ApiChatMessage>): ChatMessage {
1717
val (chat, message) = from
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.getcode.mapper
2+
3+
import com.codeinc.gen.chat.v1.ChatService
4+
import com.getcode.model.chat.Chat
5+
import com.getcode.model.chat.ChatType
6+
import com.getcode.model.chat.Title
7+
import javax.inject.Inject
8+
9+
@Deprecated("Replaced by V2")
10+
class ChatMetadataV1Mapper @Inject constructor(
11+
) : Mapper<ChatService.ChatMetadata, Chat> {
12+
override fun map(from: ChatService.ChatMetadata): Chat {
13+
return Chat(
14+
id = from.chatId.value.toByteArray().toList(),
15+
title = Title.invoke(from),
16+
cursor = from.cursor.value.toByteArray().toList(),
17+
canMute = from.canMute,
18+
canUnsubscribe = from.canUnsubscribe,
19+
type = ChatType.Notification,
20+
messages = emptyList(),
21+
// backwards compatibility fields - these are derived from [Chat#members] in V2
22+
_unreadCount = from.numUnread,
23+
_isMuted = from.isMuted,
24+
_isSubscribed = from.isSubscribed,
25+
)
26+
}
27+
}

api/src/main/java/com/getcode/mapper/ChatMetadataMapper.kt renamed to api/src/main/java/com/getcode/mapper/ChatMetadataV2Mapper.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package com.getcode.mapper
33
import com.codeinc.gen.chat.v2.ChatService
44
import com.getcode.model.chat.Chat
55
import com.getcode.model.chat.ChatType
6+
import com.getcode.model.chat.Title
67
import javax.inject.Inject
78

8-
class ChatMetadataMapper @Inject constructor(
9+
class ChatMetadataV2Mapper @Inject constructor(
910
private val chatMemberMapper: ChatMemberMapper,
1011
) : Mapper<ChatService.ChatMetadata, Chat> {
1112
override fun map(from: ChatService.ChatMetadata): Chat {
1213
return Chat(
1314
id = from.chatId.value.toByteArray().toList(),
14-
title = from.title,
15+
title = Title.Localized(from.title),
1516
cursor = from.cursor.value.toByteArray().toList(),
1617
canMute = from.canMute,
1718
canUnsubscribe = from.canUnsubscribe,
Lines changed: 25 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package com.getcode.model.chat
22

3-
import com.codeinc.gen.chat.v2.ChatService
4-
import com.codeinc.gen.chat.v2.ChatService.ExchangeDataContent
5-
import com.codeinc.gen.chat.v2.ChatService.ExchangeDataContent.ReferenceCase
63
import com.getcode.model.Cursor
74
import com.getcode.model.ID
8-
import com.getcode.solana.keys.Signature as SolanaKeysSignature
95

106
/**
117
* Chat domain model for On-Chain messaging. This serves as a reference to a collection of messages.
@@ -24,20 +20,29 @@ import com.getcode.solana.keys.Signature as SolanaKeysSignature
2420
data class Chat(
2521
val id: ID,
2622
val type: ChatType,
27-
val title: String,
28-
val members: List<ChatMember>,
23+
val title: Title?,
24+
val members: List<ChatMember> = emptyList(),
25+
private val _unreadCount: Int = 0,
26+
private val _isMuted: Boolean = false,
2927
val canMute: Boolean,
28+
private val _isSubscribed: Boolean = false,
3029
val canUnsubscribe: Boolean,
3130
val cursor: Cursor,
3231
val messages: List<ChatMessage>
3332
) {
3433
val unreadCount: Int
3534
get() {
35+
if (!isV2) return _unreadCount
36+
3637
val self = members.firstOrNull { it.isSelf } ?: return 0
3738
return self.numUnread
3839
}
3940

4041
fun resetUnreadCount(): Chat {
42+
if (!isV2) {
43+
return copy(_unreadCount = 0)
44+
}
45+
4146
val self = members.firstOrNull { it.isSelf } ?: return this
4247
val updatedSelf = self.copy(numUnread = 0)
4348
val updatedMembers = members.map {
@@ -52,11 +57,17 @@ data class Chat(
5257

5358
val isMuted: Boolean
5459
get() {
60+
if (!isV2) return _isMuted
61+
5562
val self = members.firstOrNull { it.isSelf } ?: return false
5663
return self.isMuted
5764
}
5865

5966
fun setMuteState(muted: Boolean): Chat {
67+
if (!isV2) {
68+
return copy(_isMuted = muted)
69+
}
70+
6071
val self = members.firstOrNull { it.isSelf } ?: return this
6172
val updatedSelf = self.copy(isMuted = muted)
6273
val updatedMembers = members.map {
@@ -71,11 +82,17 @@ data class Chat(
7182

7283
val isSubscribed: Boolean
7384
get() {
85+
if (!isV2) return _isSubscribed
86+
7487
val self = members.firstOrNull { it.isSelf } ?: return false
7588
return self.isSubscribed
7689
}
7790

7891
fun setSubscriptionState(subscribed: Boolean): Chat {
92+
if (!isV2) {
93+
return copy(_isSubscribed = subscribed)
94+
}
95+
7996
val self = members.firstOrNull { it.isSelf } ?: return this
8097
val updatedSelf = self.copy(isSubscribed = subscribed)
8198
val updatedMembers = members.map {
@@ -95,43 +112,5 @@ data class Chat(
95112
get() = newestMessage?.dateMillis
96113
}
97114

98-
99-
100-
101-
enum class ChatType {
102-
Unknown,
103-
Notification,
104-
TwoWay;
105-
106-
companion object {
107-
operator fun invoke(proto: ChatService.ChatType): ChatType {
108-
return runCatching { entries[proto.ordinal] }.getOrNull() ?: Unknown
109-
}
110-
}
111-
}
112-
113-
sealed interface ConversationType {
114-
data object TipChat: ConversationType
115-
}
116-
117-
/**
118-
* An ID that can be referenced to the source of the exchange of Kin
119-
*/
120-
sealed interface Reference {
121-
data object NoneSet: Reference
122-
data class IntentId(val id: ID): Reference
123-
data class Signature(val signature: SolanaKeysSignature): Reference
124-
125-
companion object {
126-
operator fun invoke(proto: ExchangeDataContent): Reference {
127-
return when (proto.referenceCase) {
128-
ReferenceCase.INTENT -> IntentId(proto.intent.toByteArray().toList())
129-
ReferenceCase.SIGNATURE -> Signature(SolanaKeysSignature(proto.signature.toByteArray().toList()))
130-
ReferenceCase.REFERENCE_NOT_SET -> NoneSet
131-
null -> NoneSet
132-
}
133-
}
134-
}
135-
}
136-
137-
115+
val Chat.isV2: Boolean
116+
get() = members.isNotEmpty()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.getcode.model.chat
2+
3+
import com.codeinc.gen.chat.v2.ChatService
4+
5+
enum class ChatType {
6+
Unknown,
7+
Notification,
8+
TwoWay;
9+
10+
companion object {
11+
operator fun invoke(proto: ChatService.ChatType): ChatType {
12+
return runCatching { entries[proto.ordinal] }.getOrNull() ?: Unknown
13+
}
14+
}
15+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.getcode.model.chat
2+
3+
typealias ModelIntentId = com.codeinc.gen.common.v1.Model.IntentId
4+
5+
typealias ChatGrpcV1 = com.codeinc.gen.chat.v1.ChatGrpc
6+
typealias ChatGrpcV2 = com.codeinc.gen.chat.v2.ChatGrpc
7+
8+
typealias ChatIdV1 = com.codeinc.gen.chat.v1.ChatService.ChatId
9+
typealias ChatIdV2 = com.codeinc.gen.chat.v2.ChatService.ChatId
10+
11+
typealias MessageContentV1 = com.codeinc.gen.chat.v1.ChatService.Content
12+
typealias MessageContentV2 = com.codeinc.gen.chat.v2.ChatService.Content
13+
14+
typealias VerbV1 = com.codeinc.gen.chat.v1.ChatService.ExchangeDataContent.Verb
15+
typealias VerbV2 = com.codeinc.gen.chat.v2.ChatService.ExchangeDataContent.Verb
16+
17+
typealias ChatCursorV1 = com.codeinc.gen.chat.v1.ChatService.Cursor
18+
typealias ChatCursorV2 = com.codeinc.gen.chat.v2.ChatService.Cursor
19+
20+
typealias GetMessagesDirectionV1 = com.codeinc.gen.chat.v1.ChatService.GetMessagesRequest.Direction
21+
typealias GetMessagesDirectionV2 = com.codeinc.gen.chat.v2.ChatService.GetMessagesRequest.Direction
22+
23+
typealias PointerV1 = com.codeinc.gen.chat.v1.ChatService.Pointer
24+
typealias PointerV2 = com.codeinc.gen.chat.v2.ChatService.Pointer
25+
26+
typealias StartChatRequest = com.codeinc.gen.chat.v2.ChatService.StartChatRequest
27+
typealias StartChatResponse = com.codeinc.gen.chat.v2.ChatService.StartChatResponse
28+
29+
typealias GetChatsRequestV1 = com.codeinc.gen.chat.v1.ChatService.GetChatsRequest
30+
typealias GetChatsRequestV2 = com.codeinc.gen.chat.v2.ChatService.GetChatsRequest
31+
typealias GetChatsResponseV1 = com.codeinc.gen.chat.v1.ChatService.GetChatsResponse
32+
typealias GetChatsResponseV2 = com.codeinc.gen.chat.v2.ChatService.GetChatsResponse
33+
34+
typealias GetMessagesRequestV1 = com.codeinc.gen.chat.v1.ChatService.GetMessagesRequest
35+
typealias GetMessagesRequestV2 = com.codeinc.gen.chat.v2.ChatService.GetMessagesRequest
36+
typealias GetMessagesResponseV1 = com.codeinc.gen.chat.v1.ChatService.GetMessagesResponse
37+
typealias GetMessagesResponseV2 = com.codeinc.gen.chat.v2.ChatService.GetMessagesResponse
38+
39+
typealias AdvancePointerRequestV1 = com.codeinc.gen.chat.v1.ChatService.AdvancePointerRequest
40+
typealias AdvancePointerRequestV2 = com.codeinc.gen.chat.v2.ChatService.AdvancePointerRequest
41+
typealias AdvancePointerResponseV1 = com.codeinc.gen.chat.v1.ChatService.AdvancePointerResponse
42+
typealias AdvancePointerResponseV2 = com.codeinc.gen.chat.v2.ChatService.AdvancePointerResponse
43+
44+
45+
typealias SetMuteStateRequestV1 = com.codeinc.gen.chat.v1.ChatService.SetMuteStateRequest
46+
typealias SetMuteStateRequestV2 = com.codeinc.gen.chat.v2.ChatService.SetMuteStateRequest
47+
typealias SetMuteStateResponseV1 = com.codeinc.gen.chat.v1.ChatService.SetMuteStateResponse
48+
typealias SetMuteStateResponseV2 = com.codeinc.gen.chat.v2.ChatService.SetMuteStateResponse
49+
50+
51+
typealias SetSubscriptionStateRequestV1 = com.codeinc.gen.chat.v1.ChatService.SetSubscriptionStateRequest
52+
typealias SetSubscriptionStateRequestV2 = com.codeinc.gen.chat.v2.ChatService.SetSubscriptionStateRequest
53+
typealias SetSubscriptionStateResponseV1 = com.codeinc.gen.chat.v1.ChatService.SetSubscriptionStateResponse
54+
typealias SetSubscriptionStateResponseV2 = com.codeinc.gen.chat.v2.ChatService.SetSubscriptionStateResponse
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.getcode.model.chat
2+
3+
sealed interface ConversationType {
4+
data object TipChat: ConversationType
5+
}

0 commit comments

Comments
 (0)