| Master | Develop | |
|---|---|---|
| Status |
This documentation is also available in English.
A proposta deste projeto é oferecer um template para se criar uma API na linguagem Ruby usando o API Framework Grape dentro de um container docker e propor uma arquitetura de desenvolvimento de APIs. Este template possui:
- Uma aplicação dentro de um contêiner docker com a linguagem Ruby e suas gems como o framework Grape.
- Contêiner docker com o banco de dados Postgresql 12
- Uma sugestão de estrutura de diretórios para construir a aplicação e suas camadas
Neste projeto existem exemplos de endpoints para os recursos Project e Healthcheck. Nós acreditamos que com estes exemplos qualquer desenvolvedor ou desenvolvedora possa desenvolver APIs.
Nós continuaremos a evoluir este projeto conforme novas ideias e sugestões surjam, ou conforme erros sejam encontrados.
- Banco de dados -> Postgresql 12
- Language -> Ruby 2.6.4
-
Buildando todos os contêineres:
docker-compose build
-
Iniciando o contêiner development:
docker-compose up development
-
Pronto!
Você já pode acessar sua API através de http://localhost:3000. Tente checar o endpoint healthcheck: http://localhost:3000/healthcheck.
Este projeto usa quatro contêineres docker:
- database: Contêiner que fornece um banco de dados Postgres com duas instâncias: postgres_dev e postgres_test.
- development: Contêiner que executa a aplicação. Ele depende do contêiner database.
- test: Contêiner que executa testes e analizador de código. Ele depende do contêiner database.
- apiblueprint: Contêiner que executa o servidor de documentação de API.
| Serviços | Depende do serviço | Objetivos |
|---|---|---|
| database | Cria o contêiner de banco de dados com Postgres / Cria as instâncias postgres_dev e postgres_test | |
| development | database | Cria e executa o contêiner da aplicação |
| test | database | Cria o contêiner de teste da aplicação |
| apiblueprint | Cria o servidor de documentação da API |
Para buildar todos os contêineres basta executar o seguindo comando:
docker-compose buildPara buildar apenas um contêiner, execute:
docker-compose build <name-do-contêiner>O contêiner da aplicação (development) se conecta ao contêiner de banco de dados (database), isto significa que o contêiner development depende do contêiner database. Para iniciar ambos contêineres você deve executar o seguinte comando:
docker-compose up developmentCaso você queira esconder as mensagens de informações do docker, você precisa adicionar o parâmetro -d: docker-compose up -d development.
Observação: na primeira execução será criado o banco de dados e sua estrutura.
Pronto!
Você já pode acessar sua API acessando http://localhost:3000. Tente checar o endpoint healthcheck: http://localhost:3000/healthcheck.
Se você precisar inserir alguns dados de exemplo no banco de dados, você pode usar a rake task seeds através do comando abaixo.
docker-compose run --rm development rake db:seedsObservação:
- Este comando rake apagará todos os dados das tabelas antes de populá-las
Algunas informações sobre os contêineres:
-
database
- Porta: 5432
- Instâncias criadas com o arquivo
docker/database/create-multiple-postgresql-databases.sh:postgres_testepostgres_dev
-
development
- Porta: 3000
Mais informações sobre parar, iniciar, reiniciar, executar contêineres e mais, leia a Documentação do Docker Compose e a Documentação do Docker.
Este projeto usa mais um contêiner apenas para a execução de testes. Este contêiner se chama test. Criar infraestrutura para o contêiner test:
docker-compose up testExecute todos os testes com o seguinte comando:
docker-compose run --rm test rspecPara executar testes de apenas um arquivo, você deve informar o arquivo no final do comando.
docker-compose run --rm test rspec spec/services/healthcheck/get_service_spec.rbEste projeto utilizada a gem Rspec para linguagem Ruby como uma ferramenta de execução de testes.
Criar a infraestrutura para o contêiner test:
docker-compose up testEste projeto utilizada a gem Rubocop para linguagem Ruby como uma ferramenta de análise de código, então para analizar todo o código execute o seguinte comando.
docker-compose run --rm test rubocopPara analizar o código de um arquivo, você deve informar o arquivo no final do comando.
docker-compose run --rm test rubocop app/services/healthcheck/get_service.rbEste projeto utilizada a gem Simplecov para linguagem Ruby como um ferramenta de cobertura de testes do código, então para saber mais sobre a cobertura abra o arquivo ./coverage/index.html no seu navegador após a execução de todos os testes com o comando rspec.
Para executar os arquivos de migração de banco de dados:
docker-compose run --rm <container> rake db:migrateEste comando remove o contêiner.
Este projeto utilizada o formato API Blueprint como documentação de API, então você deve editar o arquivo doc.apib que contém toda a documentação que necessita. Para gerar um arquivo HTML com a documentação e acessá-la através do Snowboard, você pode usar um simples comando do docker-compose:
docker-compose up apiblueprintou usar o comando docker abaixo:
docker run -it --rm -p 127.0.0.1:8088:8088/tcp -v $PWD:/doc quay.io/bukalapak/snowboard http -b 0.0.0.0:8088 --playground -c config/snowboard.yml doc.apibPara acessar o servidor local da documentação em API Blueprint, visite o endereço http://localhost:8088.
O arquivo de configuração config/snowboard.yml foi criado para habilitar a documentação interativa. Com ela é possível simular a API.
- app -> O diretório principal da API. Contém toda a lógica da API.
- endpoints -> Lógica da construção dos endpoints e suas montagens, dividido por versões (v1, v2, v3 ...). Cada recurso possui um diretório e cada método http (get, post, put, delete, etc) possui um arquivo.
- entities -> Lógica da apresentação do resultado do endpoint, dividido por versões (v1, v2, v3 ...). Cada recurso possui uma entidade de representação.
- errors -> Possui classes de erros customizados.
- helpers -> Classes ou módulos do tipo helper para uso na API.
- models -> Armazena as classes modelo vinculadas ou não à uma tabela do banco de dados.
- services -> Contém toda a lógica de negócio para cada operação. Cada recurso possuir um diretório e cada operação (get, create, update, delete) possui um arquivo.
- validators -> Contém classes ou módulos de validação que são utilizadas pelas services. Cada recurso possui um diretório e cada operação tem um arquivo.
- config -> Contém arquivos de configuração da aplicação.
- environments -> Cada ambiente (test, development, production) é representado por um arquivo de configuração. Cada arquivo contém configurações específicas para cada ambiente.
- initializers -> Possui arquivo que precisam ser carregados no momento de inicializar a aplicação.
- db -> Contém arquivo associados com a execução do banco de dados usando ou não um ORM.
- migrations -> Contém arquivos de migração de banco de dados utilizando o ORM Sequel.
- seeds -> Contém classes que criam os dados de exemplo no banco de dados.
- docker -> Possui os arquivos de configurações do docker.
- app -> Contém os arquivos de configuração para os contêineres da aplicação.
- database -> Contém os arquivos de configuração para o contêiner database.
- spec -> Possui todos os teste, classes e módulos que auxiliam os testes, factories, tudo sobre testes. Cada teste escrito deve seguir sua estrutura de diretórios.
- factories -> Armazena todas as classes Factory (estamos usando a gem FactoryBot).
- endpoints -> Contém todos os testes de endpoints.
- models -> Contém todos os testes de models.
- services -> Contém todos os testes de services.
- commands -> Contém todos os testes de commands.
-
O Dockerfile para Postgresql 12 foi obtido no repositório oficial: Postgresql Dockerfile
-
O Dockerfile contendo a linguagem Ruby foi obtido no repositório oficial: Ruby Dockerfile