Skip to content

Commit d5b1f05

Browse files
committed
chore: update protos with messaging stream support
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 53f51c3 commit d5b1f05

8 files changed

Lines changed: 708 additions & 42 deletions

File tree

api/src/main/java/com/getcode/mapper/ChatMessageMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import javax.inject.Inject
88
import com.codeinc.gen.chat.v1.ChatService.ChatMessage as ApiChatMessage
99
import com.getcode.model.ChatMessage as DomainChatMessage
1010

11-
11+
@Deprecated("Replaced with v2")
1212
class ChatMessageMapper @Inject constructor(
1313
): Mapper<ApiChatMessage, DomainChatMessage> {
1414
override fun map(from: ChatService.ChatMessage): ChatMessage {

api/src/main/java/com/getcode/model/Chat.kt

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package com.getcode.model
22

33
import com.codeinc.gen.chat.v1.ChatService
44
import com.codeinc.gen.chat.v1.ChatService.Content
5+
import com.codeinc.gen.chat.v2.ChatService as ChatServiceV2
6+
import com.codeinc.gen.chat.v2.ChatService.Content as MessageContentV2
57
import com.getcode.ed25519.Ed25519.KeyPair
68
import com.getcode.network.repository.toPublicKey
7-
import com.getcode.solana.keys.SodiumError
89

9-
typealias ID = List<Byte>
1010
typealias Cursor = List<Byte>
1111

1212
/**
@@ -136,6 +136,7 @@ sealed interface Verb {
136136
}
137137

138138
companion object {
139+
@Deprecated("Replaced with v2")
139140
operator fun invoke(proto: ChatService.ExchangeDataContent.Verb): Verb {
140141
return when (proto) {
141142
ChatService.ExchangeDataContent.Verb.UNKNOWN -> Unknown
@@ -153,6 +154,24 @@ sealed interface Verb {
153154
ChatService.ExchangeDataContent.Verb.SENT_TIP -> SentTip
154155
}
155156
}
157+
158+
fun fromV2(proto: ChatServiceV2.ExchangeDataContent.Verb): Verb {
159+
return when (proto) {
160+
ChatServiceV2.ExchangeDataContent.Verb.UNKNOWN -> Unknown
161+
ChatServiceV2.ExchangeDataContent.Verb.GAVE -> Gave
162+
ChatServiceV2.ExchangeDataContent.Verb.RECEIVED -> Received
163+
ChatServiceV2.ExchangeDataContent.Verb.WITHDREW -> Withdrew
164+
ChatServiceV2.ExchangeDataContent.Verb.DEPOSITED -> Deposited
165+
ChatServiceV2.ExchangeDataContent.Verb.SENT -> Sent
166+
ChatServiceV2.ExchangeDataContent.Verb.RETURNED -> Returned
167+
ChatServiceV2.ExchangeDataContent.Verb.SPENT -> Spent
168+
ChatServiceV2.ExchangeDataContent.Verb.PAID -> Paid
169+
ChatServiceV2.ExchangeDataContent.Verb.PURCHASED -> Purchased
170+
ChatServiceV2.ExchangeDataContent.Verb.UNRECOGNIZED -> Unknown
171+
ChatServiceV2.ExchangeDataContent.Verb.RECEIVED_TIP -> ReceivedTip
172+
ChatServiceV2.ExchangeDataContent.Verb.SENT_TIP -> SentTip
173+
}
174+
}
156175
}
157176
}
158177

@@ -222,9 +241,10 @@ sealed interface MessageContent {
222241
) : MessageContent
223242

224243
companion object {
244+
@Deprecated("Replaced with v2")
225245
operator fun invoke(proto: Content): MessageContent? {
226246
return when (proto.typeCase) {
227-
Content.TypeCase.LOCALIZED -> Localized(proto.localized.keyOrText)
247+
Content.TypeCase.SERVER_LOCALIZED -> Localized(proto.serverLocalized.keyOrText)
228248
Content.TypeCase.EXCHANGE_DATA -> {
229249
val verb = Verb(proto.exchangeData.verb)
230250
val messageStatus = if (verb.increasesBalance) MessageStatus.Incoming else MessageStatus.Delivered
@@ -277,6 +297,62 @@ sealed interface MessageContent {
277297
else -> return null
278298
}
279299
}
300+
301+
fun fromV2(proto: MessageContentV2): MessageContent? {
302+
return when (proto.typeCase) {
303+
MessageContentV2.TypeCase.LOCALIZED -> Localized(proto.localized.keyOrText)
304+
MessageContentV2.TypeCase.EXCHANGE_DATA -> {
305+
val verb = Verb.fromV2(proto.exchangeData.verb)
306+
val messageStatus = if (verb.increasesBalance) MessageStatus.Incoming else MessageStatus.Delivered
307+
when (proto.exchangeData.exchangeDataCase) {
308+
ChatServiceV2.ExchangeDataContent.ExchangeDataCase.EXACT -> {
309+
val exact = proto.exchangeData.exact
310+
val currency = CurrencyCode.tryValueOf(exact.currency) ?: return null
311+
val kinAmount = KinAmount.newInstance(
312+
kin = Kin.fromQuarks(exact.quarks),
313+
rate = Rate(
314+
fx = exact.exchangeRate,
315+
currency = currency
316+
)
317+
)
318+
319+
Exchange(GenericAmount.Exact(kinAmount), verb, status = messageStatus)
320+
}
321+
322+
ChatServiceV2.ExchangeDataContent.ExchangeDataCase.PARTIAL -> {
323+
val partial = proto.exchangeData.partial
324+
val currency = CurrencyCode.tryValueOf(partial.currency) ?: return null
325+
326+
val fiat = Fiat(
327+
currency = currency,
328+
amount = partial.nativeAmount
329+
)
330+
331+
Exchange(GenericAmount.Partial(fiat), verb, status = messageStatus)
332+
}
333+
334+
ChatServiceV2.ExchangeDataContent.ExchangeDataCase.EXCHANGEDATA_NOT_SET -> return null
335+
else -> return null
336+
}
337+
}
338+
339+
MessageContentV2.TypeCase.NACL_BOX -> {
340+
val encryptedContent = proto.naclBox
341+
val peerPublicKey =
342+
encryptedContent.peerPublicKey.value.toByteArray().toPublicKey()
343+
344+
val data = EncryptedData(
345+
peerPublicKey = peerPublicKey,
346+
nonce = encryptedContent.nonce.toByteArray().toList(),
347+
encryptedData = encryptedContent.encryptedPayload.toByteArray().toList(),
348+
)
349+
SodiumBox(data = data)
350+
}
351+
352+
MessageContentV2.TypeCase.TYPE_NOT_SET -> return null
353+
else -> return null
354+
}
355+
}
280356
}
281357
}
282358

api/src/main/java/com/getcode/network/api/ChatApi.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,20 @@ import com.codeinc.gen.chat.v1.ChatService.SetMuteStateRequest
1111
import com.codeinc.gen.chat.v1.ChatService.SetMuteStateResponse
1212
import com.codeinc.gen.chat.v1.ChatService.SetSubscriptionStateRequest
1313
import com.codeinc.gen.chat.v1.ChatService.SetSubscriptionStateResponse
14-
import com.getcode.ed25519.Ed25519
1514
import com.getcode.ed25519.Ed25519.KeyPair
1615
import com.getcode.model.Cursor
1716
import com.getcode.model.ID
1817
import com.getcode.network.core.GrpcApi
1918
import com.getcode.network.repository.toByteString
20-
import com.getcode.network.repository.toSignature
2119
import com.getcode.network.repository.toSolanaAccount
2220
import com.getcode.utils.sign
2321
import io.grpc.ManagedChannel
2422
import kotlinx.coroutines.Dispatchers
2523
import kotlinx.coroutines.flow.Flow
2624
import kotlinx.coroutines.flow.flowOn
27-
import java.io.ByteArrayOutputStream
2825
import javax.inject.Inject
2926

27+
@Deprecated("Being replaced with V2")
3028
class ChatApi @Inject constructor(
3129
managedChannel: ManagedChannel
3230
) : GrpcApi(managedChannel) {

api/src/main/java/com/getcode/network/service/ChatService.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,28 @@ import com.getcode.model.Chat
88
import com.getcode.model.ChatMessage
99
import com.getcode.model.Cursor
1010
import com.getcode.model.ID
11+
import com.getcode.model.description
1112
import com.getcode.network.api.ChatApi
1213
import com.getcode.network.core.NetworkOracle
13-
import com.getcode.network.repository.base58
1414
import com.getcode.utils.ErrorUtils
1515
import kotlinx.coroutines.flow.Flow
1616
import kotlinx.coroutines.flow.first
17-
import kotlinx.coroutines.flow.firstOrNull
1817
import kotlinx.coroutines.flow.map
1918
import timber.log.Timber
2019
import javax.inject.Inject
21-
import kotlin.reflect.KClass
2220

2321
/**
2422
* Abstraction layer to handle [ChatApi] request results and map to domain models
2523
*/
24+
@Deprecated("Being replaced with V2")
2625
class ChatService @Inject constructor(
2726
private val api: ChatApi,
2827
private val chatMapper: ChatMetadataMapper,
2928
private val messageMapper: ChatMessageMapper,
3029
private val networkOracle: NetworkOracle,
3130
) {
3231

33-
fun observeChats(owner: KeyPair): Flow<Result<List<Chat>>> {
32+
private fun observeChats(owner: KeyPair): Flow<Result<List<Chat>>> {
3433
return networkOracle.managedRequest(api.fetchChats(owner))
3534
.map { response ->
3635
when (response.result) {
@@ -163,7 +162,8 @@ class ChatService @Inject constructor(
163162
}
164163

165164
ChatService.GetMessagesResponse.Result.NOT_FOUND -> {
166-
val error = Throwable("Error: messages not found for chat ${chatId.base58}")
165+
val error =
166+
Throwable("Error: messages not found for chat ${chatId.description}")
167167
Timber.e(t = error)
168168
Result.failure(error)
169169
}
@@ -199,21 +199,25 @@ class ChatService @Inject constructor(
199199
ChatService.AdvancePointerResponse.Result.OK -> {
200200
Result.success(Unit)
201201
}
202+
202203
ChatService.AdvancePointerResponse.Result.CHAT_NOT_FOUND -> {
203204
val error = Throwable("Error: chat not found $chatId")
204205
Timber.e(t = error)
205206
Result.failure(error)
206207
}
208+
207209
ChatService.AdvancePointerResponse.Result.MESSAGE_NOT_FOUND -> {
208210
val error = Throwable("Error: message not found $to")
209211
Timber.e(t = error)
210212
Result.failure(error)
211213
}
214+
212215
ChatService.AdvancePointerResponse.Result.UNRECOGNIZED -> {
213216
val error = Throwable("Error: Unrecognized request.")
214217
Timber.e(t = error)
215218
Result.failure(error)
216219
}
220+
217221
else -> {
218222
val error = Throwable("Error: Unknown")
219223
Timber.e(t = error)

model/proto/chat/v1/chat_service.proto

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ message ChatMessageId {
128128
message Pointer {
129129
Kind kind = 1;
130130
enum Kind {
131-
UNKNOWN = 0;
132-
READ = 1;
131+
UNKNOWN = 0;
132+
READ = 1;
133133
}
134134

135135
ChatMessageId value = 2;
@@ -139,9 +139,9 @@ message ChatMetadata {
139139
ChatId chat_id = 1;
140140
// Recommended chat title inferred by the type of chat
141141
oneof title {
142-
142+
143143
LocalizedContent localized = 2;
144-
common.v1.Domain domain = 3;
144+
common.v1.Domain domain = 3;
145145
}
146146

147147
// Pointer in the chat indicating the most recently read message by the user
@@ -156,7 +156,7 @@ message ChatMetadata {
156156
bool can_mute = 8;
157157
// Can the user unsubscribe from this chat?
158158
bool can_unsubscribe = 9;
159-
// Cursor value for this chat for reference in subsequent GetChatsRequest
159+
// Cursor value for this chat for reference in subsequent GetChatsRequest
160160
Cursor cursor = 10;
161161
// Is this a verified chat?
162162
//
@@ -172,16 +172,16 @@ message ChatMessage {
172172
google.protobuf.Timestamp ts = 2;
173173
// Ordered message content. A message may have more than one piece of content.
174174
repeated Content content = 3;
175-
// Cursor value for this message for reference in subsequent GetMessagesRequest
175+
// Cursor value for this message for reference in subsequent GetMessagesRequest
176176
Cursor cursor = 4;
177177
}
178178

179179
message Content {
180180
oneof type {
181-
182-
LocalizedContent localized = 1;
183-
ExchangeDataContent exchange_data = 2;
184-
NaclBoxEncryptedContent nacl_box = 3;
181+
182+
LocalizedContent server_localized = 1;
183+
ExchangeDataContent exchange_data = 2;
184+
NaclBoxEncryptedContent nacl_box = 3;
185185
}
186186

187187
}
@@ -210,7 +210,7 @@ message ExchangeDataContent {
210210
}
211211

212212
oneof exchange_data {
213-
213+
214214
transaction.v2.ExchangeData exact = 2;
215215
transaction.v2.ExchangeDataWithoutRate partial = 3;
216216
}

0 commit comments

Comments
 (0)