Skip to content

Commit f620620

Browse files
chore: wip
1 parent f3513d4 commit f620620

File tree

16 files changed

+2521
-6
lines changed

16 files changed

+2521
-6
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Action } from '@stacksjs/actions'
2+
import { response } from '@stacksjs/router'
3+
4+
export default new Action({
5+
name: 'Payment Index',
6+
description: 'Payment Index ORM Action',
7+
method: 'GET',
8+
async handle() {
9+
const results = Payment.all()
10+
11+
return response.json(results)
12+
},
13+
})
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { PaymentRequestType } from '@stacksjs/orm'
2+
import { Action } from '@stacksjs/actions'
3+
4+
import { response } from '@stacksjs/router'
5+
6+
export default new Action({
7+
name: 'Payment Show',
8+
description: 'Payment Show ORM Action',
9+
method: 'GET',
10+
async handle(request: PaymentRequestType) {
11+
const id = request.getParam('id')
12+
13+
const model = await Payment.findOrFail(Number(id))
14+
15+
return response.json(model)
16+
},
17+
})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { PaymentRequestType } from '@stacksjs/orm'
2+
import { Action } from '@stacksjs/actions'
3+
4+
import { response } from '@stacksjs/router'
5+
6+
export default new Action({
7+
name: 'Payment Store',
8+
description: 'Payment Store ORM Action',
9+
method: 'POST',
10+
async handle(request: PaymentRequestType) {
11+
await request.validate()
12+
const model = await Payment.create(request.all())
13+
14+
return response.json(model)
15+
},
16+
})
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export type ModelNames = 'Project' | 'SubscriberEmail' | 'AccessToken' | 'Team' | 'Subscriber' | 'Deployment' | 'Release' | 'User' | 'Post' | 'Manufacturer' | 'OrderItem' | 'FailedJob' | 'Customer' | 'ProductReview' | 'Product' | 'PaymentMethod' | 'PaymentTransaction' | 'Request' | 'GiftCard' | 'Order' | 'Coupon' | 'Transaction' | 'LoyaltyPoint' | 'Job' | 'Subscription' | 'PaymentProduct' | 'LoyaltyReward' | 'Error' | 'ProductCategory'
1+
export type ModelNames = 'Project' | 'SubscriberEmail' | 'AccessToken' | 'Team' | 'Subscriber' | 'Deployment' | 'Release' | 'User' | 'Post' | 'Payment' | 'Manufacturer' | 'OrderItem' | 'FailedJob' | 'Customer' | 'ProductReview' | 'Product' | 'PaymentMethod' | 'PaymentTransaction' | 'Request' | 'GiftCard' | 'Order' | 'Coupon' | 'Transaction' | 'LoyaltyPoint' | 'Job' | 'Subscription' | 'PaymentProduct' | 'LoyaltyReward' | 'Error' | 'ProductCategory'
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export type TableNames = 'projects' | 'subscriber_emails' | 'personal_access_tokens' | 'team_users' | 'teams' | 'subscribers' | 'deployments' | 'releases' | 'team_users' | 'users' | 'posts' | 'manufacturers' | 'order_items' | 'failed_jobs' | 'customers' | 'product_reviews' | 'products' | 'payment_methods' | 'payment_transactions' | 'requests' | 'gift_cards' | 'orders' | 'coupons' | 'transactions' | 'loyalty_points' | 'jobs' | 'subscriptions' | 'payment_products' | 'loyalty_rewards' | 'errors' | 'product_categories'
1+
export type TableNames = 'projects' | 'subscriber_emails' | 'personal_access_tokens' | 'team_users' | 'teams' | 'subscribers' | 'deployments' | 'releases' | 'team_users' | 'users' | 'posts' | 'payments' | 'manufacturers' | 'order_items' | 'failed_jobs' | 'customers' | 'product_reviews' | 'products' | 'payment_methods' | 'payment_transactions' | 'requests' | 'gift_cards' | 'orders' | 'coupons' | 'transactions' | 'loyalty_points' | 'jobs' | 'subscriptions' | 'payment_products' | 'loyalty_rewards' | 'errors' | 'product_categories'
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
import type { Model } from '@stacksjs/types'
2+
import { schema } from '@stacksjs/validation'
3+
4+
export default {
5+
name: 'Payment',
6+
table: 'payments',
7+
primaryKey: 'id',
8+
autoIncrement: false, // Using UUID instead of auto-increment
9+
10+
traits: {
11+
useUuid: true,
12+
useTimestamps: true,
13+
useSearch: {
14+
displayable: ['id', 'order_id', 'customer_id', 'amount', 'method', 'status', 'date'],
15+
searchable: ['order_id', 'customer_id', 'reference_number'],
16+
sortable: ['date', 'amount', 'created_at'],
17+
filterable: ['method', 'status', 'date'],
18+
},
19+
20+
useSeeder: {
21+
count: 50,
22+
},
23+
24+
useApi: {
25+
uri: 'payments',
26+
routes: ['index', 'store', 'show'],
27+
},
28+
29+
observe: true,
30+
},
31+
32+
belongsTo: ['Order', 'User'], // For order_id and customer_id
33+
34+
attributes: {
35+
order_id: {
36+
required: true,
37+
order: 1,
38+
fillable: true,
39+
validation: {
40+
rule: schema.string(),
41+
},
42+
factory: faker => faker.string.uuid(),
43+
},
44+
45+
customer_id: {
46+
required: true,
47+
order: 2,
48+
fillable: true,
49+
validation: {
50+
rule: schema.string(),
51+
},
52+
factory: faker => faker.string.uuid(),
53+
},
54+
55+
amount: {
56+
required: true,
57+
order: 3,
58+
fillable: true,
59+
validation: {
60+
rule: schema.number().min(0.01),
61+
},
62+
factory: faker => Number.parseFloat(faker.commerce.price({ min: 10, max: 500, dec: 2 })),
63+
},
64+
65+
method: {
66+
required: true,
67+
order: 4,
68+
fillable: true,
69+
validation: {
70+
rule: schema.string(),
71+
},
72+
factory: faker => faker.helpers.arrayElement([
73+
'credit_card',
74+
'debit_card',
75+
'paypal',
76+
'apple_pay',
77+
'google_pay',
78+
'bank_transfer',
79+
'gift_card',
80+
]),
81+
},
82+
83+
status: {
84+
required: true,
85+
order: 5,
86+
fillable: true,
87+
validation: {
88+
rule: schema.string(),
89+
},
90+
factory: faker => faker.helpers.arrayElement([
91+
'pending',
92+
'processing',
93+
'completed',
94+
'failed',
95+
'refunded',
96+
'partially_refunded',
97+
]),
98+
},
99+
100+
date: {
101+
required: true,
102+
order: 6,
103+
fillable: true,
104+
validation: {
105+
rule: schema.date(),
106+
},
107+
factory: faker => faker.date.recent().toISOString(),
108+
},
109+
110+
currency: {
111+
required: false,
112+
order: 7,
113+
fillable: true,
114+
validation: {
115+
rule: schema.string().maxLength(3),
116+
},
117+
factory: faker => faker.helpers.arrayElement(['USD', 'EUR', 'GBP', 'CAD', 'AUD']),
118+
},
119+
120+
reference_number: {
121+
required: false,
122+
order: 8,
123+
fillable: true,
124+
validation: {
125+
rule: schema.string(),
126+
},
127+
factory: faker => faker.string.alphanumeric(16).toUpperCase(),
128+
},
129+
130+
card_last_four: {
131+
required: false,
132+
order: 9,
133+
fillable: true,
134+
validation: {
135+
rule: schema.string().maxLength(4),
136+
},
137+
factory: faker => faker.helpers.maybe(() => faker.finance.creditCardNumber('####'), { probability: 0.7 }),
138+
},
139+
140+
card_brand: {
141+
required: false,
142+
order: 10,
143+
fillable: true,
144+
validation: {
145+
rule: schema.string(),
146+
},
147+
factory: faker => faker.helpers.maybe(() => faker.helpers.arrayElement(['Visa', 'Mastercard', 'Amex', 'Discover']), { probability: 0.7 }),
148+
},
149+
150+
billing_email: {
151+
required: false,
152+
order: 11,
153+
fillable: true,
154+
validation: {
155+
rule: schema.string().email(),
156+
},
157+
factory: faker => faker.helpers.maybe(() => faker.internet.email(), { probability: 0.8 }),
158+
},
159+
160+
transaction_id: {
161+
required: false,
162+
order: 12,
163+
fillable: true,
164+
validation: {
165+
rule: schema.string(),
166+
},
167+
factory: faker => faker.helpers.maybe(() => faker.string.uuid(), { probability: 0.9 }),
168+
},
169+
170+
payment_provider: {
171+
required: false,
172+
order: 13,
173+
fillable: true,
174+
validation: {
175+
rule: schema.string(),
176+
},
177+
factory: faker => faker.helpers.maybe(() => faker.helpers.arrayElement(['stripe', 'paypal', 'square', 'braintree', 'authorize_net']), { probability: 0.9 }),
178+
},
179+
180+
refund_amount: {
181+
required: false,
182+
order: 14,
183+
fillable: true,
184+
validation: {
185+
rule: schema.number().min(0),
186+
},
187+
factory: faker => faker.helpers.maybe(() => Number.parseFloat(faker.commerce.price({ min: 5, max: 100, dec: 2 })), { probability: 0.2 }),
188+
},
189+
190+
notes: {
191+
required: false,
192+
order: 15,
193+
fillable: true,
194+
validation: {
195+
rule: schema.string(),
196+
},
197+
factory: faker => faker.helpers.maybe(() => faker.lorem.sentence(), { probability: 0.3 }),
198+
},
199+
},
200+
201+
dashboard: {
202+
highlight: true,
203+
},
204+
} satisfies Model

storage/framework/orm/routes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { route } from '@stacksjs/router'
22

3+
route.get('payments', 'PaymentIndexOrmAction')
4+
5+
route.post('payments', 'PaymentStoreOrmAction')
6+
7+
route.get('payments/{id}', 'PaymentShowOrmAction')
8+
39
route.get('product-manufacturers', 'ManufacturerIndexOrmAction')
410

511
route.post('product-manufacturers', 'ManufacturerStoreOrmAction')

storage/framework/orm/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export { default as Order } from './Order'
2424

2525
export { default as OrderItem } from './OrderItem'
2626

27+
export { default as Payment } from './Payment'
28+
2729
export { default as PaymentMethod } from './PaymentMethod'
2830

2931
export { default as PaymentProduct } from './PaymentProduct'

0 commit comments

Comments
 (0)