sms-extension-1777535448/server/routes/events.js
2026-03-26 14:19:26 +05:30

100 lines
3.3 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { fetchJSON, uploadJSON } = require('../services/pixelbin');
const { generateTemplates } = require('../services/openai2');
const DEFAULT_EVENTS = require('../config/defaultEvents');
function slugify(text) {
return text.toLowerCase().trim().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '');
}
// GET /api/events
router.get('/', async (req, res) => {
try {
const data = await fetchJSON(`brands/${process.env.MERCHANT_ID}`, 'events');
res.json(data || { events: DEFAULT_EVENTS });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// POST /api/events — add custom event
router.post('/', async (req, res) => {
try {
const { label } = req.body;
if (!label) return res.status(400).json({ error: 'label is required' });
const folder = `brands/${process.env.MERCHANT_ID}`;
const data = await fetchJSON(folder, 'events') || { events: [...DEFAULT_EVENTS] };
const slug = slugify(label);
if (data.events.some(e => e.slug === slug)) {
return res.status(409).json({ error: 'An event with this name already exists' });
}
const newEvent = { slug, label, isDefault: false };
data.events.push(newEvent);
await uploadJSON(folder, 'events', data);
res.json(newEvent);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// DELETE /api/events/:slug
router.delete('/:slug', async (req, res) => {
try {
const { slug } = req.params;
const folder = `brands/${process.env.MERCHANT_ID}`;
const data = await fetchJSON(folder, 'events') || { events: [...DEFAULT_EVENTS] };
const event = data.events.find(e => e.slug === slug);
if (!event) return res.status(404).json({ error: 'Event not found' });
if (event.isDefault) return res.status(403).json({ error: 'Cannot delete a default event' });
data.events = data.events.filter(e => e.slug !== slug);
await uploadJSON(folder, 'events', data);
res.json({ ok: true });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// POST /api/events/:slug/generate
router.post('/:slug/generate', async (req, res) => {
try {
const { slug } = req.params;
const folder = `brands/${process.env.MERCHANT_ID}`;
const context = await fetchJSON(folder, 'context');
if (!context) return res.status(400).json({ error: 'Register your business before generating templates.' });
const eventsData = await fetchJSON(folder, 'events') || { events: DEFAULT_EVENTS };
const event = eventsData.events.find(e => e.slug === slug);
if (!event) return res.status(404).json({ error: 'Event not found' });
const variants = await generateTemplates(context, slug, event.label);
const templateJson = {
eventSlug: slug,
eventLabel: event.label,
generatedVariants: variants,
approvedVariant: null,
whitelistStatus: 'pending',
rawCurl: '',
processedCurl: '',
variableMap: {},
selectedImagePath: '',
updatedAt: new Date().toISOString(),
};
await uploadJSON(`${folder}/templates`, slug, templateJson);
res.json({ variants });
} catch (err) {
console.error('Generate error:', err.message);
res.status(500).json({ error: err.message });
}
});
module.exports = router;