1
2
3
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114import { fileURLToPath } from 'node:url'
import path from 'path'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
import { ecommercePlugin, EUR, USD } from '@payloadcms/plugin-ecommerce'
import { stripeAdapter } from '@payloadcms/plugin-ecommerce/payments/stripe'
import type { EcommercePluginConfig } from '../../packages/plugin-ecommerce/src/types.js'
import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js'
import { devUser } from '../credentials.js'
import { Media } from './collections/Media.js'
import { Users } from './collections/Users.js'
import { seed } from './seed/index.js'
export const currenciesConfig: NonNullable<EcommercePluginConfig['currencies']> = {
supportedCurrencies: [
USD,
EUR,
{
code: 'JPY',
decimals: 0,
label: 'Japanese Yen',
symbol: 'ยฅ',
},
],
defaultCurrency: 'USD',
}
export default buildConfigWithDefaults({
collections: [Users, Media],
admin: {
importMap: {
baseDir: path.resolve(dirname),
},
},
maxDepth: 10,
onInit: async (payload) => {
await payload.create({
collection: 'users',
data: {
email: devUser.email,
password: devUser.password,
},
})
await seed(payload)
},
jobs: {
autoRun: undefined,
},
plugins: [
ecommercePlugin({
access: {
adminOnlyFieldAccess: ({ req }) => Boolean(req.user),
adminOrPublishedStatus: ({ req }) => {
if (req.user) {
return true
}
return {
_status: {
equals: 'published',
},
}
},
customerOnlyFieldAccess: ({ req }) => Boolean(req.user),
isAdmin: ({ req }) => Boolean(req.user),
isAuthenticated: ({ req }) => Boolean(req.user),
isCustomer: ({ req }) => Boolean(req.user),
isDocumentOwner: ({ req }) => {
if (req.user) {
return {
customer: {
equals: req.user.id,
},
}
}
return false
},
},
carts: {
allowGuestCarts: true,
},
customers: {
slug: 'users',
},
products: {
variants: true,
},
payments: {
paymentMethods: [
stripeAdapter({
secretKey: process.env.STRIPE_SECRET_KEY!,
publishableKey: process.env.STRIPE_PUBLISHABLE_KEY!,
webhookSecret: process.env.STRIPE_WEBHOOKS_SECRET!,
webhooks: {
'payment_intent.succeeded': ({ event, req }) => {
console.log({ event, data: event.data.object })
req.payload.logger.info('Payment succeeded')
},
},
}),
],
},
currencies: currenciesConfig,
}),
],
typescript: {
outputFile: path.resolve(dirname, 'payload-types.ts'),
},
})