O StyleSync é uma API REST desenvolvida em Flask para gerenciamento de produtos e vendas. O sistema permite autenticação de usuários, CRUD completo de produtos, importação de vendas via CSV e gerenciamento de categorias.
- Sistema de login com JWT
- Tokens com expiração de 30 minutos
- Middleware de autenticação para rotas protegidas
- GET
/products- Listar todos os produtos - POST
/products- Criar novo produto (requer autenticação) - GET
/product/<id>- Visualizar produto específico - PUT
/product/<id>- Atualizar produto (requer autenticação) - DELETE
/product/<id>- Deletar produto (requer autenticação)
- POST
/sales/upload- Importar vendas via arquivo CSV (requer autenticação)
- Flask - Framework web Python
- MongoDB - Banco de dados NoSQL
- PyMongo - Driver Python para MongoDB
- Pydantic - Validação de dados e serialização
- JWT - Autenticação via tokens
- Python-dotenv - Gerenciamento de variáveis de ambiente
- CSV - Processamento de arquivos CSV
stylesync-flask/
├── app/
│ ├── __init__.py # Configuração da aplicação Flask
│ ├── decorators.py # Decorators de autenticação
│ ├── models/ # Modelos de dados
│ │ ├── category.py # Modelo de categoria
│ │ ├── products.py # Modelo de produto
│ │ ├── sale.py # Modelo de venda
│ │ └── user.py # Modelo de usuário
│ └── routes/ # Rotas da API
│ ├── main.py # Rotas principais (produtos, vendas, auth)
│ └── category_routes.py # Rotas de categorias
├── config.py # Configurações da aplicação
├── run.py # Arquivo principal para execução
└── tests/ # Diretório de testes
- Python 3.8+
- MongoDB
- Git
git clone https://github.com/diegoolinek/stylesync.git
cd stylesyncpython -m venv venv# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activatepip install -r requirements.txtCrie um arquivo .env na raiz do projeto:
MONGO_URI=mongodb://usuario:senha@host:porta/database
SECRET_KEY=chave_secretapython run.pyA API estará disponível em http://localhost:5000
POST /login
Content-Type: application/json
{
"username": "admin",
"password": "123"
}Resposta:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}GET /productsPOST /products
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Produto Exemplo",
"price": 99.90,
"description": "Descrição do produto",
"stock": 10
}GET /product/<product_id>PUT /product/<product_id>
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Nome Atualizado",
"price": 89.90
}DELETE /product/<product_id>
Authorization: Bearer <token>POST /sales/upload
Authorization: Bearer <token>
Content-Type: multipart/form-data
file: arquivo.csvFormato do CSV:
sale_date,product_id,quantity,total_value
2024-01-15,507f1f77bcf86cd799439011,2,199.80
2024-01-16,507f1f77bcf86cd799439012,1,99.90- Autenticação baseada em JWT
- Tokens com expiração automática (30 minutos)
- Validação de dados com Pydantic
- Headers de autorização obrigatórios para operações sensíveis
O projeto utiliza o pytest como framework de testes para garantir a qualidade e funcionalidade do código.
Para executar todos os testes:
python -m pytest tests/Para executar os testes com informações detalhadas:
python -m pytest tests/ -vPara executar um arquivo de teste específico:
python -m pytest tests/test_utils.pytests/
├── __init__.py
└── test_utils.py # Testes para funções utilitárias
test_format_currency_with_decimal()- Testa formatação de moeda com valores decimaistest_format_currency_with_integer()- Testa formatação de moeda com valores inteirostest_format_currency_with_zero()- Testa formatação de moeda com valor zero
- Todos os arquivos de teste devem começar com
test_ - As funções de teste devem começar com
test_ - Use nomes descritivos que indiquem o que está sendo testado
- Mantenha os testes simples e focados em uma única funcionalidade
{
"name": str, # Nome do produto
"price": float, # Preço
"description": str, # Descrição (opcional)
"stock": int # Quantidade em estoque
}{
"sale_date": date, # Data da venda
"product_id": str, # ID do produto
"quantity": int, # Quantidade vendida
"total_value": float # Valor total
}{
"name": str, # Nome da categoria
"description": str # Descrição (opcional)
}Este projeto está sob a licença MIT.
- Diego Olinek - Desenvolvedor - GitHub