makerstash/server/routes/printers.js

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;