Skip to content

Commit 76229df

Browse files
authored
feat: added sender wallet address to incoming payment (#3705)
* Added sender wallet address to incoming payment
1 parent bfe099e commit 76229df

File tree

14 files changed

+102
-7
lines changed

14 files changed

+102
-7
lines changed

localenv/mock-account-servicing-entity/generated/graphql.ts

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* @param { import("knex").Knex } knex
3+
* @returns { Promise<void> }
4+
*/
5+
exports.up = function (knex) {
6+
return knex.schema.alterTable('incomingPayments', function (table) {
7+
table.string('senderWalletAddress').nullable()
8+
})
9+
}
10+
11+
/**
12+
* @param { import("knex").Knex } knex
13+
* @returns { Promise<void> }
14+
*/
15+
exports.down = function (knex) {
16+
return knex.schema.alterTable('incomingPayments', function (table) {
17+
table.dropColumn('senderWalletAddress')
18+
})
19+
}

packages/backend/src/graphql/generated/graphql.schema.json

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/generated/graphql.ts

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/resolvers/incoming_payment.test.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
import { Amount, serializeAmount } from '../../open_payments/amount'
3636
import { GraphQLErrorCode } from '../errors'
3737
import { createTenant } from '../../tests/tenant'
38+
import { faker } from '@faker-js/faker'
3839

3940
describe('Incoming Payment Resolver', (): void => {
4041
let deps: IocContract<AppServices>
@@ -100,6 +101,7 @@ describe('Incoming Payment Resolver', (): void => {
100101

101102
describe('Mutation.createIncomingPayment', (): void => {
102103
let amount: Amount
104+
let senderWalletAddress: string
103105

104106
beforeEach((): void => {
105107
amount = {
@@ -108,6 +110,7 @@ describe('Incoming Payment Resolver', (): void => {
108110
assetScale: asset.scale
109111
}
110112
client = 'incoming-payment-client-create'
113+
senderWalletAddress = faker.internet.url()
111114
})
112115

113116
test.each`
@@ -130,7 +133,8 @@ describe('Incoming Payment Resolver', (): void => {
130133
expiresAt,
131134
incomingAmount,
132135
tenantId,
133-
initiationReason: IncomingPaymentInitiationReason.Admin
136+
initiationReason: IncomingPaymentInitiationReason.Admin,
137+
senderWalletAddress
134138
})
135139

136140
const createSpy = jest
@@ -141,7 +145,8 @@ describe('Incoming Payment Resolver', (): void => {
141145
walletAddressId,
142146
incomingAmount,
143147
expiresAt,
144-
metadata
148+
metadata,
149+
senderWalletAddress
145150
}
146151

147152
const query = await appContainer.apolloClient
@@ -168,6 +173,7 @@ describe('Incoming Payment Resolver', (): void => {
168173
}
169174
metadata
170175
createdAt
176+
senderWalletAddress
171177
}
172178
}
173179
}
@@ -205,7 +211,8 @@ describe('Incoming Payment Resolver', (): void => {
205211
...serializeAmount(payment.receivedAmount)
206212
},
207213
metadata: metadata || null,
208-
createdAt: payment.createdAt.toISOString()
214+
createdAt: payment.createdAt.toISOString(),
215+
senderWalletAddress
209216
}
210217
})
211218
}

packages/backend/src/graphql/resolvers/incoming_payment.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export const createIncomingPayment: MutationResolvers<ForTenantIdContext>['creat
119119
initiationReason:
120120
ctx.isOperator && args.input.isCardPayment
121121
? IncomingPaymentInitiationReason.Card
122-
: IncomingPaymentInitiationReason.Admin
122+
: IncomingPaymentInitiationReason.Admin,
123+
senderWalletAddress: args.input.senderWalletAddress
123124
})
124125
const config = await ctx.container.use('config')
125126
if (isIncomingPaymentError(incomingPaymentOrError)) {
@@ -232,6 +233,7 @@ export function paymentToGraphql(
232233
incomingAmount: payment.incomingAmount,
233234
receivedAmount: payment.receivedAmount,
234235
metadata: payment.metadata,
235-
createdAt: new Date(+payment.createdAt).toISOString()
236+
createdAt: new Date(+payment.createdAt).toISOString(),
237+
senderWalletAddress: payment.senderWalletAddress
236238
}
237239
}

packages/backend/src/graphql/schema.graphql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,8 @@ type IncomingPayment implements BasePayment & Model {
959959
createdAt: String!
960960
"The tenant UUID associated with the incoming payment. If not provided, it will be obtained from the signature."
961961
tenantId: String
962+
"The sender's wallet address URL. Applicable only to card payments."
963+
senderWalletAddress: String
962964
}
963965

964966
type Receiver {
@@ -1283,6 +1285,8 @@ input CreateIncomingPaymentInput {
12831285
idempotencyKey: String
12841286
"Whether or not the incoming payment is being created for a card payment."
12851287
isCardPayment: Boolean
1288+
"The sender's wallet address URL. Applicable only to card payments."
1289+
senderWalletAddress: String
12861290
}
12871291

12881292
input CreateReceiverInput {

packages/backend/src/open_payments/payment/incoming/model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export class IncomingPayment
111111
private incomingAmountValue?: bigint | null
112112
private receivedAmountValue?: bigint
113113
public readonly tenantId!: string
114+
public readonly senderWalletAddress?: string | null
114115

115116
public get completed(): boolean {
116117
return this.state === IncomingPaymentState.Completed

packages/backend/src/open_payments/payment/incoming/service.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface CreateIncomingPaymentOptions {
3535
metadata?: Record<string, unknown>
3636
tenantId: string
3737
initiationReason: IncomingPaymentInitiationReason
38+
senderWalletAddress?: string
3839
}
3940

4041
export interface UpdateOptions {
@@ -146,7 +147,8 @@ async function createIncomingPayment(
146147
incomingAmount,
147148
metadata,
148149
tenantId,
149-
initiationReason
150+
initiationReason,
151+
senderWalletAddress
150152
}: CreateIncomingPaymentOptions,
151153
trx?: Knex.Transaction
152154
): Promise<IncomingPayment | IncomingPaymentError> {
@@ -192,7 +194,8 @@ async function createIncomingPayment(
192194
state: IncomingPaymentState.Pending,
193195
processAt: expiresAt,
194196
tenantId,
195-
initiatedBy: initiationReason
197+
initiatedBy: initiationReason,
198+
senderWalletAddress
196199
})
197200

198201
const asset = await deps.assetService.get(incomingPayment.assetId)

packages/card-service/src/graphql/generated/graphql.ts

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)