Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajustes Finais Diversos #12

Merged
merged 6 commits into from
Aug 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 4 additions & 150 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,153 +1,7 @@
# Challenge 1
# Challenge - Fase 1

Este projeto é um sistema de pedidos de lanches adaptável para web e mobile, focado no backend.
Este projeto é um Sistema de Pedidos para uma Lanchonete adaptável para web e mobile, focado no backend.
A aplicação é desenvolvida utilizando FastAPI, SQLAlchemy, e Docker.

Você irá encontrar todos os Passos do Nosso Projeto na nossa
[Plataforma de Documentação](https://software-architecture-fiap.github.io/tech-challenge/).

## Pré-requisitos

1. **Sistema Operacional**: O projeto pode ser executado em qualquer sistema operacional que suporte Docker e Python. Recomenda-se um sistema baseado em Unix (Linux ou macOS) para facilitar o uso de Docker.
2. **Python**: Versão 3.8 ou superior.
3. **Docker**: Para containerização da aplicação.
4. **Docker Compose**: Para orquestração dos contêineres Docker.

## Configuração do Ambiente

### Instalação do Python

**Linux/macOS**:

```sh
sudo apt update
sudo apt install python3 python3-pip
```

**Windows**:

- Baixe e instale o Python no [site oficial](https://www.python.org/downloads/).

### Instalação do Docker

Siga as instruções no site oficial do Docker para instalar o Docker e Docker Compose:

- [Docker](https://docs.docker.com/get-docker/)
- [Docker Compose](https://docs.docker.com/compose/install/)

### Clonando o Repositório

Clone este repositório para sua máquina local:

```sh
git clone https://github.com/seu-usuario/tech-challenge.git
cd tech-challenge
```

### Configuração do Banco de Dados

1. **Criar Banco de Dados e Usuário no PostgreSQL**:

- Acesse o PostgreSQL (certifique-se de que o serviço está em execução).

```sh
sudo -u postgres psql
```

- Execute os comandos SQL para criar o banco de dados e o usuário:

```sql
CREATE DATABASE mydb;
\c mydb
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
```

- Crie um arquivo `.env` na raiz do projeto e defina as seguintes variáveis:

```bash
DATABASE_URL=postgresql://postgres:localhost%401988@db:5432/challenge
SECRET_KEY=mySecurePassword
ADMIN_NAME=Admin User
[email protected]
ADMIN_CPF=00000000000
ADMIN_PASSWORD=your_password

```

### Instalando Dependências

- Crie e ative um ambiente virtual (opcional, mas recomendado):

```sh
python3 -m venv venv
source venv/bin/activate # Linux/macOS
.\venv\Scripts\activate # Windows
```

- Instale as dependências do projeto:

```sh
pip install -r requirements.txt
```

- Execute as migrações do Alembic para criar o banco de dados e as tabelas necessárias:

```sh
alembic revision --autogenerate -m 'initial migration'
alembic upgrade head
```

### Executando a Aplicação

**Com Docker:**

Certifique-se de que o Docker e o Docker Compose estão instalados.
Navegue até a pasta do projeto e execute:

```sh
docker-compose up --build
```

A aplicação estará disponível em `localhost:2000`.

**Sem Docker:**

Execute o servidor FastAPI:

```sh
uvicorn app.main:app --host 0.0.0.0 --port 2000 --reload
```

A aplicação estará disponível em `localhost:2000`.

### Documentação da API

A documentação interativa da API está disponível em `localhost:2000/docs`.

### Estrutura de Arquivos e Funções

- `app/main.py`: Ponto de entrada da aplicação.
- `app/models.py`: Definição dos modelos de dados.
- `app/schemas.py`: Definição dos esquemas Pydantic para validação.
- `app/crud.py`: Funções CRUD para manipulação dos dados.
- `app/database.py`: Configuração do banco de dados e sessão.
- `app/routers`: Roteadores FastAPI para diferentes endpoints (clientes, produtos, pedidos).
- `app/middleware.py`: Middleware para limitação de taxa (Rate Limiting).

### Limitação de Taxa

Foi criado mas ainda não implementado um middleware para limitar as solicitações de um mesmo IP para o endpoint de token. Este middleware usa Redis para rastrear e limitar as solicitações:

- Limite de 10 solicitações por minuto por IP.
- Mensagem de erro personalizada quando o limite é atingido.

### Contribuição

Para contribuir com este projeto, siga os passos:

- Fork o repositório.
- Crie uma nova branch (`git checkout -b feature/nova-funcionalidade`).
- Commit suas mudanças (`git commit -am 'Adicionei uma nova funcionalidade'`).
- Push para a branch (`git push origin feature/nova-funcionalidade`).
- Abra um Pull Request.
Você irá encontrar todos os Passos do Nosso Projeto através desse link na nossa
[Plataforma de Documentação](https://software-architecture-fiap.github.io/tech-challenge/).
2 changes: 1 addition & 1 deletion app/tools/initialize_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def initialize_db(db: Session):

for product in products:
if product['name'] in existing_product_names:
logger.info(f"Product already exists in the database: {product['name']} - Category: {product['category']}")
logger.info(f"Product already exists in the database: {product['name']} - Category: {product['category_id']}")
else:
db_product = Product(**product)
db.add(db_product)
Expand Down
10 changes: 5 additions & 5 deletions docs/testando.md → docs/entrega.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ _É importante que os desenhos sigam os padrões utilizados na explicação._

### :material-package-variant-plus: Entregável 2

2. Uma Aplicação para todo o sistema de backend (monolito) que deverá ser desenvolvido seguindo os padrões apresentados
1. Uma Aplicação para todo o sistema de backend (monolito) que deverá ser desenvolvido seguindo os padrões apresentados
nas aulas:

- [X] Utilizando Arquitetura Hexagonal
Expand All @@ -33,15 +33,15 @@ nas aulas:
- [X] Sem cpf: Pode ser feito pela Rota [Create Anonymous Customer](http://localhost:2000/docs#/customers/create_anonymous_customer_customers_anonymous_post)
- [X] Identificação do Cliente via CPF: Se cadastrado com [Create Customer](http://localhost:2000/docs#/customers/create_customer_customers_admin_post)
- [X] [Criar](http://localhost:2000/docs#/products/create_product_products__post), [Editar](http://localhost:2000/docs#/products/update_product_products__product_id__put) e [Remover](http://localhost:2000/docs#/products/delete_product_products__product_id__delete) Produtos: Necessário estar logado com Username (e-mail) e Token cadastrado com Admin;
- [ ] Buscar Produtos por Categoria
- [ ] Fake Checkout: apenas enviar os produtos escolhidos para a fila. O checkout é a finalização do pedido.
- [ ] Listar os Pedidos
- [X] Buscar Produtos por Categoria
- [X] Fake Checkout: apenas enviar os produtos escolhidos para a fila. O checkout é a finalização do pedido.
- [X] Listar os Pedidos
- [X] Banco de Dados à sua Escolha: Escolhemos o Postgres.
- Inicialmente, deveremos trabalhar e organizar a fila dos pedidos apenas em um banco de dados.

### :material-package-variant-plus: Entregável 3

3. [X] A aplicação deve ser entregue com um Dockerfile configurado para executá-la corretamente, e um docker-compose.yaml para subir o ambiente completo.
1. [X] A aplicação deve ser entregue com um Dockerfile configurado para executá-la corretamente, e um docker-compose.yaml para subir o ambiente completo.

- [X] Disponibilizar também o [Swagger](http://localhost:2000/docs) para consumo dessas APIs.

Expand Down
40 changes: 40 additions & 0 deletions docs/steps.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Passo a Passo para Testar o Backend

## :material-foot-print: Passos
Nessa documentação iremos te mostrar os Passos que você deve dar em direção aos testes. Isso irá lhe proporcionar uma
melhor experiência durante os teste. Abaixo, clique em cada uma das caixas de passos para seguir com cada etapa.

???- note "Passo 01: Login for Access Token"
A primeira coisa que deve ser feita é a criação de um Token usando um dos Usuários Admin.
Você poderá fazer isso através do Swagger em
[Login for Access Token](http://localhost:2000/docs#/default/login_for_access_token_token_post).
![image]()
Preencha campos **username** com "Admin User" e **password** com "your_password", por fim, preencha o client_id com
o número 1. Clique em Execute. Isso te dará acesso às etapas que exigem camadas de autenticação do token.

### Cenário 1: Cliente Anônimo

???- note "Passo 02: Fazendo Pedido Sem Identificação"
Nosso Backend foi feito com a possibilidade de que um cliente possa fazer seu pedido sem a necessidade de criar um
cadastro se identificando. E para isso, basta seguir os itens abaixo.
Você poderá fazer isso através do Swagger em
[Create Anonymous Customer](http://localhost:2000/docs#/customers/create_anonymous_customer_customers_anonymous_post).
![image]()
Basta clicar em Executar e o Usuário Anônimo será criado.

### Cenário 2: Cliente Cadastrado
Cliente com Identificação
Cria Conta com Identificação
1. Jornada do Cliente
1. Cria Order
2. Adiciona Produtos ao Pedido
3. Faz Pagamento (Fake Checkout)
2. Jornada da Lanchonete
1. Lista Pedidos que Tiveram Sucesso no Fake Checkout
2. Recebe Pedido com Status Aberto
3. Possibilidade de Filtrar por Categoria
4. Atualiza Status para Finalizado
3. Fluxo de Cadastro de Produto
1. Criar
2. Editar
3. Excluir
3 changes: 2 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,5 @@ nav:
- Event Storming: "event-storming.md"
- Guia:
- Ambiente: "environment.md"
- Teste: "testando.md"
- Entrega: "entrega.md"
- Passo a Passo: "steps.md"