Files
LNpaywall/backend/src/routes/public.js
2025-12-14 23:08:45 -03:00

98 lines
2.8 KiB
JavaScript

import { Router } from 'express';
import { paywallService } from '../services/paywall.js';
import { accessService } from '../services/access.js';
const router = Router();
// Get public paywall data for hosted page
router.get('/:slugOrId', async (req, res, next) => {
try {
const { slugOrId } = req.params;
const paywall = await paywallService.findBySlugOrId(slugOrId);
// Check if user already has access
const tokenId = req.cookies?.[`token_id_${paywall.id}`];
let hasAccess = false;
let accessInfo = null;
if (tokenId) {
const accessResult = await accessService.checkAccessByCookie(tokenId, paywall.id);
hasAccess = accessResult.hasAccess;
if (hasAccess) {
accessInfo = {
originalUrl: accessResult.paywall.originalUrl,
expiresAt: accessResult.accessGrant?.expiresAt,
};
}
}
res.json({
paywall: {
id: paywall.id,
title: paywall.title,
description: paywall.description,
coverImageUrl: paywall.coverImageUrl,
priceSats: paywall.priceSats,
previewMode: paywall.previewMode,
previewContent: paywall.previewContent,
originalUrlType: paywall.originalUrlType,
customSuccessMessage: paywall.customSuccessMessage,
customBranding: paywall.customBranding,
// Only include original URL if user has access
originalUrl: hasAccess ? paywall.originalUrl : null,
creator: paywall.creator,
},
hasAccess,
accessInfo,
});
} catch (error) {
next(error);
}
});
// Get paywall for embed (checks origin)
router.get('/:id/embed-data', async (req, res, next) => {
try {
const { id } = req.params;
const paywall = await paywallService.findById(id);
// Check origin restrictions
const origin = req.get('origin') || req.get('referer');
if (paywall.allowedEmbedOrigins && paywall.allowedEmbedOrigins.length > 0) {
const allowed = paywall.allowedEmbedOrigins.some(allowedOrigin => {
if (!origin) return false;
return origin.includes(allowedOrigin);
});
if (!allowed && origin) {
return res.status(403).json({
error: 'Embedding not allowed from this origin',
});
}
}
if (!paywall.allowEmbed) {
return res.status(403).json({
error: 'Embedding is disabled for this paywall',
});
}
res.json({
id: paywall.id,
title: paywall.title,
description: paywall.description,
coverImageUrl: paywall.coverImageUrl,
priceSats: paywall.priceSats,
previewMode: paywall.previewMode,
previewContent: paywall.previewContent,
customBranding: paywall.customBranding,
creator: paywall.creator,
});
} catch (error) {
next(error);
}
});
export default router;