From 88dfcdb6c76df244a411b844bcf790851fceb01f Mon Sep 17 00:00:00 2001 From: Fabio-Ramirez Date: Wed, 7 Oct 2026 14:23:39 -0300 Subject: [PATCH 1/2] AM - Revisar sacar turno para familiar --- auth/auth.class.ts | 15 ++++++++++++++- modules/mobileApp/routes/agendas.ts | 26 +++++++++++++++++++++++++- modules/mobileApp/routes/paciente.ts | 4 ++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/auth/auth.class.ts b/auth/auth.class.ts index 01dc5fb5d6..99994f1f13 100644 --- a/auth/auth.class.ts +++ b/auth/auth.class.ts @@ -7,6 +7,7 @@ import * as passport from 'passport'; import * as passportJWT from 'passport-jwt'; import * as configPrivate from '../config.private'; import { handleHttpRequest } from '../utils/requestHandler'; +import { Paciente } from '../core-v2/mpi/paciente/paciente.schema'; import { AppToken } from './schemas/app-token.interface'; import { authApps } from './schemas/authApps'; import { PacienteToken } from './schemas/paciente-token.interface'; @@ -168,7 +169,7 @@ export class Auth { * @memberOf Auth */ static deniedPatients() { - return (req, res, next) => { + return async (req, res, next) => { if (req.user.type !== 'paciente-token') { return next(); @@ -193,6 +194,18 @@ export class Auth { if (idPacienteToken) { return next(); } + // Permitir si el paciente consultado es un familiar vinculado al paciente principal del token + try { + const principal = await Paciente.findById(req.user.pacientes[0].id).select('relaciones').exec(); + const esFamiliar = (principal?.relaciones as any[])?.find(rel => { + return rel.referencia && String(rel.referencia) === String(idPacienteQuery); + }); + if (esFamiliar) { + return next(); + } + } catch (err) { + // Si falla la búsqueda del familiar, se deniega por defecto más abajo + } } else { if (requestPath.endsWith('.pdf')) { return next(); diff --git a/modules/mobileApp/routes/agendas.ts b/modules/mobileApp/routes/agendas.ts index 26de2de082..4d32a003c7 100644 --- a/modules/mobileApp/routes/agendas.ts +++ b/modules/mobileApp/routes/agendas.ts @@ -7,6 +7,7 @@ import { verificarCondicionPaciente } from '../../../modules/turnos/condicionPac import { CondicionPaciente } from '../../../modules/turnos/condicionPaciente/condicionPaciente.schema'; import { Constantes, Constante } from '../../../modules/constantes/constantes.schema'; import { tipoPrestacion } from '../../../core/tm/schemas/tipoPrestacion'; +import { PacienteCtr } from '../../../core-v2/mpi/paciente/paciente.routes'; const router = express.Router(); @@ -23,7 +24,30 @@ router.get('/agendasDisponibles', async (req: any, res, next) => { if (req.user.type === 'paciente-token') { const idPacienteQuery = req.query?.idPaciente; - const idPacienteToken = req.user.pacientes.find(p => String(p.id) === String(idPacienteQuery)); + + let idPacienteToken = req.user.pacientes?.find(p => String(p.id) === String(idPacienteQuery)); + + // Si no está en req.user.pacientes, obtener el paciente principal y verificar sus relaciones / vínculos en MPI + if (!idPacienteToken && req.user.pacientes?.length > 0) { + const pacientePrincipalToken = req.user.pacientes.find(p => p.relacion === 'principal') || req.user.pacientes[0]; + const pacientePrincipalId = pacientePrincipalToken?.id || pacientePrincipalToken?._id; + + if (pacientePrincipalId) { + const pacientePrincipal: any = await PacienteCtr.findById(pacientePrincipalId); + + if (pacientePrincipal) { + const esVinculoMPI = pacientePrincipal.vinculos?.some(vinculoId => String(vinculoId) === String(idPacienteQuery)); + const esRelacionFamiliar = pacientePrincipal.relaciones?.some((rel: any) => { + const referenciaId = rel.referencia?._id || rel.referencia?.id || rel.referencia; + return referenciaId && String(referenciaId) === String(idPacienteQuery); + }); + + if (esVinculoMPI || esRelacionFamiliar) { + idPacienteToken = pacientePrincipal; + } + } + } + } if (!idPacienteToken) { return next(401); diff --git a/modules/mobileApp/routes/paciente.ts b/modules/mobileApp/routes/paciente.ts index 7efb75f6ac..a5db766ad6 100644 --- a/modules/mobileApp/routes/paciente.ts +++ b/modules/mobileApp/routes/paciente.ts @@ -23,7 +23,7 @@ router.get('/paciente/:id', async (req: any, res, next) => { if (index >= 0) { const resultado: any = await findById(pacientes[index].id, { fields: '-claveBlocking -entidadesValidadoras -carpetaEfectores -createdBy' }); if (resultado) { - return res.json(resultado); + return res.json(resultado.toJSON({ virtuals: true })); } return res.status(422).send({ message: 'invalid_id' }); } else { @@ -41,7 +41,7 @@ router.get('/paciente/:id/relaciones', async (req: any, res, next) => { // Verifico que el paciente sea familiar del usuario logueado const esFamiliar = (resultado.relaciones as any[])?.find(rel => rel.referencia && rel.referencia.documento === paciente.documento); if (esFamiliar) { - return res.json(paciente); + return res.json((paciente as any).toJSON({ virtuals: true })); } else { return res.status(422).send({ message: 'unauthorized' }); } From a36e88669c71d9c853c652a9e1d72a3ba9a574a9 Mon Sep 17 00:00:00 2001 From: Fabio-Ramirez Date: Fri, 9 Oct 2026 11:46:00 -0300 Subject: [PATCH 2/2] Se corrigue error de pacientes en asignar agendas --- auth/auth.class.ts | 4 ++-- modules/mobileApp/routes/paciente.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth/auth.class.ts b/auth/auth.class.ts index 99994f1f13..277a253d3c 100644 --- a/auth/auth.class.ts +++ b/auth/auth.class.ts @@ -7,7 +7,6 @@ import * as passport from 'passport'; import * as passportJWT from 'passport-jwt'; import * as configPrivate from '../config.private'; import { handleHttpRequest } from '../utils/requestHandler'; -import { Paciente } from '../core-v2/mpi/paciente/paciente.schema'; import { AppToken } from './schemas/app-token.interface'; import { authApps } from './schemas/authApps'; import { PacienteToken } from './schemas/paciente-token.interface'; @@ -196,7 +195,8 @@ export class Auth { } // Permitir si el paciente consultado es un familiar vinculado al paciente principal del token try { - const principal = await Paciente.findById(req.user.pacientes[0].id).select('relaciones').exec(); + // Se obtiene el modelo en runtime: importar el schema acá lo compilaría antes del plugin global de connections.ts + const principal: any = await mongoose.model('paciente_2').findById(req.user.pacientes[0].id).select('relaciones').exec(); const esFamiliar = (principal?.relaciones as any[])?.find(rel => { return rel.referencia && String(rel.referencia) === String(idPacienteQuery); }); diff --git a/modules/mobileApp/routes/paciente.ts b/modules/mobileApp/routes/paciente.ts index a5db766ad6..7efb75f6ac 100644 --- a/modules/mobileApp/routes/paciente.ts +++ b/modules/mobileApp/routes/paciente.ts @@ -23,7 +23,7 @@ router.get('/paciente/:id', async (req: any, res, next) => { if (index >= 0) { const resultado: any = await findById(pacientes[index].id, { fields: '-claveBlocking -entidadesValidadoras -carpetaEfectores -createdBy' }); if (resultado) { - return res.json(resultado.toJSON({ virtuals: true })); + return res.json(resultado); } return res.status(422).send({ message: 'invalid_id' }); } else { @@ -41,7 +41,7 @@ router.get('/paciente/:id/relaciones', async (req: any, res, next) => { // Verifico que el paciente sea familiar del usuario logueado const esFamiliar = (resultado.relaciones as any[])?.find(rel => rel.referencia && rel.referencia.documento === paciente.documento); if (esFamiliar) { - return res.json((paciente as any).toJSON({ virtuals: true })); + return res.json(paciente); } else { return res.status(422).send({ message: 'unauthorized' }); }