Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 132 additions & 9 deletions core/tm/controller/profesional.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@ import * as stream from 'stream';
import { userScheduler } from '../../../config.private';
import * as turno from '../../../modules/matriculaciones/schemas/turno';
import { turnoSolicitado } from '../../../modules/matriculaciones/schemas/turnoSolicitado';
import { makeFs } from '../schemas/imagenes';
import { makeFsFirmaAdmin } from '../schemas/firmaAdmin';
import { makeFsFirma } from '../schemas/firmaProf';
import { makeFsFirmaOnline } from '../schemas/firmaRenovacionOnline';
import { makeFsFirmaAdminOnline } from '../schemas/firmaAdminRenovacionOnline';
import { makeFsImagenOnline } from '../schemas/imagenRenovacionOnline';
import { Profesional } from '../schemas/profesional';
import { Auth } from './../../../auth/auth.class';
import { findUsersByUsername } from './../../../auth/auth.controller';
Expand Down Expand Up @@ -192,23 +196,49 @@ export async function saveFirma(data, admin = false) {
const input = new stream.PassThrough();
let firma;
let metadataFind;
let metadataFindOnline;
let metadataWrite;

if (admin) {
firma = makeFsFirmaAdmin();
metadataFind = { 'metadata.idSupervisor': data.idSupervisor };
metadataWrite = {
idSupervisor: data.idSupervisor,
administracion: data.nombreCompleto
};
if (data.option === 'renovacionOnline') {
if (admin) {
firma = makeFsFirmaAdminOnline();
metadataFind = {
'metadata.idProfesional': data.idProfesional,
'metadata.matricula': data.matricula
};
metadataWrite = {
idProfesional: data.idProfesional,
matricula: data.matricula
};
} else {
firma = makeFsFirmaOnline();

metadataFind = {
'metadata.idProfesional': data.idProfesional,
'metadata.matricula': data.matricula
};
metadataWrite = {
idProfesional: data.idProfesional,
matricula: data.matricula
};
}
} else {
firma = makeFsFirma();

metadataFindOnline = {
'metadata.idProfesional': data.idProfesional,
'metadata.matricula': data.matricula
};
metadataFind = { 'metadata.idProfesional': data.idProfesional };
metadataWrite = { idProfesional: data.idProfesional };
if (admin) {
firma = makeFsFirmaAdmin();
} else {
firma = makeFsFirma();
}
}

// Remueve la firma anterior antes de insertar la nueva
const fileFirma = await firma.findOne(metadataFind);

if (fileFirma?._id) {
await firma.unlink(fileFirma._id, (error) => { });
}
Expand All @@ -231,6 +261,99 @@ export async function saveFirma(data, admin = false) {
});
}

export async function deleteFirmaFotoTemporal(idProfesional, matricula, next) {

const metadataFind = {
'metadata.idProfesional': idProfesional,
'metadata.matricula': matricula
};

try {
const firma = makeFsFirmaOnline();

// Remueve la firma anterior antes de insertar la nueva
const fileFirma = await firma.findOne(metadataFind);
if (fileFirma?._id) {
await new Promise<void>((resolve, reject) => {
firma.unlink(fileFirma._id, (error) => {
if (error) {
return reject(error);
}
resolve();
});
});
}

const imagen = makeFsImagenOnline();
// Remueve la imagen anterior antes de insertar la nueva
const fileImagen = await imagen.findOne(metadataFind);
if (fileImagen?._id) {
await new Promise<void>((resolve, reject) => {
imagen.unlink(fileImagen._id, (error) => {
if (error) {
return reject(error);
}
resolve();
});
});
}
} catch (error) {
return next(error);
}

}

