Files
dayMaker_lp/documentação/02_ARCHITECTURE.md
Carlos Correia fee538eebd MVP
2026-05-29 11:03:29 +01:00

160 lines
3.2 KiB
Markdown

# Arquitetura Técnica
## Stack atual
| Camada | Tecnologia |
|--------|------------|
| App móvel | Flutter / Dart |
| Backend/Auth/DB | Supabase |
| Base de dados | PostgreSQL via Supabase |
| Imagens | URLs guardados em `item_images` |
| IA de texto | Ollama API remota |
| Tema visual | Design tokens em `lib/theme/app_theme.dart` |
---
## Estrutura principal
```text
lib/
├── constants/
│ └── item_categories.dart
├── login/
│ └── login_screen.dart
├── Screens/
│ ├── home_screen.dart
│ ├── item_screen.dart
│ ├── add_item_screen.dart
│ ├── week_screen.dart
│ ├── ai_chat_screen.dart
│ └── perfil_screen.dart
├── services/
│ └── ai_recommendation_service.dart
├── theme/
│ └── app_theme.dart
└── main.dart
```
---
## Navegação
A `HomeScreen` contém uma navegação inferior com 5 áreas:
1. Início
2. Itens
3. Semana
4. IA
5. Perfil
O conteúdo é mantido num `IndexedStack`, permitindo alternar tabs sem recriar todos os ecrãs imediatamente.
---
## Modelo de dados Supabase
### `users`
Usada para dados adicionais do perfil.
| Campo | Tipo esperado |
|-------|---------------|
| `id` | UUID do utilizador |
| `nome` | texto |
### `items`
Representa itens do inventário.
| Campo | Tipo esperado |
|-------|---------------|
| `id` | inteiro/identificador |
| `user_id` | UUID |
| `nome` | texto |
| `categoria` | texto |
| `tags` | array/lista |
| `nota` / `notes` | texto opcional |
### `item_images`
Relaciona imagens a itens.
| Campo | Tipo esperado |
|-------|---------------|
| `item_id` | id do item |
| `image_url` | URL da imagem |
### `plans`
Representa um dia planeado.
| Campo | Tipo esperado |
|-------|---------------|
| `id` | inteiro/identificador |
| `user_id` | UUID |
| `data` | data em `YYYY-MM-DD` |
### `plan_items`
Relaciona itens com planos.
| Campo | Tipo esperado |
|-------|---------------|
| `plan_id` | id do plano |
| `item_id` | id do item |
---
## Serviço de IA
Ficheiro: `lib/services/ai_recommendation_service.dart`
Responsabilidades:
- Obter contexto do inventário do utilizador.
- Enviar mensagens para `https://apichat.epvc.pt/api/chat`.
- Usar modelo `llama3.2:3b`.
- Manter histórico simples em memória.
- Suportar modo silencioso para devolver apenas nomes de itens.
- Carregar itens com imagens para o fluxo de sugestão da home.
Formato da chamada Ollama:
```json
{
"model": "llama3.2:3b",
"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."}
],
"stream": false
}
```
---
## Tema visual
O tema é centralizado em `app_theme.dart`:
- `AppColors`
- `AppRadius`
- `AppSpacing`
- `AppShadows`
- `AppText`
- `AppDecorations`
- `AppButton`
- `AppChip`
- `AppSnack`
Novos ecrãs devem reutilizar estes tokens para manter consistência.
---
## Segurança
- Todas as queries de dados usam `user_id` do utilizador autenticado quando aplicável.
- A app não deve hardcodar chaves privadas.
- A API de IA atual é endpoint remoto público do projeto, sem chave no cliente.
- Dados de inventário enviados à IA incluem nomes, categorias, tags e notas dos itens.