Skip to content

Commit cf32825

Browse files
authored
db/seed: Adapt seeding scripts to new payment structure (#605)
* Donation table structural changes - Payment table will save the information regarding the payment - Donation table will save information regarding the donation(e.g. campaign, wish etc..) * Initial API changes for new payment structure * Adjust existing tests to cover the restructure * src/vault: Add possibility to decrement many vaults as well In future situations, we might need to decrement many vaults at once as well,(e.g. payment refund etc..) - Added some unit tests to cover vaults updates -Did some refactoring on commonly used types, as well as test mocks * schema.prisma: Rename Payments to Payment As the name of the model is used as a type, the acceptednaming convention is to name that type in singular way * Infer person.email as string in campaign.controller test cases Fixes TS related errors * src/bank-transactions: Check for admin privilleges regardless of env when simulating IRIS transactions * donations.service: Rename currentDonation to currentPayment in update fn * db/seed: Adapt seeding scripts to new structure * payment/seed: Use payment's createdAt updatedAt values for donation In production, the insertion is done within a single transaction, thus the dates should be the same
1 parent 530d9b7 commit cf32825

File tree

4 files changed

+97
-38
lines changed

4 files changed

+97
-38
lines changed

db/seed/donations/factory.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Factory } from 'fishery'
2+
import { faker } from '@faker-js/faker'
3+
4+
import { Donation } from '.prisma/client'
5+
import { DonationType } from '@prisma/client'
6+
7+
export const donationFactory = Factory.define<Donation>(({ associations }) => ({
8+
id: faker.datatype.uuid(),
9+
paymentId: associations.paymentId || faker.datatype.uuid(),
10+
type: faker.helpers.arrayElement(Object.values(DonationType)),
11+
targetVaultId: associations.targetVaultId || faker.datatype.uuid(),
12+
personId: associations.personId || null,
13+
amount: parseInt(faker.finance.amount(2000, 20000)),
14+
createdAt: faker.date.past(),
15+
updatedAt: faker.date.recent(),
16+
}))

db/seed/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { campaignTypesSeed } from './campaignType/seed'
1313
import { bankAccountSeed } from './bankAccount/seed'
1414
import { vaultSeed } from './vault/seed'
1515
import { expenseSeed } from './expense/seed'
16-
import { donationsSeed } from './donation/seed'
16+
import { paymentsSeed } from './payment/seed'
1717
import { companySeed } from './company/seed'
1818
import { donationsWishesSeed } from './donationWish/seed'
1919
import { campaignNewsSeed } from './campaignNews/seed'
@@ -53,7 +53,7 @@ async function seedDevData() {
5353
await bankAccountSeed()
5454
await vaultSeed()
5555
await expenseSeed()
56-
await donationsSeed()
56+
await paymentsSeed()
5757
await donationsWishesSeed()
5858
await campaignNewsSeed()
5959
}

db/seed/donation/factory.ts renamed to db/seed/payment/factory.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
import { Factory } from 'fishery'
22
import { faker } from '@faker-js/faker'
33

4-
import { Donation } from '.prisma/client'
5-
import { Currency, DonationStatus, DonationType, PaymentProvider } from '@prisma/client'
4+
import { Currency, PaymentStatus, PaymentProvider, PaymentType, Payment } from '@prisma/client'
65

