File size: 4,153 Bytes
d45b274
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d46dbc2
 
d45b274
 
 
 
 
 
 
 
 
 
 
 
 
c6864a7
 
cadae64
 
d46dbc2
cadae64
 
 
d46dbc2
cadae64
 
d45b274
d46dbc2
 
 
d45b274
 
c6864a7
d46dbc2
d45b274
 
 
 
 
 
 
 
 
 
 
 
 
 
d46dbc2
d45b274
 
 
 
d46dbc2
d45b274
d46dbc2
d45b274
 
 
 
c6864a7
 
d45b274
 
 
 
c6864a7
d46dbc2
d45b274
 
 
 
 
 
 
 
d46dbc2
c6864a7
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// 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}`));