import express from 'express'; import db from '../database.js'; import { authenticateToken } from '../middleware/auth.js'; import { BambuPrinterAPI } from '../services/bambuPrinterAPI.js'; const router = express.Router(); /** * Add/Update Bambu printer settings */ router.post('/bambu/connect', authenticateToken, (req, res) => { const { accessToken, serialNumber, printerName, modelName } = req.body; if (!accessToken || !serialNumber) { return res.status(400).json({ error: 'accessToken and serialNumber are required' }); } // Check if printer already exists for this user db.get( 'SELECT id FROM printer_settings WHERE user_id = ? AND serial_number = ?', [req.user.id, serialNumber], (err, existing) => { if (err) { return res.status(500).json({ error: err.message }); } if (existing) { // Update existing db.run( 'UPDATE printer_settings SET access_token = ?, printer_name = ?, model_name = ? WHERE id = ?', [accessToken, printerName || 'Bambu Printer', modelName, existing.id], (err) => { if (err) { return res.status(500).json({ error: err.message }); } res.json({ message: 'Printer settings updated', printerConnected: true }); } ); } else { // Insert new db.run( 'INSERT INTO printer_settings (user_id, printer_type, printer_name, access_token, serial_number, model_name) VALUES (?, ?, ?, ?, ?, ?)', [req.user.id, 'bambu', printerName || 'Bambu Printer', accessToken, serialNumber, modelName], (err) => { if (err) { return res.status(500).json({ error: err.message }); } res.json({ message: 'Printer connected successfully', printerConnected: true }); } ); } } ); }); /** * Get user's connected printers */ router.get('/printers', authenticateToken, (req, res) => { db.all( 'SELECT id, printer_type, printer_name, serial_number, model_name FROM printer_settings WHERE user_id = ?', [req.user.id], (err, printers) => { if (err) { return res.status(500).json({ error: err.message }); } res.json({ printers }); } ); }); /** * Get specific printer details */ router.get('/printers/:printerId', authenticateToken, (req, res) => { db.get( 'SELECT * FROM printer_settings WHERE id = ? AND user_id = ?', [req.params.printerId, req.user.id], (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Printer not found' }); } // Don't send access token to client const { access_token, ...safeData } = printer; res.json(safeData); } ); }); /** * Get Bambu printer status */ router.get('/bambu/:printerId/status', authenticateToken, async (req, res) => { db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const status = await api.getPrinterStatus(); res.json(status); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Get Bambu printer info */ router.get('/bambu/:printerId/info', authenticateToken, async (req, res) => { db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const info = await api.getPrinterInfo(); res.json(info); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Get Bambu print job status */ router.get('/bambu/:printerId/job', authenticateToken, async (req, res) => { db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const jobStatus = await api.getPrintJobStatus(); res.json(jobStatus); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Get Bambu temperature readings */ router.get('/bambu/:printerId/temperature', authenticateToken, async (req, res) => { db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const temperature = await api.getTemperature(); res.json(temperature); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Get Bambu print history */ router.get('/bambu/:printerId/history', authenticateToken, async (req, res) => { const { limit = 10 } = req.query; db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const history = await api.getPrintHistory(parseInt(limit)); res.json(history); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Control Bambu print (pause, resume, stop) */ router.post('/bambu/:printerId/control', authenticateToken, async (req, res) => { const { action } = req.body; // 'pause', 'resume', 'stop' if (!['pause', 'resume', 'stop'].includes(action)) { return res.status(400).json({ error: 'Invalid action. Use: pause, resume, or stop' }); } db.get( 'SELECT access_token, serial_number FROM printer_settings WHERE id = ? AND user_id = ? AND printer_type = ?', [req.params.printerId, req.user.id, 'bambu'], async (err, printer) => { if (err) { return res.status(500).json({ error: err.message }); } if (!printer) { return res.status(404).json({ error: 'Bambu printer not found' }); } try { const api = new BambuPrinterAPI(printer.access_token, printer.serial_number); const result = await api.controlPrint(action); res.json(result); } catch (error) { res.status(500).json({ error: error.message }); } } ); }); /** * Disconnect/remove printer */ router.delete('/printers/:printerId', authenticateToken, (req, res) => { db.run( 'DELETE FROM printer_settings WHERE id = ? AND user_id = ?', [req.params.printerId, req.user.id], (err) => { if (err) { return res.status(500).json({ error: err.message }); } res.json({ message: 'Printer disconnected' }); } ); }); export default router;