@@ -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}
0 commit comments