Skip to content

Commit 7b44b7c

Browse files
committed
Verified PAID exchange data messages for merchant chats are no longer silent
1 parent af46562 commit 7b44b7c

File tree

7 files changed

+53
-170
lines changed

7 files changed

+53
-170
lines changed

pkg/code/async/geyser/external_deposit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ func processPotentialExternalDeposit(ctx context.Context, data code_data.Provide
265265
if err != nil {
266266
return errors.Wrap(err, "error updating cash transactions chat")
267267
}
268-
err = chat_util.SendMerchantExchangeMessage(ctx, data, intentRecord)
268+
_, err = chat_util.SendMerchantExchangeMessage(ctx, data, intentRecord)
269269
if err != nil {
270270
return errors.Wrap(err, "error updating merchant chat")
271271
}

pkg/code/chat/message_merchant.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ import (
1515
"github.com/code-payments/code-server/pkg/code/data/intent"
1616
)
1717

18+
type MessageWithOwner struct {
19+
Owner *common.Account
20+
Title string
21+
Message *chatpb.ChatMessage
22+
}
23+
1824
// SendMerchantExchangeMessage sends a message to the merchant's chat with
1925
// exchange data content related to the submitted intent. Intents that
20-
// don't belong in the merchant chat will be ignored.
26+
// don't belong in the merchant chat will be ignored. The set of chat messages
27+
// that should be pushed are returned.
2128
//
2229
// Note: Tests covered in SubmitIntent history tests
23-
func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, intentRecord *intent.Record) error {
30+
func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, intentRecord *intent.Record) ([]*MessageWithOwner, error) {
2431
messageId := intentRecord.IntentId
2532

2633
// There are three possible chats for a merchant:
@@ -38,7 +45,7 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
3845

3946
exchangeData, ok := getExchangeDataFromIntent(intentRecord)
4047
if !ok {
41-
return nil
48+
return nil, nil
4249
}
4350

4451
verbByMessageReceiver := make(map[string]chatpb.ExchangeDataContent_Verb)
@@ -47,7 +54,7 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
4754
if intentRecord.SendPrivatePaymentMetadata.IsMicroPayment {
4855
paymentRequestRecord, err := data.GetPaymentRequest(ctx, intentRecord.IntentId)
4956
if err != nil {
50-
return errors.Wrap(err, "error getting payment request record")
57+
return nil, errors.Wrap(err, "error getting payment request record")
5158
}
5259

5360
if paymentRequestRecord.Domain != nil {
@@ -64,7 +71,7 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
6471
if len(intentRecord.SendPrivatePaymentMetadata.DestinationOwnerAccount) > 0 {
6572
destinationAccountInfoRecord, err := data.GetAccountInfoByTokenAddress(ctx, intentRecord.SendPrivatePaymentMetadata.DestinationTokenAccount)
6673
if err != nil {
67-
return err
74+
return nil, err
6875
} else if destinationAccountInfoRecord.AccountType == commonpb.AccountType_RELATIONSHIP {
6976
// Relationship accounts only exist against verified merchants,
7077
// and will have merchant payments appear in the verified merchant
@@ -81,7 +88,7 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
8188
if len(intentRecord.SendPublicPaymentMetadata.DestinationOwnerAccount) > 0 {
8289
destinationAccountInfoRecord, err := data.GetAccountInfoByTokenAddress(ctx, intentRecord.SendPublicPaymentMetadata.DestinationTokenAccount)
8390
if err != nil {
84-
return err
91+
return nil, err
8592
} else if destinationAccountInfoRecord.AccountType == commonpb.AccountType_RELATIONSHIP {
8693
// Relationship accounts only exist against verified merchants,
8794
// and will have merchant payments appear in the verified merchant
@@ -97,7 +104,7 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
97104
messageId = strings.Split(messageId, "-")[0]
98105
destinationAccountInfoRecord, err := data.GetAccountInfoByTokenAddress(ctx, intentRecord.ExternalDepositMetadata.DestinationTokenAccount)
99106
if err != nil {
100-
return err
107+
return nil, err
101108
} else if destinationAccountInfoRecord.AccountType == commonpb.AccountType_RELATIONSHIP {
102109
// Relationship accounts only exist against verified merchants,
103110
// and will have merchant payments appear in the verified merchant
@@ -108,13 +115,14 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
108115
verbByMessageReceiver[intentRecord.ExternalDepositMetadata.DestinationOwnerAccount] = chatpb.ExchangeDataContent_DEPOSITED
109116
}
110117
default:
111-
return nil
118+
return nil, nil
112119
}
113120

121+
var messagesToPush []*MessageWithOwner
114122
for account, verb := range verbByMessageReceiver {
115123
receiver, err := common.NewAccountFromPublicKeyString(account)
116124
if err != nil {
117-
return err
125+
return nil, err
118126
}
119127

120128
content := []*chatpb.Content{
@@ -131,22 +139,30 @@ func SendMerchantExchangeMessage(ctx context.Context, data code_data.Provider, i
131139
}
132140
protoMessage, err := newProtoChatMessage(messageId, content, intentRecord.CreatedAt)
133141
if err != nil {
134-
return errors.Wrap(err, "error creating proto chat message")
142+
return nil, errors.Wrap(err, "error creating proto chat message")
135143
}
136144

137-
_, err = SendChatMessage(
145+
canPush, err := SendChatMessage(
138146
ctx,
139147
data,
140148
chatTitle,
141149
chatType,
142150
isVerifiedChat,
143151
receiver,
144152
protoMessage,
145-
true,
153+
verb != chatpb.ExchangeDataContent_PAID || !isVerifiedChat,
146154
)
147155
if err != nil && err != chat.ErrMessageAlreadyExists {
148-
return errors.Wrap(err, "error persisting chat message")
156+
return nil, errors.Wrap(err, "error persisting chat message")
157+
}
158+
159+
if canPush {
160+
messagesToPush = append(messagesToPush, &MessageWithOwner{
161+
Owner: receiver,
162+
Title: chatTitle,
163+
Message: protoMessage,
164+
})
149165
}
150166
}
151-
return nil
167+
return messagesToPush, nil
152168
}

pkg/code/push/notifications.go

Lines changed: 0 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ import (
1616
"github.com/code-payments/code-server/pkg/code/common"
1717
code_data "github.com/code-payments/code-server/pkg/code/data"
1818
"github.com/code-payments/code-server/pkg/code/data/chat"
19-
"github.com/code-payments/code-server/pkg/code/data/intent"
20-
"github.com/code-payments/code-server/pkg/code/data/paymentrequest"
2119
"github.com/code-payments/code-server/pkg/code/localization"
22-
currency_lib "github.com/code-payments/code-server/pkg/currency"
2320
"github.com/code-payments/code-server/pkg/kin"
2421
push_lib "github.com/code-payments/code-server/pkg/push"
2522
)
@@ -153,103 +150,6 @@ func SendGiftCardReturnedPushNotification(
153150
)
154151
}
155152

156-
// SendMicroPaymentReceivedPushNotification sends a push to the destination when
157-
// someone pays for content through a micro payment.
158-
func SendMicroPaymentReceivedPushNotification(
159-
ctx context.Context,
160-
data code_data.Provider,
161-
pusher push_lib.Provider,
162-
intentRecord *intent.Record,
163-
paymentRequestRecord *paymentrequest.Record,
164-
) error {
165-
log := logrus.StandardLogger().WithFields(logrus.Fields{
166-
"method": "SendMicroPaymentReceivedPushNotification",
167-
"intent": intentRecord.IntentId,
168-
})
169-
170-
var destinationOwnerAccount *common.Account
171-
var destinationTokenAccount *common.Account
172-
var nativeAmount float64
173-
var currency currency_lib.Code
174-
var err error
175-
switch intentRecord.IntentType {
176-
case intent.SendPrivatePayment:
177-
if !intentRecord.SendPrivatePaymentMetadata.IsMicroPayment {
178-
log.Warn("intent isn't a micro payment")
179-
return nil
180-
}
181-
182-
if len(intentRecord.SendPrivatePaymentMetadata.DestinationOwnerAccount) == 0 {
183-
return nil
184-
}
185-
186-
destinationTokenAccount, err = common.NewAccountFromPublicKeyString(intentRecord.SendPrivatePaymentMetadata.DestinationTokenAccount)
187-
if err != nil {
188-
log.WithError(err).Warn("invalid destination token account")
189-
return err
190-
}
191-
192-
destinationOwnerAccount, err = common.NewAccountFromPublicKeyString(intentRecord.SendPrivatePaymentMetadata.DestinationOwnerAccount)
193-
if err != nil {
194-
log.WithError(err).Warn("invalid destination owner account")
195-
return err
196-
}
197-
198-
nativeAmount = intentRecord.SendPrivatePaymentMetadata.NativeAmount
199-
currency = intentRecord.SendPrivatePaymentMetadata.ExchangeCurrency
200-
default:
201-
log.Warn("intent type doesn't support micro payments")
202-
return nil
203-
}
204-
205-
accountInfoRecord, err := data.GetAccountInfoByTokenAddress(ctx, destinationTokenAccount.PublicKey().ToBase58())
206-
if err != nil {
207-
log.WithError(err).Warn("failure getting account info record")
208-
return errors.Wrap(err, "error getting account info record")
209-
}
210-
211-
var chatId chat.ChatId
212-
if accountInfoRecord.AccountType == commonpb.AccountType_RELATIONSHIP {
213-
// Relationship accounts can only be paid via micro payment through a
214-
// verified flow
215-
chatId = chat.GetChatId(*accountInfoRecord.RelationshipTo, destinationOwnerAccount.PublicKey().ToBase58(), true)
216-
} else {
217-
chatId = chat.GetChatId(chat_util.PaymentsName, destinationOwnerAccount.PublicKey().ToBase58(), false)
218-
}
219-
220-
// Legacy push notification still considers chat mute state
221-
//
222-
// todo: Proper migration to chat system
223-
chatRecord, err := data.GetChatById(ctx, chatId)
224-
switch err {
225-
case nil:
226-
if chatRecord.IsMuted {
227-
return nil
228-
}
229-
case chat.ErrChatNotFound:
230-
default:
231-
log.WithError(err).Warn("failure getting chat record")
232-
return errors.Wrap(err, "error getting chat record")
233-
}
234-
235-
amountArg := getAmountArg(nativeAmount, currency)
236-
237-
// todo: localized keys
238-
title := "Payment Received"
239-
body := fmt.Sprintf("Someone bought your content for %s", amountArg)
240-
if paymentRequestRecord.IsVerified && paymentRequestRecord.Domain != nil {
241-
body = fmt.Sprintf("%s on %s", body, *paymentRequestRecord.Domain)
242-
}
243-
return sendBasicPushNotificationToOwner(
244-
ctx,
245-
data,
246-
pusher,
247-
destinationOwnerAccount,
248-
title,
249-
body,
250-
)
251-
}
252-
253153
// SendChatMessagePushNotification sends a push notification for chat messages
254154
func SendChatMessagePushNotification(
255155
ctx context.Context,

pkg/code/server/grpc/transaction/v2/intent.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
messagingpb "github.com/code-payments/code-protobuf-api/generated/go/messaging/v1"
2323
transactionpb "github.com/code-payments/code-protobuf-api/generated/go/transaction/v2"
2424

25+
"github.com/code-payments/code-server/pkg/code/chat"
2526
chat_util "github.com/code-payments/code-server/pkg/code/chat"
2627
"github.com/code-payments/code-server/pkg/code/common"
2728
code_data "github.com/code-payments/code-server/pkg/code/data"
@@ -33,6 +34,7 @@ import (
3334
"github.com/code-payments/code-server/pkg/code/data/nonce"
3435
"github.com/code-payments/code-server/pkg/code/data/timelock"
3536
"github.com/code-payments/code-server/pkg/code/data/webhook"
37+
"github.com/code-payments/code-server/pkg/code/push"
3638
"github.com/code-payments/code-server/pkg/code/transaction"
3739
"github.com/code-payments/code-server/pkg/grpc/client"
3840
"github.com/code-payments/code-server/pkg/kin"
@@ -798,6 +800,8 @@ func (s *transactionServer) SubmitIntent(streamer transactionpb.Transaction_Subm
798800
}
799801
}
800802

803+
var chatMessagesToPush []*chat.MessageWithOwner
804+
801805
// Save all of the required DB records in one transaction to complete the
802806
// intent operation. It's very bad if we end up failing halfway through.
803807
//
@@ -883,7 +887,7 @@ func (s *transactionServer) SubmitIntent(streamer transactionpb.Transaction_Subm
883887
log.WithError(err).Warn("failure updating cash transaction chat")
884888
return err
885889
}
886-
err = chat_util.SendMerchantExchangeMessage(ctx, s.data, intentRecord)
890+
chatMessagesToPush, err = chat_util.SendMerchantExchangeMessage(ctx, s.data, intentRecord)
887891
if err != nil {
888892
log.WithError(err).Warn("failure updating merchant chat")
889893
return err
@@ -944,6 +948,21 @@ func (s *transactionServer) SubmitIntent(streamer transactionpb.Transaction_Subm
944948
if err != nil {
945949
log.WithError(err).Warn("failure executing intent committed callback handler handler")
946950
}
951+
952+
if len(chatMessagesToPush) > 0 {
953+
go func() {
954+
for _, chatMessageToPush := range chatMessagesToPush {
955+
push.SendChatMessagePushNotification(
956+
context.TODO(),
957+
s.data,
958+
s.pusher,
959+
chatMessageToPush.Title,
960+
chatMessageToPush.Owner,
961+
chatMessageToPush.Message,
962+
)
963+
}
964+
}()
965+
}
947966
}
948967

949968
// Fire off some success metrics

pkg/code/server/grpc/transaction/v2/intent_handler.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -961,15 +961,6 @@ func (h *SendPrivatePaymentIntentHandler) OnSaveToDB(ctx context.Context, intent
961961
}
962962

963963
func (h *SendPrivatePaymentIntentHandler) OnCommittedToDB(ctx context.Context, intentRecord *intent.Record) error {
964-
if intentRecord.SendPrivatePaymentMetadata.IsMicroPayment {
965-
go bestEffortMicroPaymentPostProcessingJob(
966-
h.data,
967-
h.pusher,
968-
intentRecord,
969-
h.cachedPaymentRequestRequest,
970-
)
971-
}
972-
973964
return nil
974965
}
975966

pkg/code/server/grpc/transaction/v2/micro_payment.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkg/code/server/grpc/transaction/v2/testutil.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,8 @@ func (s *serverTestEnv) simulateExternalDepositHistoryItem(t *testing.T, owner,
374374
require.NoError(t, s.data.SaveIntent(s.ctx, intentRecord))
375375

376376
require.NoError(t, chat_util.SendCashTransactionsExchangeMessage(s.ctx, s.data, intentRecord))
377-
require.NoError(t, chat_util.SendMerchantExchangeMessage(s.ctx, s.data, intentRecord))
377+
_, err := chat_util.SendMerchantExchangeMessage(s.ctx, s.data, intentRecord)
378+
require.NoError(t, err)
378379
}
379380

380381
func (s *serverTestEnv) simulateAllCommitmentsUpgraded(t *testing.T) {

0 commit comments

Comments
 (0)