Skip to content
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
4 changes: 4 additions & 0 deletions api/celery_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# api/celery_config.py
# Configurações para o Celery
broker_url = 'redis://redis:6379/0'
result_backend = 'redis://redis:6379/0'
32 changes: 32 additions & 0 deletions api/main.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,49 @@
# api/main.py
import os
from typing import List
from fastapi import FastAPI, Depends, HTTPException, Query
from sqlalchemy.orm import Session

from . import crud, schemas
from .database import get_db
from .tasks import populate_sinapi_task

app = FastAPI(
title="AutoSINAPI API",
description="API para consulta de preços de insumos e composições da base SINAPI.",
version="1.0.0",
)

# --- Endpoints de Administração ---

@app.post("/admin/populate-database", status_code=202, tags=["Admin"])
def trigger_database_population(year: int, month: int):
"""
Dispara a tarefa de download e população da base SINAPI para um mês específico.
A tarefa roda em segundo plano. Retorna imediatamente com o ID da tarefa.
"""
# Monta os dicionários de configuração a partir do .env (lido pela API)
# Esta é a "fonte única da verdade"
db_config = {
"user": os.getenv("POSTGRES_USER"),
"password": os.getenv("POSTGRES_PASSWORD"),
"host": os.getenv("DB_HOST"), # O worker se conecta ao 'db' hostname da rede docker
"port": os.getenv("DB_PORT"),
"dbname": os.getenv("POSTGRES_DB")
}
sinapi_config = {
"year": year,
"month": month,
"workbook_type": os.getenv("SINAPI_WORKBOOK_TYPE", "REFERENCIA"),
"duplicate_policy": os.getenv("SINAPI_DUPLICATE_POLICY", "substituir")
}

# Envia a tarefa para a fila do Celery
task = populate_sinapi_task.delay(db_config, sinapi_config)

return {"message": "Tarefa de população iniciada.", "task_id": task.id}


@app.get("/", tags=["Root"])
def read_root():
return {"message": "Bem-vindo à API SINAPI. Acesse /docs para a documentação."}
Expand Down
27 changes: 27 additions & 0 deletions api/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# api/tasks.py
from celery import Celery
# Supondo que o AutoSINAPI será instalado como uma biblioteca
import autosinapi

# Instancia o app Celery
celery_app = Celery('tasks', broker='redis://redis:6379/0', backend='redis://redis:6379/0')
celery_app.config_from_object('api.celery_config')

@celery_app.task
def populate_sinapi_task(db_config: dict, sinapi_config: dict):
"""
A tarefa que o Celery Worker irá executar.
Ela chama a função principal do nosso toolkit AutoSINAPI.
"""
try:
# Chama a interface pública que definimos para o toolkit
result = autosinapi.run_etl(
db_config=db_config,
sinapi_config=sinapi_config,
mode='server' # Modo de alta performance
)
return result
except Exception as e:
# Logar o erro e relançar para que a tarefa seja marcada como falha
print(f"Erro ao executar a tarefa de população: {e}")
raise
19 changes: 19 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,25 @@ services:
networks:
- sinapi-net

redis:
image: redis:7-alpine
container_name: sinapi_redis
restart: unless-stopped
networks:
- sinapi-net

celery_worker:
build: .
container_name: sinapi_worker
command: celery -A api.tasks.celery_app worker --loglevel=info
env_file: .env
depends_on:
- redis
- db
restart: unless-stopped
networks:
- sinapi-net

kong-migrations:
image: kong:3.4
container_name: kong_migrations
Expand Down
109 changes: 109 additions & 0 deletions docs/nomenclaturas.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Padrões de Nomenclatura do Projeto autoSINAPI_API

Este documento define as convenções de nomenclatura a serem seguidas no desenvolvimento do projeto **autoSINAPI_API**, garantindo consistência, legibilidade e manutenibilidade do código e da infraestrutura.

---

## 1. Versionamento Semântico (SemVer)

