isolamento de pacote

This commit is contained in:
Luiz Silva 2025-07-06 18:35:12 -03:00
commit f34b66cbe4
96 changed files with 2285 additions and 0 deletions

View file

@ -0,0 +1,32 @@
import { respostaComuns, type tipoResposta } from "p-respostas"
type tipoPostCodigoContaSite = { site: string }
import node_fetch from "cross-fetch"
export const codigoContaSite = async ({
url_api_autenticacao,
post,
}: {
url_api_autenticacao: string
post: tipoPostCodigoContaSite
}): Promise<tipoResposta<string>> => {
const url = `${url_api_autenticacao}/api/codigo_prefeitura_site`
try {
const resp = await node_fetch(url, {
method: "POST",
body: JSON.stringify(post),
headers: { "Content-Type": "application/json" },
})
.then((r) => r.json())
.catch((e) =>
respostaComuns.erro("Erro ao enviar registros", [e.message]),
)
.then((r) => r as tipoResposta<string>)
return resp
} catch (e) {
return respostaComuns.erro(`erro ao buscar código do site: ${e}`)
}
}

View file

@ -0,0 +1,44 @@
import node_fetch from "cross-fetch"
import { respostaComuns, type tipoResposta } from "p-respostas"
import type { tipo_usuarios__listar_retorno } from "../lista-usuarios"
export type tipoUsuarioExterno = {
_nome: string
_email: string
_telefone: string
vinculo: string
inquilino: string
chave_produto: string
codigo: string
_cpf: string
}
export const usuarios_quipo = async ({
token_produto,
url_api_autenticacao,
inquilino,
}: {
url_api_autenticacao: string
token_produto: string
inquilino: string
}): Promise<tipoResposta<tipo_usuarios__listar_retorno[]>> => {
const url = `${url_api_autenticacao}/api/usuarios__listar`
if (!token_produto) return respostaComuns.erro("token_produto não informado")
const headers = {
token: token_produto,
"Content-Type": "application/json",
}
return node_fetch(url, {
method: "POST",
body: JSON.stringify({ inquilino }),
headers,
})
.then((r) => r.json())
.catch((e) =>
respostaComuns.erro(`Erro ao buscar usuários quipo governo ${e.message}`),
)
.then((r) => r as tipoResposta<tipo_usuarios__listar_retorno[]>)
}

View file

@ -0,0 +1,40 @@
import node_fetch from "cross-fetch"
import { respostaComuns, type tipoResposta } from "p-respostas"
export const usuarios_quipo_vincular = async ({
token_produto,
url_api_autenticacao,
inquilino_codigo,
vinculo,
usuario_codigo,
email,
}: {
url_api_autenticacao: string
token_produto: string
inquilino_codigo: string
vinculo: string
usuario_codigo?: string
email: string
}): Promise<tipoResposta<string>> => {
const url = `${url_api_autenticacao}/api/vinculos__criar`
if (!token_produto) return respostaComuns.erro("token_produto não informado")
const headers = {
token: token_produto,
"Content-Type": "application/json",
}
const parametros = {
vinculos: { inquilino_codigo, usuario_codigo, vinculo },
email: email,
}
return await node_fetch(url, {
headers,
body: JSON.stringify(parametros),
method: "POST",
})
.then(async (r) => await r.json())
.catch((e) =>
respostaComuns.erro(`Erro ao criar vinculo de usuario ${e.message}`),
)
}

View file

@ -0,0 +1,34 @@
import type { tipoResposta } from "p-respostas"
type tipoPostValidarTokem = { token: string }
import node_fetch from "cross-fetch"
/** faz a validação do token */
export const validarToken = async ({
url_api_autenticacao,
post,
}: {
url_api_autenticacao: string
post: tipoPostValidarTokem
}): Promise<"valido" | "erro"> => {
const url = `${url_api_autenticacao}/api/validar_token`
try {
const resposta = await node_fetch(url, {
method: "POST",
body: JSON.stringify(post),
headers: { "Content-Type": "application/json" },
})
.then((r) => r.json())
.then((r) => r as tipoResposta<any>)
.then((resposta) =>
resposta.eCerto ? ("valido" as const) : ("erro" as const),
)
.catch(() => "erro" as const)
return resposta
} catch (_e) {
return "erro"
}
}

