Uma app web para listagem e importação de exames médicos feita com Ruby, Sinatra, PostgreSQL, Redis, Sidekiq e HTML/CSS/JS.
- Git
- Docker
git clone [email protected]:hreis1/rebase_labs.git
cd rebase_labs
Execute o comando para subir as aplicações:
docker compose up -d
Com isso, será criado:
- Um container com o banco de dados rodando na porta 5432.
- Um container com a api rodando na porta 3000.
- Um container com o frontend rodando na porta 3001.
- Um container com o Sidekiq
- Um container com o Redis
Com o servidor criado, execute o comando para rodar os testes do backend:
docker compose exec api rspec
Os testes do backend são feitos com RSpec e testam as rotas da API, os modelos e as classes do diretório ./api/lib
usando o banco de dados de teste postgres_test
.
Os testes do frontend são feitos manualmente.
A API é uma aplicação Sinatra que fornece os seguintes endpoints:
GET /api/tests
: Lista todos os exames no banco de dados.GET /api/tests/:token
: Obtem um exame a partir do token.POST /api/tests/import
: Importa exames a partir de um arquivo CSV.
A API retorna os exames no formato JSON. Os exemplos de requisição e resposta podem ser encontrados em API.md.
O Sidekiq é um serviço que processa os jobs de importação de exames. Ele é utilizado para processar a importação de exames em segundo plano, evitando que a aplicação fique travada enquanto o arquivo é importado. É possível visualizar o status dos jobs em http://localhost:3000/sidekiq
.
O Redis é um banco de dados em memória que é utilizado pelo Sidekiq para armazenar os jobs.
Na página inicial, clique no botão "Importar CSV" e selecione o arquivo CSV que deseja importar. Após a importação, a página será recarregada e a tabela de exames será atualizada. Dependendo do tamanho do arquivo, a importação pode demorar alguns segundos. Recomenda-se o uso do arquivo ./api/spec/support/data.csv
que contém 1 exame para testar a importação. Caso queira testar com um arquivo maior, utilize o arquivo ./api/data/data.csv
que contém 300 exames.
Na página inicial, a tabela de exames será atualizada com os exames importados. Cada linha da tabela representa um exame e cada coluna representa um atributo do exame.
Na barra de pesquisa, você pode pesquisar exames por token, data do exame, nome do paciente, cpf do paciente ou nome do médico. A tabela será filtrada de acordo com o que foi digitado.
Clique em qualquer linha da tabela para visualizar os detalhes do exame. Um modal será aberto com os detalhes do exame. O resultado do exame é exibido em verde caso esteja normal e em vermelho caso esteja alterado. Clicando no botão "X" ou fora do modal, o modal será fechado.
O banco de dados utilizado é o PostgreSQL. Ele é criado automaticamente quando o servidor é iniciado pela primeira vez, inicializado com as configurações do arquivo ./api/config/init.sql
, criando o database postgres
e o database postgres_test
com as tabelas necessárias.
As tabelas do banco de dados foram modeladas de acordo com o diagrama de entidade-relacionamento a seguir:
Com o servidor criado, execute o script para importar os dados do CSV localizado em ./api/data/data.csv
para o banco de dados:
docker compose exec api ruby import_from_csv.rb
O script lê o arquivo e importa os exames para o banco de dados de forma síncrona sem utilizar o Sidekiq.
- Adicionar paginação na listagem de exames.
- Adicionar filtros de ordenação na listagem de exames.
- Adicionar validação de CPF e email na importação de exames.
- Adicionar testes no frontend.
- Adicionar CI/CD.
- Adicionar suporte a outros formatos de arquivo na importação de exames.
- Melhorar tempo de inserção de dados
- Melhorar query de busca de exames
- Refatorar models(retirar métodos repetidos, usar OO)
- Refatorar script js do front(separar em arquivos diferentes)