Repository navigation
Architecture
O produto possui uma aplicação web Python/SQLite e um núcleo C23 separado. O desktop executa o servidor HTTP local e abre o navegador. No Android, a distribuição é um Progressive Web App (PWA), acessado por uma origem HTTPS administrada pela implantação.
flowchart TD
UI[Interface web: HTML, CSS e JavaScript] -->|HTTP same-origin / JSON| API[API Python: api/app.py]
API --> AUTH[Autenticação, sessão, papéis e CSRF]
API --> VALID[Validação e regras de negócio]
API --> EXPORT[CSV, XLSX e Google Sheets opcional]
API --> AUDIT[Auditoria básica]
API -->|SQL parametrizado| DB[(SQLite: db/schema.sql)]
DESK[Launcher desktop.py] -->|inicia localmente| API
PWA[PWA Android] -->|HTTPS via proxy externo| API
C[Núcleo C23 independente] -. não integra o backend web .- UI
| Caminho | Responsabilidade |
|---|---|
api/app.py |
Servidor HTTP, rotas JSON, autenticação, regras de acesso, validação, banco e exportações |
ui/ |
Telas de login, dashboard, catálogo, usuários, financeiro, alertas, riscos/bugs e arquivos PWA |
db/schema.sql |
Esquema inicial SQLite |
desktop.py |
Inicia servidor local, cria token temporário no primeiro uso e abre navegador |
config/ |
Mapeamentos de campos usados pelo projeto |
assets/ |
Ícones e diagramas SVG |
tests/ |
Testes automatizados de API, PWA, commits e notas de release |
scripts/ |
Utilitários, incluindo exportação do dashboard |
packaging/ |
Scripts de empacotamento para Windows, Linux e implantação PWA |
Dockerfile, compose.yaml
|
Build e execução em container |
src/, include/
|
Núcleo C23 independente, legado/em evolução |
doc/, docs/
|
Arquitetura, requisitos, modelo de dados, operação, instalação e resultados de teste |
- O processo inicializa o esquema e configura o banco SQLite selecionado.
- Antes da primeira conta, a aplicação permite o provisionamento de administrador por token temporário.
- O usuário autentica-se e recebe cookie de sessão.
- A interface consulta a API na mesma origem.
- Rotas de negócio verificam sessão e papel; requisições de escrita também verificam o token CSRF.
- A API valida os dados e persiste alterações no SQLite.
- O dashboard e as exportações apresentam dados do workspace.
desktop.py cria um servidor HTTP vinculado por padrão a 127.0.0.1, seleciona uma porta livre quando PRODUCT_MANAGER_PORT=0, e abre o navegador. Se ainda não há usuário, gera um token aleatório de bootstrap caso ele não esteja definido. O processo permanece ativo até ser encerrado.
O esquema é inicializado a partir de db/schema.sql; a API também contém lógica de compatibilidade para bancos existentes. O banco de desenvolvimento padrão é db/product_manager.db, mas PRODUCT_MANAGER_DB pode apontar para outro arquivo. O desktop empacotado usa o diretório de dados do usuário.
- Desktop local: usuário, servidor e banco no mesmo computador; adequado a avaliação local.
-
Container: serviço em container e banco persistente no volume
product-manager-data. - PWA: frontend servido pela mesma origem que a API, atrás de proxy/servidor HTTPS.
- Núcleo C23: programa de terminal separado, compilado pelo Makefile; não é a camada de backend da aplicação web.
A aplicação não implementa isolamento de dados por organização, identidade corporativa OIDC/SAML, TLS embutido, recuperação automatizada de senha, movimentações imutáveis de estoque ou contabilidade fiscal. Uma implantação compartilhada exige que a organização opere TLS, rede, backups, segredos e atualizações.
flowchart TD
A[Usuário abre /login] --> B{Já existe administrador?}
B -- Não --> C[Bootstrap com token temporário]
C --> D[Criar conta admin e senha]
B -- Sim --> E[Login com credenciais]
D --> E
E --> F[Servidor valida credenciais e limite de tentativas]
F -->|Válido| G[Cookie de sessão HttpOnly]
F -->|Inválido| H[Erro e limitação temporária]
G --> I[GET /api/auth/me: obter token CSRF]
I --> J[Requisição de escrita com cookie + X-CSRF-Token]
J --> K{Sessão, papel e CSRF válidos?}
K -- Sim --> L[Validar payload e persistir no SQLite]
K -- Não --> M[Rejeitar requisição]
A figura descreve o fluxo geral documentado; as condições exatas de cada rota permanecem definidas em api/app.py.