@lumra/module-entitlements
v0.1.1
Published
Lumra backend entitlement helpers (grant, validate, revoke)
Readme
@lumra/module-entitlements
Webhook handler that automatically grants video access when a Stripe or PayPal payment completes. Bridges @lumra/payments events to @lumra/entitlements.
Install
npm install @lumra/module-entitlements @lumra/payments @lumra/entitlementsUsage
import { handlePaymentWebhook, checkAccess } from '@lumra/module-entitlements'
// In your webhook route:
const event = await getProvider('stripe').handleWebhook(rawBody, signature)
await handlePaymentWebhook(event, {
savePurchase: (purchase) => db.purchases.create(purchase),
// Optional: expiresInMs per resourceId
// getExpiresInMs: (resourceId) => db.videos.find(resourceId).rentalWindowMs,
})
// In your access check route:
const result = await checkAccess({
userId: req.user.id,
resourceId: req.query.resourceId,
getUserPurchases: (uid) => db.purchases.findAll({ where: { userId: uid } }),
})
res.json({ allowed: result.allowed })Full Express example
import express from 'express'
import { registerProvider, getProvider } from '@lumra/payments'
import { createStripeConnectProvider } from '@lumra/module-stripe-connect'
import { handlePaymentWebhook, checkAccess } from '@lumra/module-entitlements'
registerProvider(createStripeConnectProvider({
secretKey: process.env.STRIPE_SECRET_KEY!,
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET!,
}))
const app = express()
app.use(express.json())
app.get('/api/access', async (req, res) => {
const result = await checkAccess({
userId: req.user.id,
resourceId: req.query.resourceId as string,
getUserPurchases: (uid) => db.purchases.findAll({ userId: uid }),
})
res.json(result)
})
app.post('/api/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
const event = await getProvider('stripe').handleWebhook(
req.body as Buffer,
req.headers['stripe-signature'] as string,
)
await handlePaymentWebhook(event, { savePurchase: db.purchases.create })
res.json({ received: true })
})© 2026 Reel Foundry AU. All rights reserved.
MIT License — see LICENSE