O versionamento do projeto segue o padrão [Semantic Versioning 2.0.0](https://semver.org/lang/pt-BR/). O formato da versão é `MAJOR.MINOR.PATCH`.

- **MAJOR**: Incrementado para mudanças incompatíveis com a API (breaking changes).
- **MINOR**: Incrementado para adição de novas funcionalidades de forma retrocompatível.
- **PATCH**: Incrementado para correções de bugs de forma retrocompatível.

**Exemplos:**

- `0.1.0`: Lançamento inicial da API com funcionalidades básicas.
- `0.2.0`: Adição dos endpoints de `composicoes`.
- `0.2.1`: Correção de um bug na busca de `insumos`.
- `1.0.0`: Lançamento estável para produção.

---

## 2. Nomenclatura de Branches (Git)

Adotamos um fluxo de trabalho baseado no Git Flow simplificado.

- **`main`**: Contém o código estável e de produção. Apenas merges de `release` ou `hotfix` são permitidos.
- **`develop`**: Branch principal de desenvolvimento. Contém as últimas funcionalidades e correções.
- **`feature/<nome-da-feature>`**: Para o desenvolvimento de novas funcionalidades.
- Criada a partir de `develop`.
- Exemplo: `feature/task-status-endpoint`
- **`fix/<nome-da-correcao>`**: Para correções de bugs não críticos.
- Criada a partir de `develop`.
- Exemplo: `fix/query-performance-insumos`
- **`hotfix/<descricao-curta>`**: Para correções críticas em produção.
- Criada a partir de `main` e mesclada em `main` e `develop`.
- Exemplo: `hotfix/security-patch-auth`
- **`docs/<descricao-curta>`**: Para adicionar ou melhorar a documentação.
- Exemplo: `docs/ajustar-readme`

---

## 3. Mensagens de Commit (Conventional Commits)

Utilizamos o padrão [Conventional Commits](https://www.conventionalcommits.org/) para padronizar as mensagens.

**Formato:** `<tipo>(<escopo>): <descrição>`

- **`<tipo>`**: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`.

- **`<escopo>` (opcional)**: Onde a mudança ocorreu. Escopos sugeridos para este projeto:
- `api`: Lógica da API FastAPI (endpoints, schemas em `main.py`, `schemas.py`).
- `worker`: Tarefas do Celery (`tasks.py`).
- `db`: Modelos SQLAlchemy ou consultas em `crud.py`.
- `infra`: Arquivos de infraestrutura (`docker-compose.yml`, `Dockerfile`, `kong.yml`).
- `deps`: Adição, remoção ou atualização de dependências (`requirements.txt`).

**Exemplos:**

- `feat(api): adiciona endpoint para status de tarefas`
- `fix(worker): corrige tratamento de erro na tarefa de ETL`
- `docs(readme): atualiza instruções de setup do ambiente`
- `refactor(db): otimiza consulta de composições`
- `chore(infra): adiciona healthcheck ao serviço de api`
- `chore(deps): atualiza versão do fastapi`

---

## 4. Nomenclatura no Código e Infraestrutura

### 4.1. Python (API e Worker)

O código segue o padrão **PEP 8**.

- **Módulos e Classes**: `PascalCase` (ex: `Insumo`, `Composicao` em `schemas.py`).
- **Variáveis e Funções**: `snake_case` (ex: `get_db`, `populate_sinapi_task`).
- **Constantes**: `UPPER_SNAKE_CASE` (ex: `POSTGRES_USER`).
- **Arquivos**: `snake_case` (ex: `crud.py`, `tasks.py`).
- **Estrutura de Pacotes**: O código da aplicação reside no diretório `api/`.
- `main.py`: Contém a instância do FastAPI e os endpoints.
- `crud.py`: Contém as funções de acesso ao banco de dados (Create, Read, Update, Delete).
- `schemas.py`: Contém os modelos Pydantic para validação de dados da API.
- `database.py`: Contém a configuração da conexão com o banco de dados.
- `tasks.py`: Contém as definições de tarefas do Celery.

### 4.2. Infraestrutura (Docker & Kong)

- **Nomes de Serviço (em `docker-compose.yml`)**: `snake_case` e descritivos.
- Exemplos: `celery_worker`, `kong_migrations`.
- **Nomes de Contêiner**: Padrão `sinapi_<nome_do_serviço>`.
- Exemplos: `sinapi_api`, `sinapi_db`, `sinapi_worker`, `sinapi_gateway`.
- **Redes**: Padrão `sinapi-net`.

### 4.3. Convenções para Consumidores (Frontend)

As seções a seguir aplicam-se a projetos que consomem esta API (ex: um aplicativo web), e não ao repositório da API em si.

#### 4.3.1. CSS

- **Prefixo**: `as-` (AutoSINAPI).
- **Metodologia**: BEM (`as-bloco__elemento--modificador`).
- **Exemplos**: `.as-table`, `.as-table__row`, `.as-table__row--selected`.

#### 4.3.2. JavaScript

- **Variáveis e Funções**: `camelCase` (ex: `fetchInsumos`).
- **Classes**: `PascalCase` (ex: `SinapiClient`).
- **Constantes**: `UPPER_SNAKE_CASE` (ex: `API_BASE_URL`).
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ uvicorn[standard]
sqlalchemy
psycopg2-binary
python-dotenv
celery
redis