feat: content generation engine - spintax resolver, API endpoints, BullMQ worker

This commit is contained in:
cawcenter
2025-12-15 01:53:51 -05:00
parent 2a9b4c5f92
commit 0fc881c0ad
6 changed files with 727 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
// API Endpoint: POST /api/god/campaigns/launch/[id]
import type { APIRoute } from 'astro';
import { pool } from '../../../../../lib/db/db';
import { batchQueue } from '../../../../../lib/queue/config';
export const POST: APIRoute = async ({ params, request }) => {
try {
const godToken = request.headers.get('X-God-Token');
if (!godToken || godToken !== import.meta.env.GOD_TOKEN) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
headers: { 'Content-Type': 'application/json' }
});
}
const { id } = params;
if (!id) {
return new Response(JSON.stringify({ error: 'Campaign ID required' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
// Fetch campaign
const result = await pool.query(
`SELECT id, name, blueprint_json FROM campaign_masters WHERE id = $1`,
[id]
);
if (result.rows.length === 0) {
return new Response(JSON.stringify({ error: 'Campaign not found' }), {
status: 404,
headers: { 'Content-Type': 'application/json' }
});
}
const campaign = result.rows[0];
// Queue the job
await batchQueue.add('generate_campaign_content', {
campaignId: id,
campaignName: campaign.name
});
// Update status
await pool.query(
`UPDATE campaign_masters SET status = 'processing', updated_at = NOW() WHERE id = $1`,
[id]
);
return new Response(JSON.stringify({
success: true,
campaignId: id,
message: 'Campaign queued for generation',
status: 'processing'
}), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
} catch (error: any) {
console.error('Campaign launch error:', error);
return new Response(JSON.stringify({
error: 'Campaign launch failed',
details: error.message
}), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
};