feat: Create payment sessions (#6549)

~~Opening a draft PR to discuss a couple of implementation details that we should align on~~

**What**

Add workflow and API endpoint for creating payment sessions for a payment collection. Endpoint is currently `POST /store/payment-collection/:id/payment-sessions`. I suggested an alternative in a comment below.

Please note, we intentionally do not want to support creating payment sessions in bulk, as this would become a mess when having to manage multiple calls to third-party providers.
This commit is contained in:
Oli Juhl
2024-03-05 08:40:47 +00:00
committed by GitHub
parent 908b1dc3a2
commit 84208aafc1
30 changed files with 603 additions and 182 deletions
@@ -84,12 +84,12 @@ export default class PaymentCollection {
payment_providers = new Collection<PaymentProvider>(this)
@OneToMany(() => PaymentSession, (ps) => ps.payment_collection, {
cascade: [Cascade.REMOVE],
cascade: [Cascade.PERSIST, "soft-remove"] as any,
})
payment_sessions = new Collection<PaymentSession>(this)
@OneToMany(() => Payment, (payment) => payment.payment_collection, {
cascade: [Cascade.REMOVE],
cascade: [Cascade.PERSIST, "soft-remove"] as any,
})
payments = new Collection<Payment>(this)
@@ -54,19 +54,24 @@ export default class PaymentSession {
})
authorized_at: Date | null = null
@ManyToOne(() => PaymentCollection, {
persist: false,
})
payment_collection: PaymentCollection
@ManyToOne({
entity: () => PaymentCollection,
columnType: "text",
index: "IDX_payment_session_payment_collection_id",
fieldName: "payment_collection_id",
onDelete: "cascade",
mapToPk: true,
})
payment_collection!: PaymentCollection
payment_collection_id: string
@OneToOne({
entity: () => Payment,
mappedBy: (payment) => payment.payment_session,
cascade: ["soft-remove"] as any,
nullable: true,
mappedBy: "payment_session",
})
payment?: Payment | null
+12 -4
View File
@@ -109,18 +109,26 @@ export default class Payment {
captures = new Collection<Capture>(this)
@ManyToOne({
entity: () => PaymentCollection,
persist: false,
})
payment_collection: PaymentCollection
@ManyToOne({
entity: () => PaymentCollection,
columnType: "text",
index: "IDX_payment_payment_collection_id",
fieldName: "payment_collection_id",
onDelete: "cascade",
mapToPk: true,
})
payment_collection!: PaymentCollection
payment_collection_id: string
@OneToOne({
owner: true,
fieldName: "session_id",
fieldName: "payment_session_id",
index: "IDX_payment_payment_session_id",
})
payment_session!: PaymentSession
payment_session: PaymentSession
/** COMPUTED PROPERTIES START **/