Início
Sobre o projeto TACO
O projeto TACO (Tabela Brasileira de Composição de Alimentos), coordenado pelo Núcleo de Estudos e Pesquisas em Alimentação (NEPA) da UNICAMP e com financiamento do Ministério da Saúde – MS e Ministério do Desenvolvimento Social e Combate à FOME – MDS é uma iniciativa para proporcionar dados de um grande número de nutrientes em alimentos nacionais e regionais obtidos por meio de amostragem representativa e análises realizadas por laboratórios com competência analítica comprovada por estudos interlaboratoriais, segundo critérios internacionais.
Dica
Para saber mais, leia o site oficial
Sobre este projeto
Originalmente, o projeto TACO possui somente 2 maneiras de consumir esses dados. São elas:
- Através de um arquivo PDF. Neste caso, você precisa buscar o alimento desejado e seus respectivos valores;
- Através de um arquivo Excel (xls) que em tese, representa o "banco de dados" dos alimentos.
Em ambos casos, a construção de uma aplicação é quase impossível, dado que precisamos dos dados corretamente formatados, bem estruturados e com relações claras entre as informações.
Assim, o objetivo principal deste projeto é usar os dados originais da pesquisa da TACO e estruturar de tal forma que fique fácil para construção de um cliente (mobile ou web).
Processamento dos dados
O início do processo se baseia inteiramente no banco de dados (arquivo .xls) disponibilizado por eles. Entretanto, para conseguir um resultado satisfatório e poder inseri-los em um banco de dados relacional, as seguintes etapas foram feitas:
- Baixei a planilha original e subi para o Google Sheets;
- Converti de
.xls
(formato proprietário da Microsoft) para.xlsx
(formato do Office Open XML) para dar mais acessibilidade; - Fiz a limpeza de todas as formatações de linhas, colunas, fontes. Removi as linhas vazias, unifiquei linhas duplicadas ou que foram adicionadas para melhor visualização no estudo;
- Substitui os valores não numéricos, onde:
NA
(não aplicável) foi convertido para vazio (null
);*
(valores enviados para re-análise) foi convertido para vazio (null
);Tr
(valores entre um certo range) foi convertido para para zero (0
);
- Defini nomes em inglês para as colunas;
- Criei uma outra planilha (ainda no mesmo documento) que contém todas as categorias possíveis e linkei seus respectivos
id
s na planilha dos alimentos; - Criei uma outra planilha (ainda no mesmo documento) que contém informações nutricionais e linkei com o
id
do alimento; - Exportei cada planilha no documento para
.csv
e baixei dentro do projeto; - Fiz a modelagem do banco de dados usando uma ferramenta chamada
Prisma
; - Criei um scripts para popular o banco de dados na ordem correta, e fazendo a relação entre a informação e o alimento
Dados oficiais
Para manter os dados originais da pesquisa utilizado para realização desse projeto, salvei todos os arquivos do site original e você pode consultados na pasta /references/*
Tecnologias
- NodeJS - JavaScript runtime
- ExpressJS - Framework HTTP
- Prisma - JavaScript Object-Relational Mapping (ORM) para popular o banco de dados e definir a relação;
- SQLite - Mini banco de dados relacional;
- GraphQL - Query language para a API;
- Vuepress - Site da documentação
Contribuindo
Pré-requisitos
Para rodar o projeto localmente, você vai precisar ter instalado:
- NodeJS versão 18
- pnpm (gerenciador de dependências). Você pode seguir os passos de instalação clicando aqui;
- Algum GraphQL cliente para poder inspecionar a API. Eu recomendo o Altair GraphQL
Rodando o projeto
Primeiro, instale todas as dependências do projeto:
pnpm install
Depois, rode o servidor:
pnpm run dev
Feito isso, o servidor estará rodando no http://localhost:4000/grapqhl
. Agora, basta copiar este endereço dentro do seu cliente GraphQL para poder rodar queries e ver a documentação da API.
Prisma ORM e o Banco de dados
Porque o projeto utiliza SQLite e esse gera um arquivo que está sendo comitado, provavelmente você não precisará rodar nenhum dos comandos do data base.
Mas, se forkar o projeto e quiser fazer alterações nos modelos, você provavelmente precisará fazer uma migration no banco de dados para que as novas colunas/tabelas sejam inseridas.
Ao fazer qualquer alteração no arquivo src/infrastructure/prisma/schema.prisma
, rode o seguinte comando:
pnpm run db:migrate –name <nome-da-alteração>
Isso irá criar um arquivo de migration que deve ser commitado.
Caso queira limpar o banco de dados e reinserir os dados originais, pode usar o comando:
pnpm run db:reset
Caso queira ver o banco de dados em um dashboard, você pode subir o Prisma studio:
pnpm run studio
Documentação da API
Na versão 1, a documentação era gerada através do APIDocs. Agora que o projeto utiliza GraphQL, você pode ver a documentação da API (exemplo de queries, campos, etc) através do seu cliente GraphQL.
Usando em produção
Caso você queira rodar o projeto em modo de produção (para deployment), existem duas maneiras.
Sem docker
Aqui, você vai precisar seguir o mesmo pré-requisito da etapa de contribuição. Uma vez que tem as dependências instaladas, poderá rodar o comando:
pnpm start
Isso colocará o projeto em modo de produção (com os logs desabilitados) e também estará disponível no endereço http://localhost:4000/grapqhl
.
Com docker
Caso você tenha familiaridade com docker, existe a opção de rodar o projeto através de uma imagem. Dentro do repositório, existe uma arquivo de configuração para subir o projeto usando docker compose, assim, você pode fazer apenas:
docker compose up –build
Caso queira usar a imagem remota, pode rodar:
docker run -it --rm --name taco -p 4000:4000 raulfdm/taco-api:v2
FAQ
Existe uma demo online?
Não. Antigamente eu deixava uma versão hospedada no heroku, mas as pessoas estavam construindo aplicações que batiam diretamente nele e a minha quota de uso expirava muito rápido.
Além disso, o Heroku deixou de oferecer o plano gratuito, dificultando ainda mais o processo.
Posso utilizar esse projeto para construir uma aplicação cliente?
Sim, o projeto é livre para qualquer pessoa utilizar. Porém, como disse anteriormente, ele não está mais disponível online, ou seja, você precisará subir o servidor em algum serviço de cloud caso queira ter acesso.
O projeto ainda é mantido?
Mais ou menos. Quando eu o criei, a intenção era estudar construções de API utilizando NodeJS. Quando quero testar algo novo e que cabe neste escopo, eu atualizo uma coisa ou outra, mas como meu foco de carreira e profissional não é esse e eu tenho pouco tempo disponível, sempre dou preferência para outros projetos.
Por que você converteu o projeto de Rest para GraphQL?
Eu tomei essa decisão justamente porque queria revisitar a criação de APIs em Node, mas utilizando as novas ferramentas, e também porque eu acredito ser muito mais fácil e intuitivo você trazer as informações que o consumidor precisa. Caso você não esteja tão familiarizado com GraphQL, recomendo fortemente que estude o básico para pelo menos conseguir consumir, ou então, utilize a versão 1 do projeto.
Por que um banco de dados ao invés dos arquivos locais?
Na versão 2, eu escolhi um banco de dados relacional porque acredito que a estrutura dos dados da Taco é extremamente relacional. Existe uma relação entre a categoria e o alimento, o alimento e seus aminoácidos, o alimento e seus nutrientes, etc. Fazer essas relações utilizando um banco de dados é muito mais fácil do que utilizar arquivos JSON.
Por que SQLite e não Postgresql ou outro banco de dados?
Inicialmente eu comecei com Postgres. Porém, acho que ele oferece muito mais do que essa aplicação de fato precisa (umas 5 ou 6 tabelas com no máximo 500 linhas), além de adicionar complexidade no deploy da aplicação. O SQLite permite a gente gravar a base de dados junto com o restante dos arquivos, e isso facilita todo o processo.
Informações Legais
Este é um projeto sem fins lucrativos. Todos os dados utilizados foram pesquisados e produzidos pela UNICAMP, e todo direito autoral é reservado à instituição.
Dúvidas?
Se você tiver alguma dúvida ou sugestão sobre este projeto, procure na aba "discussão" no Github deste repositório. Caso sua dúvida não esteja lá, inicie uma nova discussão clicando aqui e eu responderei o quanto antes!