120 lines
3.7 KiB
JavaScript
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;
|