_respostas/src/respostas.ts

173 lines
3.9 KiB
TypeScript

export enum codigosResposta {
sucesso = 200,
erroConhecido = 400,
erroPermissao = 401,
erroNaoEncontrado = 404,
erroDesconhecido = 500,
tempoEsgotado = 504,
}
export type tipoRespostaSucesso<T> = {
cod: codigosResposta.sucesso
valor: T
mensagem: undefined
eErro: false
eCerto: true
detalhes?: string[]
}
export type tipoRespostaErro = {
cod:
| codigosResposta.erroConhecido
| codigosResposta.erroDesconhecido
| codigosResposta.erroPermissao
| codigosResposta.erroNaoEncontrado
| codigosResposta.tempoEsgotado
valor: undefined
mensagem: string
eErro: true
eCerto: false
detalhes?: string[]
}
export type tipoResposta<T> = tipoRespostaSucesso<T> | tipoRespostaErro
export const gerarRespostas = <T>(
registrarErroInterno: (erro: T) => Partial<tipoRespostaErro>,
) => {
const valor = <T>(valor: T, detalhes?: string[]): tipoRespostaSucesso<T> => {
return {
cod: codigosResposta.sucesso,
valor,
mensagem: undefined,
eErro: false,
eCerto: true,
detalhes,
}
}
const valorTrue = (detalhes?: string[]): tipoRespostaSucesso<true> => {
return {
cod: codigosResposta.sucesso,
valor: true,
mensagem: undefined,
eErro: false,
eCerto: true,
detalhes,
}
}
const erro = (mensagem: string, detalhes?: string[]): tipoRespostaErro => {
return {
cod: codigosResposta.erroConhecido,
valor: undefined,
mensagem,
eErro: true,
eCerto: false,
detalhes,
}
}
const erroPermissao = (
mensagem?: string | undefined | null,
detalhes?: string[],
): tipoRespostaErro => {
return {
cod: codigosResposta.erroPermissao,
valor: undefined,
mensagem: mensagem || "Sem permissão para esse recurso.",
eErro: true,
eCerto: false,
detalhes,
}
}
const naoEncontrado = (
mensagem?: string | undefined | null,
detalhes?: string[],
): tipoRespostaErro => {
return {
cod: codigosResposta.erroNaoEncontrado,
valor: undefined,
mensagem:
mensagem ||
"Registro não encontrado ou a execução dessa ação depende de um registro existente.",
eErro: true,
eCerto: false,
detalhes,
}
}
const erroInterno = (parametros: T, mensagem?: string): tipoRespostaErro => {
const resRegistro = registrarErroInterno(parametros)
const mensagemFim = `${mensagem || "Erro interno"}`
return {
cod: codigosResposta.erroDesconhecido,
valor: undefined,
mensagem: mensagemFim,
eErro: true,
eCerto: false,
...resRegistro,
}
}
const tempoEsgotado = (
mensagem?: string | undefined | null,
detalhes?: string[],
): tipoRespostaErro => {
return {
cod: codigosResposta.tempoEsgotado,
valor: undefined,
mensagem:
mensagem || "Tempo de resposta esgotado ao tentar acessar o recurso.",
eErro: true,
eCerto: false,
detalhes,
}
}
const erroEspera = tempoEsgotado
return {
/**
* Gera uma resposta de sucesso
*/
valor,
/**
* Gera uma resposta de sucesso com valor true
*/
valorTrue,
/**
* Gera uma resposta de erro conhecido
*/
erro,
/**
* Gera uma resposta de erro de permissão,será necessário fazer o login novamente
*/
erroPermissao,
/**
* Gera uma resposta de erro desconhecido, geralmente tem origem de um exception
*/
erroInterno,
/**
* Gera uma resposta de erro quando um registro não é encontrado ou sua execução depende de um registro existente
*/
naoEncontrado,
/**
* Gera uma resposta de erro quando o tempo de resposta é esgotado
*/
tempoEsgotado,
/**
* Gera uma resposta de erro quando o tempo de resposta é esgotado
*/
erroEspera,
}
}
/**
* Uso de respostas em comuns
*/
export const respostaComuns = gerarRespostas(() => ({}))