english description coming later
Depois de desenvolver diversos projetos flask, eu pensei em criar um projeto que pudesse servir de base ou referência para qualquer tipo de aplicação, que seja fácil de expandir sem que seu crescimento se torne uma bagunça.
Seguindo boas praticas de desenvolvimento de API's e conceitos de Clean Architecture, esse projeto vai servir de referência para qualquer tipo de aplicação flask
Incluso nesse projeto:
- Cadastro de usuário, encriptação de senha com bcrypt
- Login, com autenticação JWT
- Status do usuário
- Logout
- Endpoint hello world com cache no redis para servir de referência
- Swagger
- Healthcheck dos serviços dependentes
- banco de dados Postgres
- Infraestrutura em docker
- Python 3.7+
- Docker
- Flask: Framework de desenvolvimento de API's Restful
- Docker: Infraestrutura entregue em containers
- Postgres: banco de dados relacional
- Sqlalchemy: Framework de acesso ao banco de dados
- Gunicorn: WSGI Server para disponibilizar a API Flask, configurado com gevent.
- Nginx: Proxy Reverso que serve como ponte de acesso a API e porta de entrada aos usuários.
- Marshmallow: Validação de valores enviados nas requisições
- healthcheck: Healthcheck dos serviços de backend necessários para o funcionamento da API
- Swagger UI: Contrato de dados da API
- JWT: Mecanismo de autenticação
- Bcrypt: Encriptação de senhas
- Redis: Cache dos dados processados
Inicie os containers com o comando abaixo
docker-compose up -d --build
A persistência de dados do postgres é realizada no diretório docker/data-persistence
A criação dos bancos é feita via script docker/init.sql executada na inicialização do banco
O Comando abaixo vai criar as tabelas do banco conforme o schema das entidades
docker exec -it flask-api flask db init
docker exec -it flask-api flask db migrate
URL: http://localhost/swagger
URL: http://localhost/healthcheck
É necessário que esteja de pé os containers postgres e redis
pip install -r requirements.txt --upgrade
export FLASK_ENV=development
export FLASK_APP=wsgi.py
flask run
pytest --cov-report html:coverage/ --cov-report term-missing --cov-report xml:coverage/cov.xml --cov=src/ tests/
flake8
Antes de executar o Sonar Scanner, crie um projeto e um token
Substitua o LOGIN_TOKEN no comando abaixo pelo token criado
sonar-scanner -Dsonar.projectKey=flask-boilerplate -Dsonar.sources=. -Dsonar.host.url=http://localhost:9000 -Dsonar.login="LOGIN_TOKEN" -Dsonar.exclusions=coverage/*,tests,migrations,docs,docker,coverage
Esse projeto foi desenvolvido seguindo os conceitos do Clean Architecture / Arquitetura Hexagonal cada componente foi desenvolvido de forma isolada, minimizando ao máximo o acoplamento
O nivel de dependencia das camadas vai de cima para baixo, onde a camada de cima conhece a de baixo mas a de baixo não conhece a de cima, as dependencias são injetadas na construção das classes
- Frameworks and Drivers
- Interface Adapters
- Application Business
- Enterprise Business
Essa camada é responsável pela infra estrutura e construção das classes dos niveis abaixo dela
Nessa camada é implementado os controllers, responsável por definir os endpoints da API e chamar o serviço
Nessa camada é implementado o caso de uso. Cada caso de uso é uma parte minima responsável por apenas uma tarefa, os casos de uso são utilizados pelos serviços.
Nessa camada é implementado o serviço fornecido pelos endpoints, onde é o ponto central da logica do negócio, utiliza dos casos de uso como dependencia para implementação dos algoritimos de serviço
- Expandir testes funcionais
- Alguns testes unitarios podem ser melhorados separados por cenários
- Pode ser incluso um endpoint para refresh do token
- Pode ser incluso um endpoint para CRUD das roles
- Pode ser incluso um endpoint para associar as roles ao usuário
- Pode ser incluso um endpoint para definir um usuário como administrador
- Melhorar README.me com versão em inglês, e explicar melhor a interação entre as camadas