// const express = require('express'); // const multer = require('multer'); // const { addTask, getTaskStatus, getTaskResult } = require('../../queue'); // const router = express.Router(); // const upload = multer(); // // ---------------- Submit new shadow task ---------------- // router.post('/generate', upload.single('image'), async (req, res) => { // if (!req.file) return res.status(400).json({ error: 'No image uploaded' }); // const options = { // type: req.body.mode || 'cast', // dir: req.body.dir || 'back', // blur: parseInt(req.body.blur) || 20, // opacity: parseFloat(req.body.opacity) || 0.35, // lightX: req.body.lightX ? parseFloat(req.body.lightX) : undefined, // lightY: req.body.lightY ? parseFloat(req.body.lightY) : undefined // }; // try { // const taskId = await addTask(req.file.buffer, options); // res.json({ taskId }); // } catch (err) { // console.error('Error adding task:', err); // res.status(500).json({ error: 'Failed to add task' }); // } // }); // // ---------------- Check task status ---------------- // router.get('/status/:id', (req, res) => { // const status = getTaskStatus(req.params.id); // res.json({ status }); // }); // // ---------------- Fetch completed result ---------------- // router.get('/result/:id', (req, res) => { // const result = getTaskResult(req.params.id); // if (!result) return res.status(404).json({ error: 'Result not ready' }); // res.set('Content-Type', 'image/png'); // res.send(result); // }); // module.exports = router; const express = require('express'); const multer = require('multer'); const { addTask, getTaskStatus, getTaskResult, getQueueLength } = require('./queues/taskQueue'); const app = express(); const router = express.Router(); const upload = multer(); console.log('🔹 Initializing Shadow Backend...'); // ---------------- CORS Middleware ---------------- app.use((req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); if (req.method === 'OPTIONS') return res.sendStatus(200); next(); }); // ---------------- Root route ---------------- app.get('/', (req, res) => res.send('Shadow Backend is running ✅')); // ---------------- Submit new shadow task ---------------- router.post('/add-shadow', upload.single('file'), async (req, res) => { console.log('🔹 /add-shadow called'); if (!req.file) return res.status(400).json({ error: 'No image uploaded' }); const options = { type: req.body.type || 'cast', dir: req.body.dir || 'back', blur: req.body.blur ? parseInt(req.body.blur) : 20, opacity: req.body.opacity ? parseFloat(req.body.opacity) : 0.35, lightX: req.body.lightX ? parseFloat(req.body.lightX) : undefined, lightY: req.body.lightY ? parseFloat(req.body.lightY) : undefined, }; try { const taskId = await addTask(req.file.buffer, options); res.json({ task_id: taskId }); } catch (err) { console.error(err); res.status(500).json({ error: 'Server busy, try again' }); } }); // ---------------- Server status ---------------- router.get('/status', (req, res) => { res.json({ status: 'ok', queue_length: getQueueLength() }); }); // ---------------- Poll for result ---------------- router.get('/result/:id', (req, res) => { const taskId = req.params.id; const status = getTaskStatus(taskId); if (status === 'pending') return res.sendStatus(202); if (status === 'failed') return res.status(500).json({ error: 'Shadow generation failed' }); const result = getTaskResult(taskId); if (!result) return res.status(404).json({ error: 'Result not found' }); res.set('Content-Type', 'image/png'); res.send(result); }); app.use('/api/shadow', router); // ---------------- Start server ---------------- const PORT = process.env.PORT || 7860; const HOST = '0.0.0.0'; app.listen(PORT, HOST, () => console.log(`🚀 Shadow backend running on ${HOST}:${PORT}`));