rnds
Version:
Biblioteca de conveniência para acesso aos serviços oferecidos pela Rede Nacional de Dados em Saúde (RNDS).
137 lines (122 loc) • 4.18 kB
JavaScript
import chalk from "chalk";
import fs from "fs";
import Token from "./Token.js";
import {sendService} from "./send.js";
/**
* Estrutura que mantém os valores empregados para configuração
* e acesso aos serviços oferecidos pela RNDS.
*
* @typedef {Object} Configuracao
* @property {Object} auth - O endereço do serviço de autenticação
* @property {Object} certificado - O endereço (path) onde se encontra o
* certificado digital.
* @property {Object} senha - A senha para acesso ao certificado digital.
* @property {Object} pfx - Conteúdo do certificado.
* @property {Object} ehr - O endereço do serviço de registros de saúde.
* @property {Object} requisitante - O CNS do requisitante em nome do qual
* requisições são submetidas.
*/
/**
* Obtém valores de variáveis de ambiente empregadas
* para configurar acesso aos serviços da RNDS.
*
* As variáveis são: (a) RNDS_AUTH; (b) RNDS_CERTIFICADO_ENDERECO;
* (c) RNDS_CERTIFICADO_SENHA; (d) RNDS_EHR, (e) RNDS_REQUISITANTE_CNS
* e (f) RNDS_REQUISITANTE_UF.
*
* @returns {Configuracao} a configuração para acesso aos serviços
* oferecidos pela RNDS.
*/
export function obtemConfiguracao() {
const cfg = {
auth: {
nome: "RNDS_AUTH",
valor: process.env.RNDS_AUTH
},
certificado: {
nome: "RNDS_CERTIFICADO_ENDERECO",
valor: process.env.RNDS_CERTIFICADO_ENDERECO
},
senha: {
nome: "RNDS_CERTIFICADO_SENHA",
valor: process.env.RNDS_CERTIFICADO_SENHA
},
pfx: {
nome: "PFX",
valor: undefined
},
ehr: {
nome: "RNDS_EHR",
valor: process.env.RNDS_EHR
},
requisitante: {
nome: "RNDS_REQUISITANTE_CNS",
valor: process.env.RNDS_REQUISITANTE_CNS
},
uf: {
nome: "RNDS_REQUISITANTE_UF",
valor: process.env.RNDS_REQUISITANTE_UF
}
};
try {
cfg.pfx.valor = fs.readFileSync(cfg.certificado.valor);
} catch (error) {
throw new Error(`erro ao carregar arquivo ${cfg.certificado.valor}`);
}
return cfg;
}
/**
* Exibe a configuração fornecida com a indicação da
* presença ou não de valor para cada uma das
* variáveis.
*/
export function exibeConfiguracao(configuracao) {
function check(valor) {
return valor && valor.length !== 0;
}
for (let key of Object.keys(configuracao)) {
const objeto = configuracao[key];
if (check(objeto.valor)) {
console.log(objeto.nome, chalk.blue("OK"), objeto.valor);
} else {
console.log(objeto.nome, chalk.red("variável não definida"));
}
}
}
/**
* Recupera a versão da biblioteca rnds-js.
*
* @returns {string} Versão da biblioteca (semantic versioning).
*/
export function getVersao() {
const json = fs.readFileSync("./package.json").toString();
return JSON.parse(json).version;
}
/**
* Realiza tentativa de obtenção de token conforme a configuração
* disponível e exibe na saída padrão o resultado correspondente.
*/
export async function verificacao() {
const configuracao = obtemConfiguracao();
const falha = chalk.red.inverse;
const ok = chalk.green.inverse;
function exibeToken(t) {
console.log("Token", chalk.blue("OK"), t.length, "bytes");
}
function getOnrejected(erro) {
// TODO erro.erro.code undefined !!!!????
if (erro.erro.code === "ECONNREFUSED") {
console.log("Verifique os endereços de acesso à RNDS.");
}
console.log(falha("Não foi possível conexão com a RNDS."));
}
try {
const token = new Token(configuracao, true, sendService, console.log);
const retornado = await token.getToken();
exibeToken(retornado);
console.log(ok("Estabelecida conexão com a RNDS."));
} catch (erro) {
console.log(erro);
getOnrejected(erro);
}
}