Files
rx.scoreodonto.com/dental-server/routes/patients.js
T
2026-05-24 04:57:33 +02:00

120 lines
3.7 KiB
JavaScript

const express = require('express');
const router = express.Router();
// Caminho do banco de dados oficial do Dental Sensor
const DENTAL_DB_PATH = 'C:/ProgramData/RF/Dental Sensor/data';
// ================================================================
// Conexão LAZY — abre o banco só quando necessário e fecha logo
// após, evitando conflitos de lock com o banco principal do servidor
// ================================================================
function openDentalDb() {
const { DatabaseSync } = require('node:sqlite');
return new DatabaseSync(DENTAL_DB_PATH);
}
// ================================================================
// POST /api/patients - Criar novo paciente no Dental Sensor
// ================================================================
router.post('/', (req, res) => {
let db;
try {
db = openDentalDb();
} catch (error) {
console.error('❌ Erro ao conectar ao banco do Dental Sensor:', error.message);
return res.status(500).json({
error: 'Não foi possível conectar ao banco do Dental Sensor. Verifique se o software está instalado.',
detail: error.message
});
}
const { firstName, lastName, doctor, birthday, gender, phone, email, address, zipCode, remark } = req.body;
if (!firstName || !lastName) {
if (db) try { db.close(); } catch (_) {}
return res.status(400).json({ error: 'Nome e Sobrenome são obrigatórios.' });
}
const formattedBirthday = birthday ? `${birthday} 00:00:00` : null;
try {
const insertStmt = db.prepare(`
INSERT INTO Patients (
FirstName, LastName, Doctor, Birthday, Gender, Phone, Email, Address, ZipCode, Remark, LastActTime, VFlag
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), 1)
`);
const result = insertStmt.run(
firstName,
lastName,
doctor || '',
formattedBirthday,
gender !== undefined ? parseInt(gender, 10) : 0,
phone || '',
email || '',
address || '',
zipCode || '',
remark || ''
);
res.status(201).json({
success: true,
patientId: result.lastInsertRowid,
message: 'Paciente cadastrado com sucesso no Dental Sensor'
});
} catch (error) {
console.error('Erro ao inserir paciente:', error);
res.status(500).json({ error: 'Erro ao cadastrar paciente: ' + error.message });
} finally {
// SEMPRE fechar o banco após o uso para liberar o lock
if (db) {
try { db.close(); } catch (_) {}
}
}
});
// ================================================================
// GET /api/patients - Listar pacientes do Dental Sensor (opcional)
// ================================================================
router.get('/', (req, res) => {
let db;
try {
db = openDentalDb();
const search = req.query.search || '';
let stmt;
let rows;
if (search) {
stmt = db.prepare(`
SELECT ID, FirstName, LastName, Doctor, Birthday, Gender, Phone, Remark
FROM Patients
WHERE (FirstName LIKE ? OR LastName LIKE ?)
AND VFlag = 1
ORDER BY LastActTime DESC
LIMIT 100
`);
rows = stmt.all(`%${search}%`, `%${search}%`);
} else {
stmt = db.prepare(`
SELECT ID, FirstName, LastName, Doctor, Birthday, Gender, Phone, Remark
FROM Patients
WHERE VFlag = 1
ORDER BY LastActTime DESC
LIMIT 100
`);
rows = stmt.all();
}
res.json(rows);
} catch (error) {
console.error('Erro ao listar pacientes do Dental Sensor:', error.message);
res.status(500).json({ error: 'Erro ao consultar banco do Dental Sensor: ' + error.message });
} finally {
if (db) {
try { db.close(); } catch (_) {}
}
}
});
module.exports = router;