274 lines
8.1 KiB
JavaScript
274 lines
8.1 KiB
JavaScript
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;
|