@86d-app/payments 0.0.3 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -0
- package/AGENTS.md +52 -45
- package/README.md +27 -7
- package/dist/__tests__/controllers.test.d.ts +2 -0
- package/dist/__tests__/controllers.test.d.ts.map +1 -0
- package/dist/__tests__/edge-cases.test.d.ts +2 -0
- package/dist/__tests__/edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/endpoint-security.test.d.ts +2 -0
- package/dist/__tests__/endpoint-security.test.d.ts.map +1 -0
- package/dist/__tests__/financial-safety.test.d.ts +2 -0
- package/dist/__tests__/financial-safety.test.d.ts.map +1 -0
- package/dist/__tests__/service-impl.test.d.ts +2 -0
- package/dist/__tests__/service-impl.test.d.ts.map +1 -0
- package/dist/admin/components/index.d.ts +2 -0
- package/dist/admin/components/index.d.ts.map +1 -0
- package/dist/admin/components/payments-admin.d.ts +2 -0
- package/dist/admin/components/payments-admin.d.ts.map +1 -0
- package/dist/admin/endpoints/create-refund.d.ts +20 -0
- package/dist/admin/endpoints/create-refund.d.ts.map +1 -0
- package/dist/admin/endpoints/get-intent.d.ts +16 -0
- package/dist/admin/endpoints/get-intent.d.ts.map +1 -0
- package/dist/admin/endpoints/index.d.ts +63 -0
- package/dist/admin/endpoints/index.d.ts.map +1 -0
- package/dist/admin/endpoints/list-intents.d.ts +22 -0
- package/dist/admin/endpoints/list-intents.d.ts.map +1 -0
- package/dist/admin/endpoints/list-refunds.d.ts +10 -0
- package/dist/admin/endpoints/list-refunds.d.ts.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/schema.d.ts +169 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/service-impl.d.ts +4 -0
- package/dist/service-impl.d.ts.map +1 -0
- package/dist/service.d.ts +125 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/store/endpoints/cancel-intent.d.ts +16 -0
- package/dist/store/endpoints/cancel-intent.d.ts.map +1 -0
- package/dist/store/endpoints/confirm-intent.d.ts +16 -0
- package/dist/store/endpoints/confirm-intent.d.ts.map +1 -0
- package/dist/store/endpoints/create-intent.d.ts +15 -0
- package/dist/store/endpoints/create-intent.d.ts.map +1 -0
- package/dist/store/endpoints/delete-method.d.ts +16 -0
- package/dist/store/endpoints/delete-method.d.ts.map +1 -0
- package/dist/store/endpoints/get-intent.d.ts +16 -0
- package/dist/store/endpoints/get-intent.d.ts.map +1 -0
- package/dist/store/endpoints/index.d.ts +83 -0
- package/dist/store/endpoints/index.d.ts.map +1 -0
- package/dist/store/endpoints/list-methods.d.ts +12 -0
- package/dist/store/endpoints/list-methods.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/__tests__/controllers.test.ts +1043 -0
- package/src/__tests__/edge-cases.test.ts +547 -0
- package/src/__tests__/endpoint-security.test.ts +360 -0
- package/src/__tests__/financial-safety.test.ts +576 -0
- package/src/__tests__/service-impl.test.ts +30 -5
- package/src/admin/endpoints/create-refund.ts +11 -6
- package/src/service-impl.ts +60 -0
- package/src/store/endpoints/cancel-intent.ts +20 -4
- package/src/store/endpoints/confirm-intent.ts +20 -4
- package/src/store/endpoints/create-intent.ts +18 -5
- package/src/store/endpoints/delete-method.ts +11 -1
- package/src/store/endpoints/get-intent.ts +1 -1
- package/src/store/endpoints/list-methods.ts +7 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[0m[2m[35m$[0m [2m[1mtsc[0m
|
package/AGENTS.md
CHANGED
|
@@ -1,47 +1,54 @@
|
|
|
1
1
|
# payments module
|
|
2
2
|
|
|
3
|
-
Provider-agnostic payment processing
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
3
|
+
Provider-agnostic payment processing. Tracks payment intents, saved payment methods, and refunds. Delegates processing to a configurable `PaymentProvider` (Stripe, Square, PayPal, etc.).
|
|
4
|
+
|
|
5
|
+
## File structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
src/
|
|
9
|
+
index.ts Module definition, PaymentsOptions
|
|
10
|
+
schema.ts paymentIntent, paymentMethod, refund entities
|
|
11
|
+
service.ts PaymentController, PaymentProvider, type definitions
|
|
12
|
+
service-impl.ts createPaymentController(data, provider?) factory
|
|
13
|
+
store/endpoints/ 6 customer-facing endpoints
|
|
14
|
+
admin/endpoints/ 4 admin endpoints
|
|
15
|
+
admin/components/ PaymentsAdmin UI (intents table, refund modal)
|
|
16
|
+
__tests__/
|
|
17
|
+
service-impl.test.ts Core CRUD (47 tests)
|
|
18
|
+
controllers.test.ts Edge cases (65 tests)
|
|
19
|
+
edge-cases.test.ts Provider, webhook, filter edge cases (32 tests)
|
|
20
|
+
endpoint-security.test.ts Security regressions (26 tests)
|
|
21
|
+
financial-safety.test.ts Amount validation, status guards, refund cap, webhook dedup (35 tests)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Key patterns
|
|
25
|
+
|
|
26
|
+
- **Amount**: Always in smallest currency unit (cents). Must be a positive integer at controller level.
|
|
27
|
+
- **Status machine**: `pending → processing → succeeded → refunded`. Terminal states: `cancelled`, `failed`, `refunded`.
|
|
28
|
+
- **Status guards**: `confirmIntent` only from pending/processing. `cancelIntent` only from pending/processing. `createRefund` only from succeeded/refunded.
|
|
29
|
+
- **Refund cap**: Cumulative non-failed refunds cannot exceed original intent amount. Controller calculates `totalRefunded()` before each refund.
|
|
30
|
+
- **Webhook dedup**: `handleWebhookRefund` deduplicates by `providerRefundId` — retries return the existing refund.
|
|
31
|
+
- **Default payment method**: Only one per customer. `savePaymentMethod(isDefault: true)` clears previous defaults.
|
|
32
|
+
- **Ownership**: Controller has no ownership checks — endpoints must verify `session.user.id === intent.customerId`.
|
|
33
|
+
- **Provider delegation**: If provider configured, delegates to it for createIntent/confirmIntent/cancelIntent/createRefund. Without provider, operates in local mode.
|
|
34
|
+
|
|
35
|
+
## Data models
|
|
36
|
+
|
|
37
|
+
- **paymentIntent**: id, providerIntentId?, customerId?, email?, amount, currency, status, orderId?, checkoutSessionId?, metadata, providerMetadata, timestamps
|
|
38
|
+
- **paymentMethod**: id, customerId, providerMethodId, type, last4?, brand?, expiryMonth?, expiryYear?, isDefault, timestamps
|
|
39
|
+
- **refund**: id, paymentIntentId, providerRefundId, amount, reason?, status (pending|succeeded|failed), timestamps
|
|
40
|
+
|
|
41
|
+
## Events emitted
|
|
42
|
+
|
|
43
|
+
`payment.completed`, `payment.failed`, `payment.refunded`
|
|
44
|
+
|
|
45
|
+
## Gotchas
|
|
46
|
+
|
|
47
|
+
- Endpoint validates `amount` as `z.number().int().positive()` — controller also validates (defense in depth).
|
|
48
|
+
- `createRefund` throws on non-existent intent, wrong status, exceeded cap, or missing provider. Endpoints should catch and return structured errors.
|
|
49
|
+
- `handleWebhookEvent` has no status guards — it trusts the provider (Stripe can set any status). `handleWebhookRefund` deduplicates but doesn't cap amounts (provider-side refunds are authoritative).
|
|
50
|
+
- Admin refund endpoint checks intent existence before calling controller, but doesn't validate intent status — controller handles that.
|
|
51
|
+
|
|
52
|
+
## Tests (205 total)
|
|
53
|
+
|
|
54
|
+
Run: `bun test` from this directory. All 5 test files cover: CRUD, status guards, refund cap, webhook dedup, provider delegation, customer isolation, pagination.
|
package/README.md
CHANGED
|
@@ -9,16 +9,15 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<a href="https://vercel.com/changelog"><strong>npm</strong></a> ·
|
|
13
12
|
<a href="https://x.com/86d_app"><strong>X</strong></a> ·
|
|
14
|
-
<a href="https://
|
|
13
|
+
<a href="https://www.linkedin.com/company/86d"><strong>LinkedIn</strong></a>
|
|
15
14
|
</p>
|
|
16
15
|
<br/>
|
|
17
16
|
|
|
18
17
|
> [!WARNING]
|
|
19
18
|
> This project is under active development and is not ready for production use. Please proceed with caution. Use at your own risk.
|
|
20
19
|
|
|
21
|
-
#
|
|
20
|
+
# Payments Module
|
|
22
21
|
|
|
23
22
|
Provider-agnostic payment processing for the 86d commerce platform. Tracks payment intents, saved payment methods, and refunds locally. Delegates actual processing to a configurable `PaymentProvider` (Stripe, Square, PayPal, etc.).
|
|
24
23
|
|
|
@@ -104,7 +103,7 @@ interface PaymentProvider {
|
|
|
104
103
|
// ── Payment intents ─────────────────────────────────────────────────────────
|
|
105
104
|
|
|
106
105
|
controller.createIntent(params: {
|
|
107
|
-
amount: number; //
|
|
106
|
+
amount: number; // positive integer, smallest currency unit (e.g. cents)
|
|
108
107
|
currency?: string; // default: module currency option
|
|
109
108
|
customerId?: string;
|
|
110
109
|
email?: string;
|
|
@@ -112,12 +111,15 @@ controller.createIntent(params: {
|
|
|
112
111
|
checkoutSessionId?: string;
|
|
113
112
|
metadata?: Record<string, unknown>;
|
|
114
113
|
}): Promise<PaymentIntent>
|
|
114
|
+
// Throws: "Amount must be a positive integer"
|
|
115
115
|
|
|
116
116
|
controller.getIntent(id: string): Promise<PaymentIntent | null>
|
|
117
117
|
|
|
118
118
|
controller.confirmIntent(id: string): Promise<PaymentIntent | null>
|
|
119
|
+
// Throws: "Cannot confirm intent in '{status}' state" for terminal states
|
|
119
120
|
|
|
120
121
|
controller.cancelIntent(id: string): Promise<PaymentIntent | null>
|
|
122
|
+
// Throws: "Cannot cancel intent in '{status}' state" for succeeded/failed/refunded
|
|
121
123
|
|
|
122
124
|
controller.listIntents(params?: {
|
|
123
125
|
customerId?: string;
|
|
@@ -149,12 +151,16 @@ controller.deletePaymentMethod(id: string): Promise<boolean>
|
|
|
149
151
|
|
|
150
152
|
// ── Refunds ─────────────────────────────────────────────────────────────────
|
|
151
153
|
|
|
152
|
-
//
|
|
154
|
+
// Only on succeeded/refunded intents. Cumulative refunds capped at intent amount.
|
|
153
155
|
controller.createRefund(params: {
|
|
154
156
|
intentId: string;
|
|
155
|
-
amount?: number; // omit for full refund
|
|
157
|
+
amount?: number; // positive integer; omit for full refund
|
|
156
158
|
reason?: string;
|
|
157
159
|
}): Promise<Refund>
|
|
160
|
+
// Throws: "Payment intent not found"
|
|
161
|
+
// Throws: "Cannot refund intent in '{status}' state"
|
|
162
|
+
// Throws: "Refund amount must be positive"
|
|
163
|
+
// Throws: "Refund amount {n} exceeds remaining refundable amount {m}"
|
|
158
164
|
|
|
159
165
|
controller.getRefund(id: string): Promise<Refund | null>
|
|
160
166
|
|
|
@@ -206,7 +212,21 @@ const method = await controller.savePaymentMethod({
|
|
|
206
212
|
| `succeeded` | Payment completed successfully |
|
|
207
213
|
| `failed` | Payment failed |
|
|
208
214
|
| `cancelled` | Intent was cancelled |
|
|
209
|
-
| `refunded` | Payment has been refunded |
|
|
215
|
+
| `refunded` | Payment has been (partially or fully) refunded |
|
|
216
|
+
|
|
217
|
+
## Financial Safety Guards
|
|
218
|
+
|
|
219
|
+
The payments controller enforces several financial safety rules at the controller level:
|
|
220
|
+
|
|
221
|
+
| Rule | Description |
|
|
222
|
+
|---|---|
|
|
223
|
+
| **Amount validation** | `createIntent` rejects zero, negative, and fractional amounts. Amount must be a positive integer (smallest currency unit). |
|
|
224
|
+
| **Confirm guards** | `confirmIntent` only works on `pending` or `processing` intents. Throws on `cancelled`, `failed`, `refunded`. |
|
|
225
|
+
| **Cancel guards** | `cancelIntent` only works on `pending` or `processing` intents. Throws on `succeeded`, `failed`, `refunded`. |
|
|
226
|
+
| **Refund guards** | `createRefund` only works on `succeeded` or `refunded` intents. Throws on `pending`, `processing`, `cancelled`, `failed`. |
|
|
227
|
+
| **Refund cap** | Cumulative non-failed refunds cannot exceed the original intent amount. Partial refunds are tracked and summed. |
|
|
228
|
+
| **Refund amount** | Refund amount must be positive. Zero and negative amounts are rejected. |
|
|
229
|
+
| **Webhook dedup** | `handleWebhookRefund` deduplicates by `providerRefundId` — webhook retries return the existing refund instead of creating duplicates. |
|
|
210
230
|
|
|
211
231
|
## Types
|
|
212
232
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controllers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/controllers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-cases.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/edge-cases.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-security.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/endpoint-security.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financial-safety.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/financial-safety.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-impl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/service-impl.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payments-admin.d.ts","sourceRoot":"","sources":["../../../src/admin/components/payments-admin.tsx"],"names":[],"mappings":"AA8fA,wBAAgB,aAAa,gCAU5B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "@86d-app/core";
|
|
2
|
+
export declare const createRefund: import("better-call").StrictEndpoint<"/admin/payments/:id/refund", {
|
|
3
|
+
method: "POST";
|
|
4
|
+
params: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
body: z.ZodObject<{
|
|
8
|
+
amount: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
reason: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
}, {
|
|
12
|
+
error: string;
|
|
13
|
+
status: number;
|
|
14
|
+
refund?: never;
|
|
15
|
+
} | {
|
|
16
|
+
refund: import("../..").Refund;
|
|
17
|
+
error?: never;
|
|
18
|
+
status?: never;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=create-refund.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-refund.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/create-refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,CAAC,EAAE,MAAM,eAAe,CAAC;AAGrE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;EA0BxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "@86d-app/core";
|
|
2
|
+
export declare const getIntentAdmin: import("better-call").StrictEndpoint<"/admin/payments/:id", {
|
|
3
|
+
method: "GET";
|
|
4
|
+
params: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
}, {
|
|
8
|
+
error: string;
|
|
9
|
+
status: number;
|
|
10
|
+
intent?: never;
|
|
11
|
+
} | {
|
|
12
|
+
intent: import("../..").PaymentIntent;
|
|
13
|
+
error?: never;
|
|
14
|
+
status?: never;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=get-intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-intent.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/get-intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,CAAC,EAAE,MAAM,eAAe,CAAC;AAGvD,eAAO,MAAM,cAAc;;;;;;;;;;;;;EAY1B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare const adminEndpoints: {
|
|
2
|
+
"/admin/payments": import("better-call").StrictEndpoint<"/admin/payments", {
|
|
3
|
+
method: "GET";
|
|
4
|
+
query: import("zod").ZodObject<{
|
|
5
|
+
customerId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
6
|
+
status: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
7
|
+
pending: "pending";
|
|
8
|
+
processing: "processing";
|
|
9
|
+
succeeded: "succeeded";
|
|
10
|
+
failed: "failed";
|
|
11
|
+
cancelled: "cancelled";
|
|
12
|
+
refunded: "refunded";
|
|
13
|
+
}>>;
|
|
14
|
+
orderId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
15
|
+
take: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
|
|
16
|
+
skip: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
|
|
17
|
+
}, import("zod/v4/core").$strip>;
|
|
18
|
+
}, {
|
|
19
|
+
intents: import("../..").PaymentIntent[];
|
|
20
|
+
total: number;
|
|
21
|
+
}>;
|
|
22
|
+
"/admin/payments/:id": import("better-call").StrictEndpoint<"/admin/payments/:id", {
|
|
23
|
+
method: "GET";
|
|
24
|
+
params: import("zod").ZodObject<{
|
|
25
|
+
id: import("zod").ZodString;
|
|
26
|
+
}, import("zod/v4/core").$strip>;
|
|
27
|
+
}, {
|
|
28
|
+
error: string;
|
|
29
|
+
status: number;
|
|
30
|
+
intent?: never;
|
|
31
|
+
} | {
|
|
32
|
+
intent: import("../..").PaymentIntent;
|
|
33
|
+
error?: never;
|
|
34
|
+
status?: never;
|
|
35
|
+
}>;
|
|
36
|
+
"/admin/payments/:id/refund": import("better-call").StrictEndpoint<"/admin/payments/:id/refund", {
|
|
37
|
+
method: "POST";
|
|
38
|
+
params: import("zod").ZodObject<{
|
|
39
|
+
id: import("zod").ZodString;
|
|
40
|
+
}, import("zod/v4/core").$strip>;
|
|
41
|
+
body: import("zod").ZodObject<{
|
|
42
|
+
amount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
43
|
+
reason: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
|
|
44
|
+
}, import("zod/v4/core").$strip>;
|
|
45
|
+
}, {
|
|
46
|
+
error: string;
|
|
47
|
+
status: number;
|
|
48
|
+
refund?: never;
|
|
49
|
+
} | {
|
|
50
|
+
refund: import("../..").Refund;
|
|
51
|
+
error?: never;
|
|
52
|
+
status?: never;
|
|
53
|
+
}>;
|
|
54
|
+
"/admin/payments/:id/refunds": import("better-call").StrictEndpoint<"/admin/payments/:id/refunds", {
|
|
55
|
+
method: "GET";
|
|
56
|
+
params: import("zod").ZodObject<{
|
|
57
|
+
id: import("zod").ZodString;
|
|
58
|
+
}, import("zod/v4/core").$strip>;
|
|
59
|
+
}, {
|
|
60
|
+
refunds: import("../..").Refund[];
|
|
61
|
+
}>;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK1B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "@86d-app/core";
|
|
2
|
+
export declare const listIntents: import("better-call").StrictEndpoint<"/admin/payments", {
|
|
3
|
+
method: "GET";
|
|
4
|
+
query: z.ZodObject<{
|
|
5
|
+
customerId: z.ZodOptional<z.ZodString>;
|
|
6
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
pending: "pending";
|
|
8
|
+
processing: "processing";
|
|
9
|
+
succeeded: "succeeded";
|
|
10
|
+
failed: "failed";
|
|
11
|
+
cancelled: "cancelled";
|
|
12
|
+
refunded: "refunded";
|
|
13
|
+
}>>;
|
|
14
|
+
orderId: z.ZodOptional<z.ZodString>;
|
|
15
|
+
take: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
16
|
+
skip: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
}, {
|
|
19
|
+
intents: import("../..").PaymentIntent[];
|
|
20
|
+
total: number;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=list-intents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-intents.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/list-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,CAAC,EAAE,MAAM,eAAe,CAAC;AAGvD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;EAgCvB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "@86d-app/core";
|
|
2
|
+
export declare const listRefunds: import("better-call").StrictEndpoint<"/admin/payments/:id/refunds", {
|
|
3
|
+
method: "GET";
|
|
4
|
+
params: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
}, {
|
|
8
|
+
refunds: import("../..").Refund[];
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=list-refunds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-refunds.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/list-refunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,CAAC,EAAE,MAAM,eAAe,CAAC;AAGvD,eAAO,MAAM,WAAW;;;;;;;EAWvB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Module } from "@86d-app/core";
|
|
2
|
+
import type { PaymentProvider } from "./service";
|
|
3
|
+
export type { PaymentController, PaymentIntent, PaymentIntentStatus, PaymentMethod, PaymentProvider, ProviderIntentResult, ProviderRefundResult, Refund, RefundStatus, } from "./service";
|
|
4
|
+
export interface PaymentsOptions {
|
|
5
|
+
/** Default currency for payment intents */
|
|
6
|
+
currency?: string;
|
|
7
|
+
/** Payment provider implementation (e.g. StripePaymentProvider) */
|
|
8
|
+
provider?: PaymentProvider;
|
|
9
|
+
}
|
|
10
|
+
export default function payments(options?: PaymentsOptions): Module;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjD,YAAY,EACX,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,MAAM,EACN,YAAY,GACZ,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CA+BlE"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
export declare const paymentsSchema: {
|
|
2
|
+
paymentIntent: {
|
|
3
|
+
fields: {
|
|
4
|
+
id: {
|
|
5
|
+
type: "string";
|
|
6
|
+
required: true;
|
|
7
|
+
};
|
|
8
|
+
/** Provider-assigned intent ID (e.g. Stripe's pi_xxx) */
|
|
9
|
+
providerIntentId: {
|
|
10
|
+
type: "string";
|
|
11
|
+
required: false;
|
|
12
|
+
};
|
|
13
|
+
customerId: {
|
|
14
|
+
type: "string";
|
|
15
|
+
required: false;
|
|
16
|
+
};
|
|
17
|
+
email: {
|
|
18
|
+
type: "string";
|
|
19
|
+
required: false;
|
|
20
|
+
};
|
|
21
|
+
/** Amount in smallest currency unit (e.g. cents) */
|
|
22
|
+
amount: {
|
|
23
|
+
type: "number";
|
|
24
|
+
required: true;
|
|
25
|
+
};
|
|
26
|
+
currency: {
|
|
27
|
+
type: "string";
|
|
28
|
+
required: true;
|
|
29
|
+
defaultValue: string;
|
|
30
|
+
};
|
|
31
|
+
status: {
|
|
32
|
+
type: ("pending" | "processing" | "succeeded" | "failed" | "cancelled" | "refunded")[];
|
|
33
|
+
required: true;
|
|
34
|
+
defaultValue: string;
|
|
35
|
+
};
|
|
36
|
+
paymentMethodId: {
|
|
37
|
+
type: "string";
|
|
38
|
+
required: false;
|
|
39
|
+
};
|
|
40
|
+
orderId: {
|
|
41
|
+
type: "string";
|
|
42
|
+
required: false;
|
|
43
|
+
};
|
|
44
|
+
checkoutSessionId: {
|
|
45
|
+
type: "string";
|
|
46
|
+
required: false;
|
|
47
|
+
};
|
|
48
|
+
metadata: {
|
|
49
|
+
type: "json";
|
|
50
|
+
required: false;
|
|
51
|
+
defaultValue: {};
|
|
52
|
+
};
|
|
53
|
+
providerMetadata: {
|
|
54
|
+
type: "json";
|
|
55
|
+
required: false;
|
|
56
|
+
defaultValue: {};
|
|
57
|
+
};
|
|
58
|
+
createdAt: {
|
|
59
|
+
type: "date";
|
|
60
|
+
required: true;
|
|
61
|
+
defaultValue: () => Date;
|
|
62
|
+
};
|
|
63
|
+
updatedAt: {
|
|
64
|
+
type: "date";
|
|
65
|
+
required: true;
|
|
66
|
+
defaultValue: () => Date;
|
|
67
|
+
onUpdate: () => Date;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
paymentMethod: {
|
|
72
|
+
fields: {
|
|
73
|
+
id: {
|
|
74
|
+
type: "string";
|
|
75
|
+
required: true;
|
|
76
|
+
};
|
|
77
|
+
customerId: {
|
|
78
|
+
type: "string";
|
|
79
|
+
required: true;
|
|
80
|
+
};
|
|
81
|
+
/** Provider-assigned method ID (e.g. Stripe's pm_xxx) */
|
|
82
|
+
providerMethodId: {
|
|
83
|
+
type: "string";
|
|
84
|
+
required: true;
|
|
85
|
+
};
|
|
86
|
+
/** card | bank_transfer | wallet */
|
|
87
|
+
type: {
|
|
88
|
+
type: "string";
|
|
89
|
+
required: true;
|
|
90
|
+
defaultValue: string;
|
|
91
|
+
};
|
|
92
|
+
last4: {
|
|
93
|
+
type: "string";
|
|
94
|
+
required: false;
|
|
95
|
+
};
|
|
96
|
+
brand: {
|
|
97
|
+
type: "string";
|
|
98
|
+
required: false;
|
|
99
|
+
};
|
|
100
|
+
expiryMonth: {
|
|
101
|
+
type: "number";
|
|
102
|
+
required: false;
|
|
103
|
+
};
|
|
104
|
+
expiryYear: {
|
|
105
|
+
type: "number";
|
|
106
|
+
required: false;
|
|
107
|
+
};
|
|
108
|
+
isDefault: {
|
|
109
|
+
type: "boolean";
|
|
110
|
+
required: true;
|
|
111
|
+
defaultValue: false;
|
|
112
|
+
};
|
|
113
|
+
createdAt: {
|
|
114
|
+
type: "date";
|
|
115
|
+
required: true;
|
|
116
|
+
defaultValue: () => Date;
|
|
117
|
+
};
|
|
118
|
+
updatedAt: {
|
|
119
|
+
type: "date";
|
|
120
|
+
required: true;
|
|
121
|
+
defaultValue: () => Date;
|
|
122
|
+
onUpdate: () => Date;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
refund: {
|
|
127
|
+
fields: {
|
|
128
|
+
id: {
|
|
129
|
+
type: "string";
|
|
130
|
+
required: true;
|
|
131
|
+
};
|
|
132
|
+
paymentIntentId: {
|
|
133
|
+
type: "string";
|
|
134
|
+
required: true;
|
|
135
|
+
};
|
|
136
|
+
/** Provider-assigned refund ID */
|
|
137
|
+
providerRefundId: {
|
|
138
|
+
type: "string";
|
|
139
|
+
required: true;
|
|
140
|
+
};
|
|
141
|
+
/** Refund amount in smallest currency unit */
|
|
142
|
+
amount: {
|
|
143
|
+
type: "number";
|
|
144
|
+
required: true;
|
|
145
|
+
};
|
|
146
|
+
reason: {
|
|
147
|
+
type: "string";
|
|
148
|
+
required: false;
|
|
149
|
+
};
|
|
150
|
+
status: {
|
|
151
|
+
type: ("pending" | "succeeded" | "failed")[];
|
|
152
|
+
required: true;
|
|
153
|
+
defaultValue: string;
|
|
154
|
+
};
|
|
155
|
+
createdAt: {
|
|
156
|
+
type: "date";
|
|
157
|
+
required: true;
|
|
158
|
+
defaultValue: () => Date;
|
|
159
|
+
};
|
|
160
|
+
updatedAt: {
|
|
161
|
+
type: "date";
|
|
162
|
+
required: true;
|
|
163
|
+
defaultValue: () => Date;
|
|
164
|
+
onUpdate: () => Date;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;YAIxB,yDAAyD;;;;;;;;;;;;;YAIzD,oDAAoD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAqCpD,yDAAyD;;;;;YAEzD,oCAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwBpC,kCAAkC;;;;;YAElC,8CAA8C;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ModuleDataService } from "@86d-app/core";
|
|
2
|
+
import type { PaymentController, PaymentProvider } from "./service";
|
|
3
|
+
export declare function createPaymentController(data: ModuleDataService, provider?: PaymentProvider): PaymentController;
|
|
4
|
+
//# sourceMappingURL=service-impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-impl.d.ts","sourceRoot":"","sources":["../src/service-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EACX,iBAAiB,EAIjB,eAAe,EAEf,MAAM,WAAW,CAAC;AAEnB,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,CAAC,EAAE,eAAe,GACxB,iBAAiB,CAyXnB"}
|