7-
export const donationFactory = Factory.define<Donation>(({ associations }) => ({
6+
export const paymentFactory = Factory.define<Payment>(({ associations }) => ({
87
id: faker.datatype.uuid(),
98
affiliateId: null,
10-
type: faker.helpers.arrayElement(Object.values(DonationType)),
11-
status: faker.helpers.arrayElement(Object.values(DonationStatus)),
9+
type: faker.helpers.arrayElement(Object.values(PaymentType)),
10+
status: faker.helpers.arrayElement(Object.values(PaymentStatus)),
1211
provider: faker.helpers.arrayElement(Object.values(PaymentProvider)),
13-
targetVaultId: associations.targetVaultId || faker.datatype.uuid(),
1412
extCustomerId: 'cus_' + faker.random.alphaNumeric(8),
1513
extPaymentIntentId: 'pi_' + faker.random.alphaNumeric(8),
1614
extPaymentMethodId: 'pm_' + faker.random.alphaNumeric(8),
1715
currency: Currency.BGN,
18-
personId: associations.personId || null,
1916
billingEmail: faker.internet.email(),
2017
billingName: faker.name.fullName(),
2118
amount: parseInt(faker.finance.amount(2000, 20000)),

db/seed/donation/seed.ts renamed to db/seed/payment/seed.ts

Lines changed: 75 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
import {
22
PrismaClient,
33
PaymentProvider,
4-
DonationStatus,
5-
DonationType,
4+
PaymentStatus,
65
Person,
76
CampaignState,
7+
PaymentType,
8+
DonationType,
89
} from '@prisma/client'
910

10-
import { donationFactory } from './factory'
11+
import { paymentFactory } from './factory'
12+
import { faker } from '@faker-js/faker'
13+
import { donationFactory } from '../donations/factory'
1114

1215
const prisma = new PrismaClient()
1316

1417
const SEED_COMPLETED_CAMPAIGN_DONATIONS = 5
1518
const SEED_HEAVILY_FUNDED_CAMPAIGN_DONATIONS = 25
1619

17-
export async function donationsSeed() {
18-
console.log('Donations seed')
20+
export async function paymentsSeed() {
21+
console.log('Payments seed')
1922

2023
const person = await prisma.person.findFirst()
2124
if (!person) {
@@ -36,46 +39,68 @@ async function seedRandomDonations({ person }: SeedData) {
3639
if (!vault) {
3740
throw new Error('There are no vaults created yet!')
3841
}
39-
4042
const donationFactoryOptions = {
4143
associations: {
4244
personId: person.id,
4345
targetVaultId: vault.id,
4446
},
4547
}
4648

49+
const randomPaymentsData = [
50+
paymentFactory.build({
51+
type: PaymentType.single,
52+
provider: PaymentProvider.stripe,
53+
status: PaymentStatus.succeeded,
54+
}),
55+
paymentFactory.build({
56+
type: PaymentType.single,
57+
provider: PaymentProvider.stripe,
58+
status: PaymentStatus.declined,
59+
}),
60+
paymentFactory.build({
61+
type: PaymentType.single,
62+
provider: PaymentProvider.bank,
63+
status: PaymentStatus.initial,
64+
}),
65+
]
66+
4767
const randomDonationsData = [
4868
donationFactory.build(
4969
{
50-
type: DonationType.donation,
51-
provider: PaymentProvider.stripe,
52-
status: DonationStatus.succeeded,
70+
paymentId: randomPaymentsData[0].id,
71+
createdAt: randomPaymentsData[0].createdAt,
72+
updatedAt: randomPaymentsData[0].updatedAt,
5373
},
5474
donationFactoryOptions,
5575
),
5676
donationFactory.build(
5777
{
58-
type: DonationType.donation,
59-
provider: PaymentProvider.stripe,
60-
status: DonationStatus.declined,
78+
paymentId: randomPaymentsData[1].id,
79+
createdAt: randomPaymentsData[1].createdAt,
80+
updatedAt: randomPaymentsData[1].updatedAt,
6181
},
6282
donationFactoryOptions,
6383
),
6484
donationFactory.build(
6585
{
66-
type: DonationType.donation,
67-
provider: PaymentProvider.bank,
68-
status: DonationStatus.initial,
86+
paymentId: randomPaymentsData[2].id,
87+
createdAt: randomPaymentsData[2].createdAt,
88+
updatedAt: randomPaymentsData[2].updatedAt,
6989
},
7090
donationFactoryOptions,
7191
),
7292
]
93+
const insertRandomPayments = await prisma.payment.createMany({
94+
data: randomPaymentsData,
95+
skipDuplicates: true,
96+
})
7397

7498
const insertRandomDonations = await prisma.donation.createMany({
7599
data: randomDonationsData,
76100
skipDuplicates: true,
77101
})
78102

103+
console.log({ insertRandomPayments })
79104
console.log({ insertRandomDonations })
80105

81106
console.log('{ Updating first campaign vault: %s }', vault.id)
@@ -102,21 +127,33 @@ async function seedDonationsForCompletedCampaign({ person }: SeedData) {
102127
},
103128
}
104129

105-
const completedCampaignDonationsData = donationFactory.buildList(
130+
const completedCampaignPaymentsData = paymentFactory.buildList(
106131
SEED_COMPLETED_CAMPAIGN_DONATIONS,
107132
{
108-
type: DonationType.donation,
133+
type: PaymentType.single,
109134
provider: PaymentProvider.stripe,
110-
status: DonationStatus.succeeded,
135+
status: PaymentStatus.succeeded,
111136
},
112-
donationFactoryOptions,
113137
)
114138

139+
const completedCampaignDonationData = completedCampaignPaymentsData.map((payment) =>
140+
donationFactory.build(
141+
{ paymentId: payment.id, updatedAt: payment.updatedAt, createdAt: payment.createdAt },
142+
donationFactoryOptions,
143+
),
144+
)
145+
146+
const insertCompletedCampaignPayments = await prisma.payment.createMany({
147+
data: completedCampaignPaymentsData,
148+
skipDuplicates: true,
149+
})
150+
115151
const insertCompletedCampaignDonations = await prisma.donation.createMany({
116-
data: completedCampaignDonationsData,
152+
data: completedCampaignDonationData,
117153
skipDuplicates: true,
118154
})
119155

156+
console.log({ insertCompletedCampaignPayments })
120157
console.log({ insertCompletedCampaignDonations })
121158

122159
console.log('{ Updating completed campaign vault: %s }', completedCampaignVault.id)
@@ -145,21 +182,30 @@ async function seedDonationsForHeavilyFundedCampaign({ person }: SeedData) {
145182
},
146183
}
147184

148-
const heavilyFundedCampaignDonationsData = donationFactory.buildList(
185+
const heavilyFundedCampaignPaymentData = paymentFactory.buildList(
149186
SEED_HEAVILY_FUNDED_CAMPAIGN_DONATIONS,
150187
{
151-
type: DonationType.donation,
188+
type: PaymentType.single,
152189
provider: PaymentProvider.stripe,
153-
status: DonationStatus.succeeded,
190+
status: PaymentStatus.succeeded,
154191
},
155-
donationFactoryOptions,
192+
)
193+
const heavilyFundedCampaignDonationData = heavilyFundedCampaignPaymentData.map((payment) =>
194+
donationFactory.build(
195+
{ paymentId: payment.id, createdAt: payment.createdAt, updatedAt: payment.updatedAt },
196+
donationFactoryOptions,
197+
),
156198
)
157199

200+
const insertHeavilyFundedCampaignPayments = await prisma.payment.createMany({
201+
data: heavilyFundedCampaignPaymentData,
202+
skipDuplicates: true,
203+
})
158204
const insertHeavilyFundedCampaignDonations = await prisma.donation.createMany({
159-
data: heavilyFundedCampaignDonationsData,
205+
data: heavilyFundedCampaignDonationData,
160206
skipDuplicates: true,
161207
})
162-
208+
console.log({ insertHeavilyFundedCampaignPayments })
163209
console.log({ insertHeavilyFundedCampaignDonations })
164210

165211
console.log('{ Updating heavily-funded campaign vault: %s }', heavilyFundedCampaignVault.id)
@@ -172,13 +218,13 @@ async function seedDonationsForHeavilyFundedCampaign({ person }: SeedData) {
172218
* @param vaultId
173219
*/
174220
async function updateVault(vaultId: string) {
175-
const totalDonationsAmount = await prisma.donation.aggregate({
221+
const totalDonationsAmount = await prisma.payment.aggregate({
176222
_sum: {
177223
amount: true,
178224
},
179225
where: {
180-
targetVaultId: vaultId,
181-
status: DonationStatus.succeeded,
226+
donations: { some: { targetVaultId: vaultId } },
227+
status: PaymentStatus.succeeded,
182228
},
183229
})
184230

0 commit comments

Comments
 (0)