export async function saveImage(data) {

const _base64 = data.img;
const decoder = base64.decode();
const input = new stream.PassThrough();
let fotoProf;
let metadataFind;
let metadataFindOnline;
let metadataWrite;

if (data.option === 'renovacionOnline') {
fotoProf = makeFsImagenOnline();

metadataFind = {
'metadata.idProfesional': data.idProfesional,
'metadata.matricula': data.matricula
};
metadataWrite = {
idProfesional: data.idProfesional,
matricula: data.matricula
};
} else {
metadataFind = { 'metadata.idProfesional': data.idProfesional };
metadataWrite = { idProfesional: data.idProfesional };
fotoProf = makeFs();
}

const file = await fotoProf.findOne(metadataFind);

if (file?._id) {
await fotoProf.unlink(file._id, (error) => { });
}
// Inserta en la bd en files y chunks
return new Promise((resolve, reject) => {
fotoProf.writeFile(
{
filename: 'foto.png',
contentType: 'image/png',
metadata: metadataWrite
}, input.pipe(decoder),
(error, createdFile) => {
if (error) {
reject(error);
}
resolve(createdFile);
}
);
input.end(_base64);
});
}

export async function filtrarProfesionalesPorPrestacion(profesionales, prestaciones, organizacionId) {
const usuarios = await findUsersByUsername(profesionales.map(p => p.documento));

Expand Down
95 changes: 60 additions & 35 deletions core/tm/routes/profesional.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ import { log } from '@andes/log';
import * as express from 'express';
import * as fs from 'fs';
import { Types } from 'mongoose';
import * as stream from 'stream';
import { Auth } from '../../../auth/auth.class';
import { findUser, updateEmailUser } from '../../../auth/auth.controller';
import { PacienteApp } from '../../../modules/mobileApp/schemas/pacienteApp';
import { sendSms } from '../../../utils/roboSender/sendSms';
import { makePattern, toArray } from '../../../utils/utils';
import { streamToBase64 } from '../controller/file-storage';
import { formacionCero, matriculaCero, migrarTurnos, saveFirma, filtrarProfesionalesPorPrestacion } from '../controller/profesional';
import { formacionCero, matriculaCero, migrarTurnos, saveFirma, filtrarProfesionalesPorPrestacion, saveImage, deleteFirmaFotoTemporal } from '../controller/profesional';
import { makeFsFirmaAdmin } from '../schemas/firmaAdmin';
import { makeFsFirma } from '../schemas/firmaProf';
import { makeFsFirmaOnline } from '../schemas/firmaRenovacionOnline';
import { makeFsImagenOnline } from '../schemas/imagenRenovacionOnline';
import { makeFs } from '../schemas/imagenes';
import { Organizacion } from '../schemas/organizacion';
import { Profesional } from '../schemas/profesional';
Expand Down Expand Up @@ -247,26 +248,59 @@ router.get('/profesionales/foto/:id*?', Auth.authenticate(), async (req: any, re
const img = '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';

try {
const fotoProf = makeFs();
const file = await fotoProf.findOne({ 'metadata.idProfesional': id });
if (file) {
const readStream = await fotoProf.readFile({ _id: file._id });
const _img = await streamToBase64(readStream);
return res.json(_img);
if (req.query.id) {
const idProf = req.query.id;
let fotoProf;
let metadataFind;

if (req.query.matricula) {
const matricula = parseInt(req.query.matricula, 10);
fotoProf = makeFsImagenOnline();
metadataFind = {
'metadata.idProfesional': idProf,
'metadata.matricula': matricula
};
} else {
fotoProf = makeFs();
metadataFind = {
'metadata.idProfesional': idProf
};
}

const file = await fotoProf.findOne(metadataFind);
if (file) {
const readStream = await fotoProf.readFile({ _id: file._id });
const _img = await streamToBase64(readStream);
return res.json(_img);
}
return res.json(img);
}
return res.json(img);

} catch (ex) {
return next(ex);
}

});
router.get('/profesionales/firma', Auth.authenticate(), async (req: any, res, next) => {

try {
if (req.query.id) {
const id = req.query.id;
const fotoProf = makeFsFirma();
const file = await fotoProf.findOne({ 'metadata.idProfesional': id });
let fotoProf;
let metadataFind;

if (req.query.matricula) {
const matricula = parseInt(req.query.matricula, 10);
fotoProf = makeFsFirmaOnline();
metadataFind = {
'metadata.idProfesional': id,
'metadata.matricula': matricula
};
} else {
fotoProf = makeFsFirma();
metadataFind = {
'metadata.idProfesional': id
};
}
const file = await fotoProf.findOne(metadataFind);
if (file) {
const readStream = await fotoProf.readFile({ _id: file._id });
const firma = await streamToBase64(readStream);
Expand Down Expand Up @@ -876,28 +910,8 @@ router.patch('/profesionales/update/:id?', Auth.authenticate(), async (req, res,
try {

if (req.body.imagen) {
const _base64 = req.body.imagen.img;
const decoder = _base64.decode();
const input = new stream.PassThrough();
const fotoProf = makeFs();
// remove la foto vieja antes de insertar la nueva
const file = await fotoProf.findOne({
'metadata.idProfesional': req.body.imagen.idProfesional
});
if (file?._id) {
await fotoProf.unlink(file._id, (error) => { });
}
// inserta en la bd en files y chucks
fotoProf.writeFile({
filename: 'foto.png',
contentType: 'image/png',
metadata: {
idProfesional: req.body.imagen.idProfesional,
}
}, input.pipe(decoder), (error, createdFile) => {
res.json(createdFile);
});
input.end(_base64);
const response = await saveImage(req.body.imagen);
res.json(response);
}
if (req.body.firma) {
const response = await saveFirma(req.body.firma);
Expand Down Expand Up @@ -1113,6 +1127,17 @@ router.patch('/profesionales/:id?', Auth.authenticate(), async (req, res, next)
if (req.body.foto) {
resultado.foto = req.body.foto;
}
if (req.body.matricula) {

if (req.body.firmaP) {
await saveFirma(req.body);
}
if (req.body.img) {
await saveImage(req.body);
}
await deleteFirmaFotoTemporal(req.params.id, req.body.matricula, next);

}
}
for (const key in req.body) {
resultado[key] = req.body[key];
Expand Down
13 changes: 13 additions & 0 deletions core/tm/schemas/firmaAdminRenovacionOnline.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

import * as mongoose from 'mongoose';
const { createBucket } = require('mongoose-gridfs');

export function makeFsFirmaAdminOnline() {
const ProfesionalesFirmaAdminRenovacionOnlineSchema = createBucket({
bucketName: 'ProfesionalesAdminFirmaRenovacionOnline',
collectionName: 'ProfesionalesAdminFirmaRenovacionOnline',
mongooseConnection: mongoose.connection
});
// obtain a model
return ProfesionalesFirmaAdminRenovacionOnlineSchema;
}
12 changes: 12 additions & 0 deletions core/tm/schemas/firmaRenovacionOnline.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

import * as mongoose from 'mongoose';
const { createBucket } = require('mongoose-gridfs');

export function makeFsFirmaOnline() {
const ProfesionalesFirmaRenovacionOnlineSchema = createBucket({
bucketName: 'ProfesionalesFirmaRenovacionOnline',
collectionName: 'ProfesionalesFirmaRenovacionOnline',
mongooseConnection: mongoose.connection
});
return ProfesionalesFirmaRenovacionOnlineSchema;
}
12 changes: 12 additions & 0 deletions core/tm/schemas/imagenRenovacionOnline.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

import * as mongoose from 'mongoose';
const { createBucket } = require('mongoose-gridfs');

export function makeFsImagenOnline() {
const ProfesionalesImagenRenovacionOnlineSchema = createBucket({
bucketName: 'ProfesionalesImagenRenovacionOnline',
collectionName: 'ProfesionalesImagenRenovacionOnline',
mongooseConnection: mongoose.connection
});
return ProfesionalesImagenRenovacionOnlineSchema;
}
Loading