100 lines
3.3 KiB
JavaScript
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;
|