API para registro e resposta de reclamações
Desatende é um app que desenvolvi sozinho para um projeto da faculdade, com backend focado em boas práticas e segurança. O nome “Desatende” une as palavras “desatenção” e “atende”, deixando claro o propósito: registrar falhas no atendimento em setores como restaurantes, faculdades, companhias aéreas e outros. Usuários podem cadastrar reclamações, detalhando o ocorrido e a localização, e as reclamações são organizadas por categoria, facilitando a busca por setor. Empresas e instituições podem responder publicamente, promovendo transparência e resolução. O objetivo é criar uma comunidade onde experiências reais ajudam a pressionar por melhorias no atendimento e elevar o padrão de serviço. O aplicativo não foi publicado em ambiente de produção como o Play Console e Render, sendo destinado exclusivamente a fins educacionais e sem fins lucrativos.
Com o backend rodando, acesse http://localhost:5000/api-docs no navegador para testar a API pela interface gráfica Swagger UI.
A autenticação utiliza JWT para gerar e validar tokens de sessão de forma segura. Os tokens são assinados com uma chave secreta definida em variáveis de ambiente (dotenv), nunca expostos no código-fonte. As senhas dos usuários são validadas, possuem requisitos mínimos e são armazenadas já criptografadas usando bcrypt. O backend implementa validação de dados com Joi e limita tentativas abusivas de acesso através do express-rate-limit, protegendo a API contra ataques de força bruta e DDoS. Como o frontend é React Native, não há necessidade de configuração de CORS. O sistema possui fluxo completo de cadastro e autenticação, permitindo que novos usuários se registrem normalmente.
O aplicativo possui fluxo de autenticação com telas de login e cadastro, tanto para usuários quanto empresas. Após login, a Home lista empresas disponíveis, permitindo abrir um modal para envio de reclamações utilizando o método POST na API. Usuários autenticados podem acessar o Perfil para visualizar suas reclamações, deletar abertas e avaliar respostas recebidas após interação da empresa. A tela de perfil também conta com botão de logout seguro.
No dashboard da empresa, é possível visualizar todas as reclamações recebidas. Cada reclamação pode ser respondida diretamente pelo dashboard, utilizando o método PATCH para editar o status e a resposta do registro. Todo o fluxo é baseado em autenticação via JWT e integração direta com as rotas protegidas do backend.
O projeto utiliza React Native para a interface mobile, integração de APIs via Axios, backend construído em Node.js com Express e ESModules. O banco de dados é MongoDB, utilizando Mongoose como ODM.
A autenticação é baseada em JWT e as senhas são protegidas com bcrypt. O projeto adota Joi para validação de dados, express-rate-limit para limitar requisições e diversas outras bibliotecas para garantir boas práticas e segurança.
Os testes unitários foram implementados com o Poku leve, rápido e brasileiro! 🇧🇷
Além disso, utilizei Thunder Client e HTTPie para testes manuais dos endpoints.
- Clone este repositório:
git clone https://github.com/mmyersbyte/appdesatende - Acesse a pasta do backend:
cd backend - Configure as variáveis de ambiente:
Crie um arquivo.envcom base no arquivo.env.examplefornecido.
Dica: Preencha oJWT_SECRETcom um valor seguro para testar autenticação JWT. - Instale as dependências:
npm install - Inicie o servidor: ou
npm run devnode server.js
- Pré-requisitos: Tenha o Node.js e o Expo CLI instalados em seu computador.
- Acesse a pasta do frontend:
cd app - Instale as dependências:
npm install - Configure a URL da API:
Altere aBASE_URLpara o endereço do seu backend local no arquivoapp.jsonou no arquivo de configuração correspondente. - Execute o projeto:
npx expo start - Testando no seu celular físico:
Instale o aplicativo Expo Go na Play Store/App Store, escaneie o QR Code do terminal e pronto! - Testando no emulador:
Instale o Android Studio, configure um emulador Android e rode o comando acima. O Expo vai detectar o emulador automaticamente.
.
├── backend
│ ├── .env
│ ├── package.json
│ ├── server.js
│ ├── swagger
│ │ ├── swagger.json
│ │ └── swagger.js
│ ├── tests
│ │ ├── auth.test.js
│ │ ├── validators.test.js
│ └── src
│ ├── app.js
│ ├── config
│ │ └── db.js
│ ├── controllers
│ │ ├── authEmpresa.Controller.js
│ │ ├── authUser.Controller.js
│ │ ├── empresa.Controller.js
│ │ ├── reclamacao.Controller.js
│ │ └── user.Controller.js
│ ├── middlewares
│ │ ├── auth.js
│ │ ├── errorHandler.js
│ │ ├── notFoundHandler.js
│ │ ├── rateLimiter.js
│ │ ├── upload.js
│ │ └── validate.js
│ ├── models
│ │ ├── Empresa.js
│ │ ├── Reclamacao.js
│ │ └── User.js
│ ├── routes
│ │ ├── empresa.js
│ │ ├── reclamacao.js
│ │ └── user.js
│ └── validators
│ ├── authValidators.js
│ └── reclamacaoValidators.js
├── app
│ ├── api
│ │ ├── auth.js
│ │ ├── axios.js
│ │ ├── empresas.js
│ │ └── reclamacao.js
│ ├── components
│ │ ├── AuthModal.jsx
│ │ ├── CustomButton.jsx
│ │ ├── EmpresaItem.jsx
│ │ ├── Formulario.jsx
│ │ ├── HeaderTitulo.jsx
│ │ ├── LogoutButton.jsx
│ │ ├── ModalAvaliarReclamacao.jsx
│ │ ├── ModalCriarReclamacao.jsx
│ │ ├── ModalRespostaReclamacao.jsx
│ │ ├── ReclamacaoItem.jsx
│ │ └── Rodape.jsx
│ ├── estilos
│ │ ├── estilosHome.js
│ │ ├── estilosLogin.js
│ │ ├── estilosPerfil.js
│ │ └── estilosPerfilEmpresa.js
│ ├── hooks
│ │ ├── useAuth.js
│ │ ├── useEmpresas.js
│ │ ├── useFeedback.js
│ │ ├── useImagePicker.js
│ │ ├── useMinhasReclamacoes.js
│ │ ├── useReclamacoesRecebidas.js
│ │ └── useRefresh.js
│ ├── dashboard.jsx
│ ├── home.jsx
│ ├── index.jsx
│ └── perfil.jsx
├── app.js
├── app.json
├── package.json





