export enum codigosResposta { sucesso = 200, erroConhecido = 400, erroPermissao = 401, erroNaoEncontrado = 404, erroDesconhecido = 500, tempoEsgotado = 504, } export type tipoRespostaSucesso = { 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 = tipoRespostaSucesso | tipoRespostaErro export const gerarRespostas = ( registrarErroInterno: (erro: T) => Partial, ) => { const valor = (valor: T, detalhes?: string[]): tipoRespostaSucesso => { return { cod: codigosResposta.sucesso, valor, mensagem: undefined, eErro: false, eCerto: true, detalhes, } } const valorTrue = (detalhes?: string[]): tipoRespostaSucesso => { 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(() => ({}))