14
src/autenticacao/index.ts Normal file
View file

@ -0,0 +1,14 @@
import { codigoContaSite } from "./_codigoContaSite"
import { type tipoUsuarioExterno, usuarios_quipo } from "./_usuarios_quipo"
import { usuarios_quipo_vincular } from "./_usuarios_quipo_vincular"
import { validarToken } from "./_validarToken"
export type { tipoUsuarioExterno }
/** todas as rotas de comunicação com autenticador partem dessa variável */
export const pAutenticacao = {
validarToken,
codigoContaSite,
usuarios_quipo,
usuarios_quipo_vincular,
}

6
src/index.ts Normal file
View file

@ -0,0 +1,6 @@
export * from "./autenticacao"
export * from "./lista-prefeituras"
export * from "./lista-usuarios"
export * from "./lista-vinculos"
export * from "./produtos"
export * from "./tokens"

40
src/lista-prefeituras.ts Normal file
View file

@ -0,0 +1,40 @@
import cFetch from "cross-fetch"
import { respostaComuns, type tipoResposta } from "p-respostas"
import type { chaves_produto } from "./produtos/tipagem"
export type tipoRetornoListarPrefeitrua = {
nome: string
inquilino: string
base_url: string
produto: keyof typeof chaves_produto
}
export const tx_listar_prefeituras = "listar_prefeituras" as const
export const listarPrefeituras = async ({
url_api_autenticacao,
}: {
url_api_autenticacao: string
}): Promise<tipoResposta<tipoRetornoListarPrefeitrua[]>> => {
const url = `${url_api_autenticacao}/api/${tx_listar_prefeituras}`
return cFetch(url)
.then(async (a) => {
const texto = await a.text()
try {
const res: tipoResposta<tipoRetornoListarPrefeitrua[]> =
JSON.parse(texto)
return res
} catch (error: any) {
return respostaComuns.erro(`Erro ao listar cidades: ${error.message}`, [
texto,
error,
])
}
})
.catch((error) =>
respostaComuns.erro(`Erro ao listar cidades: ${error.message}`, [error]),
)
}

54
src/lista-usuarios.ts Normal file
View file

@ -0,0 +1,54 @@
import cFetch from "cross-fetch"
import { respostaComuns, type tipoResposta } from "p-respostas"
export const tx_usuarios__listar = "usuarios__listar" as const
export type tipo_usuarios__listar_retorno = {
inquilino: string
vinculo: string
codigo: string
cpf: string
data_hora_atualizacao: string
email: string
id_betha_sistema: string
nome: string
telefone: string
}
export type tipo_usuarios__listar_parametros = {
inquilino?: string
}
export const listarUsuarios = async (
{
token,
url_api_autenticacao,
}: { url_api_autenticacao: string; token: string },
parametros: tipo_usuarios__listar_parametros,
): Promise<tipoResposta<tipo_usuarios__listar_retorno[]>> => {
const url = `${url_api_autenticacao}/api/${tx_usuarios__listar}`
return cFetch(url, {
headers: { token, "Content-Type": "application/json" },
body: JSON.stringify(parametros),
method: "post",
})
.then(async (a) => {
const texto = await a.text()
try {
const res: tipoResposta<tipo_usuarios__listar_retorno[]> =
JSON.parse(texto)
return res
} catch (error: any) {
return respostaComuns.erro(
`Erro ao listar usuários: ${error.message}`,
[texto, error],
)
}
})
.catch((error) =>
respostaComuns.erro(`Erro ao listar usuários: ${error.message}`, [error]),
)
}

48
src/lista-vinculos.ts Normal file
View file

