feat(rx): tenant_id (conta/dono) acima de clinica_id — multi-tenant 2 níveis
Hierarquia tenant_id (usuarios.id do dono) / clinica_id / pc / paciente, espelhando o scoreodonto (conta multi-clínica planejada: um dono gerencia várias clínicas). - Colunas tenant_id em clinics_devices e images (+índices); backfill device + 2776 imgs. - Cadastro de device, socket (machine_token), JWT de client e uploads gravam tenant_id. - Listagens (/images, /patients, /by-patient, /unique-clinics) filtram por tenant_id e/ou clinica_id. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+11
-5
@@ -896,7 +896,7 @@ io.use(async (socket, next) => {
|
||||
// machine_token válido (com ou sem email+senha)
|
||||
console.log(`✅ [machine_token] Conexão autorizada — Clínica: ${device.clinic_name} PC: ${device.pc_name}`);
|
||||
socket.clientType = 'sensor';
|
||||
socket.user = { role: 'client_device', clinicId: device.id, clinicaId: device.clinica_id, clinicName: device.clinic_name, pcName: device.pc_name };
|
||||
socket.user = { role: 'client_device', clinicId: device.id, tenantId: device.tenant_id, clinicaId: device.clinica_id, clinicName: device.clinic_name, pcName: device.pc_name };
|
||||
await db.run(`UPDATE clinics_devices SET last_ip = $1 WHERE id = $2`, [socket.handshake.address, device.id]);
|
||||
return next();
|
||||
}
|
||||
@@ -1117,7 +1117,8 @@ io.on('connection', (socket) => {
|
||||
const clientInfo = connectedClients.find(c => c.socketId === socket.id);
|
||||
const clientName = clientInfo ? clientInfo.name : 'PC não identificado';
|
||||
const clinicName = socket.user?.clinicName || clientInfo?.clinicName || 'Clínica não identificada';
|
||||
const clinicaId = socket.user?.clinicaId || clientInfo?.clinicaId || null; // tenant do scoreodonto
|
||||
const clinicaId = socket.user?.clinicaId || clientInfo?.clinicaId || null; // clínica (scoreodonto)
|
||||
const tenantId = socket.user?.tenantId || clientInfo?.tenantId || null; // conta/dono (scoreodonto)
|
||||
const patientName = (data.patientData && data.patientData.name && data.patientData.name.trim()) ? data.patientData.name.trim() : 'Desconhecido';
|
||||
|
||||
// Salvar imagem original local e na nuvem
|
||||
@@ -1151,6 +1152,7 @@ io.on('connection', (socket) => {
|
||||
patient_name,
|
||||
clinic_name,
|
||||
clinica_id,
|
||||
tenant_id,
|
||||
client_name,
|
||||
original_filename,
|
||||
filename,
|
||||
@@ -1159,12 +1161,13 @@ io.on('connection', (socket) => {
|
||||
remark,
|
||||
thumb_filename,
|
||||
created_at
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING id`,
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING id`,
|
||||
[
|
||||
data.metadata.guid,
|
||||
(data.patientData.name && data.patientData.name.trim()) ? data.patientData.name.trim() : 'Desconhecido',
|
||||
clinicName,
|
||||
clinicaId,
|
||||
tenantId,
|
||||
clientName,
|
||||
data.metadata.fileName,
|
||||
filename,
|
||||
@@ -1269,7 +1272,8 @@ io.on('connection', (socket) => {
|
||||
const clientInfo = connectedClients.find(c => c.socketId === socket.id);
|
||||
const clientName = clientInfo ? clientInfo.name : 'PC não identificado';
|
||||
const clinicName = socket.user?.clinicName || clientInfo?.clinicName || 'Clínica não identificada';
|
||||
const clinicaId = socket.user?.clinicaId || clientInfo?.clinicaId || null; // tenant do scoreodonto
|
||||
const clinicaId = socket.user?.clinicaId || clientInfo?.clinicaId || null; // clínica (scoreodonto)
|
||||
const tenantId = socket.user?.tenantId || clientInfo?.tenantId || null; // conta/dono (scoreodonto)
|
||||
|
||||
// Determinar data de criação
|
||||
const formatLocalDateTime = (date) => {
|
||||
@@ -1286,6 +1290,7 @@ io.on('connection', (socket) => {
|
||||
patient_name,
|
||||
clinic_name,
|
||||
clinica_id,
|
||||
tenant_id,
|
||||
client_name,
|
||||
original_filename,
|
||||
filename,
|
||||
@@ -1294,12 +1299,13 @@ io.on('connection', (socket) => {
|
||||
remark,
|
||||
thumb_filename,
|
||||
created_at
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING id`,
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING id`,
|
||||
[
|
||||
data.metadata.guid,
|
||||
(data.patientData.name && data.patientData.name.trim()) ? data.patientData.name.trim() : 'Desconhecido',
|
||||
clinicName,
|
||||
clinicaId,
|
||||
tenantId,
|
||||
clientName,
|
||||
data.metadata.fileName,
|
||||
data.filename,
|
||||
|
||||
Reference in New Issue
Block a user