Add PayloadCMS type definitions, Prettier config, and PNPM lockfile

This commit is contained in:
2025-09-13 17:17:50 +02:00
parent bb86a68fa2
commit b995bdb505
50 changed files with 16356 additions and 0 deletions

132
src/index.ts Normal file
View File

@@ -0,0 +1,132 @@
import type { Config } from 'payload'
import type { BillingPluginConfig } from './types'
import { createCustomersCollection } from './collections/customers'
import { createInvoicesCollection } from './collections/invoices'
import { createPaymentsCollection } from './collections/payments'
import { createRefundsCollection } from './collections/refunds'
import { providerRegistry } from './providers/base/provider'
import { TestPaymentProvider } from './providers/test/provider'
export * from './providers/base/provider'
export * from './providers/test/provider'
export * from './types'
export const billingPlugin = (pluginConfig: BillingPluginConfig = {}) => (config: Config): Config => {
if (pluginConfig.disabled) {
return config
}
// Initialize collections
if (!config.collections) {
config.collections = []
}
config.collections.push(
createPaymentsCollection(pluginConfig.collections?.payments || 'payments'),
createCustomersCollection(pluginConfig.collections?.customers || 'customers'),
createInvoicesCollection(pluginConfig.collections?.invoices || 'invoices'),
createRefundsCollection(pluginConfig.collections?.refunds || 'refunds'),
)
// Initialize endpoints
if (!config.endpoints) {
config.endpoints = []
}
config.endpoints?.push(
// Webhook endpoints
{
handler: async (req) => {
try {
const provider = providerRegistry.get(req.routeParams?.provider as string)
if (!provider) {
return Response.json({ error: 'Provider not found' }, { status: 404 })
}
const signature = req.headers.get('stripe-signature') ||
req.headers.get('x-mollie-signature')
const event = await provider.handleWebhook(req as unknown as Request, signature || '')
// TODO: Process webhook event and update database
return Response.json({ eventId: event.id, received: true })
} catch (error) {
console.error('[BILLING] Webhook error:', error)
return Response.json({ error: 'Webhook processing failed' }, { status: 400 })
}
},
method: 'post',
path: '/billing/webhooks/:provider'
},
// Health check endpoint
{
handler: async () => {
const providers = providerRegistry.getAll().map(p => ({
name: p.name,
status: 'active'
}))
return Response.json({
providers,
status: 'ok',
version: '0.1.0'
})
},
method: 'get',
path: '/billing/health'
}
)
// Initialize providers and onInit hook
const incomingOnInit = config.onInit
config.onInit = async (payload) => {
// Execute any existing onInit functions first
if (incomingOnInit) {
await incomingOnInit(payload)
}
// Initialize payment providers
initializeProviders(pluginConfig)
// Log initialization
console.log('[BILLING] Plugin initialized with providers:',
providerRegistry.getAll().map(p => p.name).join(', ')
)
}
return config
}
function initializeProviders(config: BillingPluginConfig) {
// Initialize test provider if enabled
if (config.providers?.test?.enabled) {
const testProvider = new TestPaymentProvider(config.providers.test)
providerRegistry.register(testProvider)
}
// TODO: Initialize Stripe provider
// TODO: Initialize Mollie provider
}
// Utility function to get payment provider
export function getPaymentProvider(name: string) {
const provider = providerRegistry.get(name)
if (!provider) {
throw new Error(`Payment provider '${name}' not found`)
}
return provider
}
// Utility function to list available providers
export function getAvailableProviders() {
return providerRegistry.getAll().map(p => ({
name: p.name,
// Add provider-specific info here
}))
}
export default billingPlugin