feat: reestruturacao de menus na sidebar, niveis de acesso e migracao para postgresql/dragonflydb
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
This commit is contained in:
@@ -14,17 +14,19 @@ router.get('/', async (req, res) => {
|
||||
const search = req.query.search || '';
|
||||
const clientName = req.query.client || '';
|
||||
|
||||
let query = `SELECT * FROM images WHERE enabled = ?`;
|
||||
let query = `SELECT * FROM images WHERE enabled = $1`;
|
||||
let params = [showDisabled ? 0 : 1];
|
||||
let paramIndex = 2;
|
||||
|
||||
if (clientName) {
|
||||
query += ` AND client_name = ?`;
|
||||
query += ` AND client_name = $${paramIndex++}`;
|
||||
params.push(clientName);
|
||||
}
|
||||
|
||||
if (search) {
|
||||
query += ` AND (patient_name LIKE ? OR image_guid LIKE ? OR filename LIKE ?)`;
|
||||
query += ` AND (patient_name LIKE $${paramIndex} OR image_guid LIKE $${paramIndex + 1} OR filename LIKE $${paramIndex + 2})`;
|
||||
params.push(`%${search}%`, `%${search}%`, `%${search}%`);
|
||||
paramIndex += 3;
|
||||
}
|
||||
|
||||
query += ` ORDER BY created_at DESC LIMIT 100`;
|
||||
@@ -47,17 +49,19 @@ router.get('/patients', async (req, res) => {
|
||||
const clientName = req.query.client || '';
|
||||
const enabledVal = showDisabled ? 0 : 1;
|
||||
|
||||
let where = `WHERE enabled = ${enabledVal}`;
|
||||
let params = [];
|
||||
|
||||
let paramIndex = 1;
|
||||
let where = `WHERE enabled = $${paramIndex++}`;
|
||||
let params = [enabledVal];
|
||||
|
||||
if (clientName) {
|
||||
where += ` AND client_name = ?`;
|
||||
where += ` AND client_name = $${paramIndex++}`;
|
||||
params.push(clientName);
|
||||
}
|
||||
|
||||
|
||||
if (search) {
|
||||
where += ` AND (patient_name LIKE ? OR image_guid LIKE ?)`;
|
||||
where += ` AND (patient_name LIKE $${paramIndex} OR image_guid LIKE $${paramIndex + 1})`;
|
||||
params.push(`%${search}%`, `%${search}%`);
|
||||
paramIndex += 2;
|
||||
}
|
||||
|
||||
// Group by patient_name — pick thumbnail from most recent image
|
||||
@@ -102,7 +106,7 @@ router.get('/by-patient', async (req, res) => {
|
||||
|
||||
const images = await db.all(
|
||||
`SELECT * FROM images
|
||||
WHERE patient_name = ? AND enabled = ?
|
||||
WHERE patient_name = $1 AND enabled = $2
|
||||
ORDER BY created_at DESC`,
|
||||
[patientName, showDisabled ? 0 : 1]
|
||||
);
|
||||
@@ -119,7 +123,7 @@ router.get('/by-patient', async (req, res) => {
|
||||
// ================================================================
|
||||
router.get('/:id', async (req, res) => {
|
||||
try {
|
||||
const image = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const image = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
if (!image) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
}
|
||||
@@ -155,14 +159,14 @@ router.get('/stats', async (req, res) => {
|
||||
// ================================================================
|
||||
router.get('/:id/transformations', async (req, res) => {
|
||||
try {
|
||||
const image = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const image = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
if (!image) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
}
|
||||
|
||||
// Buscar a imagem original se esta é uma transformação
|
||||
const originalId = image.original_image_id || image.id;
|
||||
const originalImage = await db.get('SELECT * FROM images WHERE id = ?', [originalId]);
|
||||
const originalImage = await db.get('SELECT * FROM images WHERE id = $1', [originalId]);
|
||||
|
||||
const originalPath = path.join(__dirname, '../uploads', originalImage.filename);
|
||||
let originalBuffer;
|
||||
@@ -217,7 +221,7 @@ router.get('/:id/transformations', async (req, res) => {
|
||||
router.post('/:id/transform', async (req, res) => {
|
||||
try {
|
||||
const { rotation, flipH, flipV, remark } = req.body;
|
||||
const originalImage = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const originalImage = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
|
||||
if (!originalImage) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
@@ -225,7 +229,7 @@ router.post('/:id/transform', async (req, res) => {
|
||||
|
||||
// Buscar a imagem original real se esta é uma transformação
|
||||
const realOriginalId = originalImage.original_image_id || originalImage.id;
|
||||
const realOriginal = await db.get('SELECT * FROM images WHERE id = ?', [realOriginalId]);
|
||||
const realOriginal = await db.get('SELECT * FROM images WHERE id = $1', [realOriginalId]);
|
||||
|
||||
// Processar a imagem
|
||||
const originalPath = path.join(__dirname, '../uploads', realOriginal.filename);
|
||||
@@ -250,9 +254,9 @@ router.post('/:id/transform', async (req, res) => {
|
||||
const processedPath = path.join(__dirname, '../processed', processedFilename);
|
||||
await fs.writeFile(processedPath, processed);
|
||||
|
||||
// Desabilitar a imagem atual para que não fique duplicada na interface
|
||||
await db.run('UPDATE images SET enabled = 0 WHERE id = ?', [req.params.id]);
|
||||
|
||||
// Desabilitar a imagem active atual para que não fique duplicada na interface
|
||||
await db.run('UPDATE images SET enabled = 0 WHERE id = $1', [req.params.id]);
|
||||
|
||||
const newRemark = remark !== undefined ? remark : originalImage.remark;
|
||||
|
||||
// Inserir a nova imagem como a versão ativa
|
||||
@@ -260,7 +264,7 @@ router.post('/:id/transform', async (req, res) => {
|
||||
`INSERT INTO images (
|
||||
image_guid, patient_name, client_name, original_filename, filename,
|
||||
enabled, rotation, flip_horizontal, flip_vertical, original_image_id, created_at, remark, doctor
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`,
|
||||
[
|
||||
`${realOriginal.image_guid}_${timestamp}`,
|
||||
realOriginal.patient_name,
|
||||
@@ -298,11 +302,11 @@ router.put('/:id/patient-info', async (req, res) => {
|
||||
|
||||
await db.run(
|
||||
`UPDATE images SET
|
||||
patient_name_resumed = ?,
|
||||
tooth_number = ?,
|
||||
tooth_side = ?,
|
||||
patient_name_resumed = $1,
|
||||
tooth_number = $2,
|
||||
tooth_side = $3,
|
||||
enabled = 1
|
||||
WHERE id = ?`,
|
||||
WHERE id = $4`,
|
||||
[patientNameResumed, toothNumber, toothSide, req.params.id]
|
||||
);
|
||||
|
||||
@@ -317,7 +321,7 @@ router.put('/:id/patient-info', async (req, res) => {
|
||||
// ================================================================
|
||||
router.get('/:id/download', async (req, res) => {
|
||||
try {
|
||||
const image = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const image = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
if (!image) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
}
|
||||
@@ -344,7 +348,7 @@ router.get('/:id/download', async (req, res) => {
|
||||
// ================================================================
|
||||
router.delete('/:id', async (req, res) => {
|
||||
try {
|
||||
const image = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const image = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
if (!image) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
}
|
||||
@@ -366,7 +370,7 @@ router.delete('/:id', async (req, res) => {
|
||||
}
|
||||
|
||||
// Apagar do banco
|
||||
await db.run('DELETE FROM images WHERE id = ?', [req.params.id]);
|
||||
await db.run('DELETE FROM images WHERE id = $1', [req.params.id]);
|
||||
|
||||
res.json({ success: true, message: 'Imagem apagada com sucesso' });
|
||||
} catch (error) {
|
||||
@@ -380,13 +384,13 @@ router.delete('/:id', async (req, res) => {
|
||||
// ================================================================
|
||||
router.put('/:id/toggle-enabled', async (req, res) => {
|
||||
try {
|
||||
const image = await db.get('SELECT * FROM images WHERE id = ?', [req.params.id]);
|
||||
const image = await db.get('SELECT * FROM images WHERE id = $1', [req.params.id]);
|
||||
if (!image) {
|
||||
return res.status(404).json({ error: 'Imagem não encontrada' });
|
||||
}
|
||||
|
||||
const newEnabled = image.enabled ? 0 : 1;
|
||||
await db.run('UPDATE images SET enabled = ? WHERE id = ?', [newEnabled, req.params.id]);
|
||||
await db.run('UPDATE images SET enabled = $1 WHERE id = $2', [newEnabled, req.params.id]);
|
||||
|
||||
res.json({ success: true, enabled: newEnabled === 1 });
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user