@ -0,0 +1,48 @@
import cFetch from "cross-fetch"
import { respostaComuns, type tipoResposta } from "p-respostas"
export const tx_vinculos__listar = "vinculos__listar" as const
export type tipo_retorno_vinculo_listas = {
codigo: string
usuario_codigo: string
inquilino: string
vinculo: string
chave_produto: string
_usuario_nome: string
_inquilino_nome: string
_inquilino_base_url: string
}
export const listarVinculos = async ({
token,
url_api_autenticacao,
}: {
url_api_autenticacao: string
token: string
}): Promise<tipoResposta<tipo_retorno_vinculo_listas[]>> => {
const url = `${url_api_autenticacao}/api/${tx_vinculos__listar}`
return cFetch(url, {
headers: { token, "Content-Type": "application/json" },
body: "{}",
method: "post",
})
.then(async (a) => {
const texto = await a.text()
try {
const res: tipoResposta<tipo_retorno_vinculo_listas[]> =
JSON.parse(texto)
return res
} catch (error: any) {
return respostaComuns.erro(`Erro ao listar cidades: ${error.message}`, [
texto,
error,
])
}
})
.catch((error) =>
respostaComuns.erro(`Erro ao listar cidades: ${error.message}`, [error]),
)
}

View file

@ -0,0 +1,15 @@
import { type opcoesVinculosGov, ProdutoQuipo } from "./tipagem"
export const produto_betha_meio_ambiente = new ProdutoQuipo({
chave_produto: "betha-meio-ambiente",
titulo: "Betha Meio Ambiente",
descricao:
"Betha Meio Ambiente: Software de gestão de processos ambientais para órgãos públicos da Betha Sistemas.",
url_produto: ({ inquilino, base_url, vinculo }) =>
`${base_url}/${inquilino}${
vinculo == ("anonimo" satisfies keyof typeof opcoesVinculosGov)
? ""
: `/${vinculo}#/admin`
}`,
})

View file

@ -0,0 +1,13 @@
import { produto_betha_meio_ambiente } from "./_betha-meio-ambiente"
import { type opcoesVinculosGov, ProdutoQuipo } from "./tipagem"
export const produto_e_licencie_gov = new ProdutoQuipo({
...produto_betha_meio_ambiente,
titulo: "e-Licencie Gov",
chave_produto: "e-licencie-gov",
url_produto: ({ inquilino, base_url, vinculo }) =>
`${base_url}/${inquilino}${
vinculo == ("anonimo" satisfies keyof typeof opcoesVinculosGov)
? ""
: `/${vinculo}#/admin`
}`,
})

View file

@ -0,0 +1,8 @@
import { Produto } from "./tipagem"
export const produto_e_licencie = new Produto({
chave_produto: "e-licencie",
titulo: "e-Licencie",
descricao: "e-Licencie: Software de gestão de processos e dados ambientais.",
url_produto: ({ base_url }) => base_url,
})

9
src/produtos/_suporte.ts Normal file
View file

@ -0,0 +1,9 @@
import { Produto } from "./tipagem"
export const produto_suporte = new Produto({
chave_produto: "suporte",
titulo: "Suporte",
descricao: "Gestão de contas e usuários dos produtos da e-licencie",
url_produto: ({ base_url }) => base_url,
})

31
src/produtos/doc.ts Normal file
View file

@ -0,0 +1,31 @@
/**
Produtos existentes:
Atenticacao:
Acesso a gestão de produtos
Apenas uma conta com o código autenticao
/autenticacao
Betha Meio Ambiente:
Acesso a gestão da aplicação Quipo
Acesso pode ser sociedade ou governo
/quipo
Possue limite de acesso a módulos:
Licenciamento
Fiscalização
e-licencie GOV:
Acesso a gestão da aplicação Quipo
Acesso pode ser sociedade ou governo
/quipo
e-licencie:
Acesso a Aplicação e-licencie
Adminstrador e Não adminstrasdor
*/

35
src/produtos/index.ts Normal file
View file

@ -0,0 +1,35 @@
import { produto_betha_meio_ambiente } from "./_betha-meio-ambiente"
import { produto_e_licencie } from "./_e-licencie"
import { produto_e_licencie_gov } from "./_e-licencie-gov"
import { produto_suporte } from "./_suporte"
import {
chaves_produto,
opcoesVinculos,
opcoesVinculosGov,
Produto,
provedoresGov,
versao_usuarios,
} from "./tipagem"
export const listaProdutos: {
[k in keyof typeof chaves_produto]: Produto<k>
} = {
"betha-meio-ambiente": produto_betha_meio_ambiente,
"e-licencie": produto_e_licencie,
"e-licencie-gov": produto_e_licencie_gov,
suporte: produto_suporte,
}
export {
Produto,
chaves_produto,
opcoesVinculosGov,
opcoesVinculos,
provedoresGov,
produto_betha_meio_ambiente,
produto_e_licencie,
produto_e_licencie_gov,
produto_suporte,
versao_usuarios,
}

102
src/produtos/tipagem.ts Normal file
View file

@ -0,0 +1,102 @@
/** Lista dos produtos da e-licencie */
export enum chaves_produto {
suporte = "suporte",
"betha-meio-ambiente" = "betha-meio-ambiente",
"e-licencie-gov" = "e-licencie-gov",
"e-licencie" = "e-licencie",
}
export const opcoesVinculosGov = {
governo: "Governo",
sociedade: "Sociedade",
anonimo: "Anônimo",
} as const
export const opcoesVinculosSuporte = {
"suporte-1": "Suporte Primário",
} as const
export const opcoesVinculos = {
[chaves_produto.suporte]: opcoesVinculosSuporte,
[chaves_produto["betha-meio-ambiente"]]: opcoesVinculosGov,
[chaves_produto["e-licencie-gov"]]: opcoesVinculosGov,
[chaves_produto["e-licencie"]]: {},
} as const
export const tiposAcesso = opcoesVinculosGov
export const provedoresGov = {
/** Sistema de login da Beta */
"betha-sistemas": "Betha Sistemas",
/** sistema de login do altenticado */
"e-licencie": "e-licencie",
} as const
type extruturaTokenBase = {
inquilino_codigo: string
usuario_codigo: string
usuario_nome: string
codigo_acesso_produto: string
codigo_autenticacao: string
}
type extrutruaraTokenQuipo = extruturaTokenBase & {
inquilino_nome: string
tipo_de_acesso: keyof typeof opcoesVinculosGov
provedor: keyof typeof provedoresGov
}
export class Produto<C extends keyof typeof chaves_produto> {
/** Chave do produto*/
chave_produto: C
/** Titulo do produto */
titulo: string
/** Descrição do módulo */
descricao: string
/** URL base do módulo */
url_produto: (_: {
inquilino: string
base_url: string
vinculo: string
}) => string
constructor(_: {
/** Chave do produto*/ chave_produto: C
/** Titulo do produto */
titulo: string
/** Descrição do módulo */
descricao: string
/** URL base do módulo */
url_produto: (_: {
inquilino: string
base_url: string
vinculo: string
}) => string
}) {
this.chave_produto = _.chave_produto
this.titulo = _.titulo
this.descricao = _.descricao
this.url_produto = _.url_produto
}
extruturaToken(
_: extruturaTokenBase,
): extruturaTokenBase & { chave_produto: C } {
return { ..._, chave_produto: this.chave_produto }
}
}
export class ProdutoQuipo<
C extends keyof typeof chaves_produto,
> extends Produto<C> {
extruturaToken(
_: extrutruaraTokenQuipo,
): extrutruaraTokenQuipo & { chave_produto: C } {
return { ..._, chave_produto: this.chave_produto }
}
}
export enum versao_usuarios {
versao_usuarios_autenticacao = "versao_usuarios_autenticacao",
versao_usuarios_quipo = "versao_usuarios_quipo",
}

11
src/tokens/index.ts Normal file
View file

@ -0,0 +1,11 @@
import type { provedoresGov } from "../produtos"
export type tipoUsuarioTokenAutneticacao = {
usuario_codigo: string
usuario_nome: string
usuario_email: string
usuario_cpf: string
autenticacao_codigo: string
eSuporte: boolean
autenticacao_provedor: keyof typeof provedoresGov
}