update
This commit is contained in:
+49
-2
@@ -24,6 +24,9 @@ Backend da aplicação MeowSpool escrito em **Rust**, utilizando **Axum** como f
|
||||
| Validação | `validator` | 0.18 |
|
||||
| HTTP Client | `reqwest` (json, rustls-tls) | 0.12 |
|
||||
| Geração QR Code | `qrcode` | 0.14 |
|
||||
| Geração de imagem| `image` | 0.25 |
|
||||
| Encode Base64 | `base64` | 0.22 |
|
||||
| Geração PDF | `printpdf` | 0.7 |
|
||||
|
||||
---
|
||||
|
||||
@@ -138,6 +141,7 @@ Todas as rotas são prefixadas com `/api/v1`.
|
||||
| DELETE | `/:id` | `delete_filament_handler` | Autenticado |
|
||||
| GET | `/:id/qrcode` | `get_qrcode_handler` | Autenticado |
|
||||
| GET | `/:id/label.svg` | `export_label_handler` | Autenticado |
|
||||
| GET | `/:id/label.pdf` | `export_label_pdf_handler`| Autenticado |
|
||||
|
||||
**Query params de listagem (`GET /filaments`):**
|
||||
|
||||
@@ -370,11 +374,36 @@ O backend implementa **last-write-wins com timestamp**:
|
||||
|
||||
### Etiqueta SVG (`GET /filaments/:id/label.svg`)
|
||||
|
||||
- Query params: `width_mm` (padrão: 50), `height_mm` (padrão: 30)
|
||||
- Retorna SVG com: cor visual, modelo, material, marca, peso líquido e QR Code embutido
|
||||
- Query params: `width_mm` (padrão: 50), `height_mm` (padrão: 30), `fields` (opcional)
|
||||
- Retorna SVG com os campos selecionados embutidos
|
||||
- `Content-Type: image/svg+xml`
|
||||
- `Content-Disposition: attachment; filename="meowspool-label-{id}.svg"`
|
||||
|
||||
### Etiqueta PDF (`GET /filaments/:id/label.pdf`)
|
||||
|
||||
- Query params: `width_mm` (padrão: 50), `height_mm` (padrão: 30), `fields` (opcional)
|
||||
- Retorna PDF de página única com dimensões exatas em mm — ideal para impressoras de etiqueta (Brother, Dymo)
|
||||
- Gerado com `printpdf`: fundo escuro `#1E1B18`, barra de cor do filamento, texto com Helvetica builtin, QR Code embutido como PNG luma
|
||||
- `Content-Type: application/pdf`
|
||||
- `Content-Disposition: attachment; filename="meowspool-label-{id}.pdf"`
|
||||
|
||||
### Parâmetro `fields` (SVG e PDF)
|
||||
|
||||
Controla quais elementos aparecem na etiqueta. Valor: string com itens separados por vírgula.
|
||||
|
||||
| Valor | Elemento |
|
||||
| --------------- | ------------------------------- |
|
||||
| `color` | Barra de cor lateral |
|
||||
| `name` | Nome do modelo |
|
||||
| `material_brand`| Texto "Marca · Material" |
|
||||
| `net_weight` | Peso líquido disponível |
|
||||
| `print_temp` | Temperatura de impressão |
|
||||
| `qrcode` | QR Code com deep link |
|
||||
|
||||
Se `fields` for omitido, todos os elementos são incluídos.
|
||||
|
||||
Implementado em `LabelFields` (`filament_service.rs`) — `LabelFields::from_str(Option<&str>)`.
|
||||
|
||||
---
|
||||
|
||||
## Segurança
|
||||
@@ -390,6 +419,24 @@ O backend implementa **last-write-wins com timestamp**:
|
||||
|
||||
## Mudanças Recentes (14/03/2026)
|
||||
|
||||
### ✅ Exportação de Etiqueta PDF (`GET /filaments/:id/label.pdf`)
|
||||
|
||||
- **Dependência**: `printpdf = "0.7"` adicionada ao `Cargo.toml`
|
||||
- **Service**: `FilamentService::generate_label_pdf` em `filament_service.rs`
|
||||
- Layout: fundo `#1E1B18`, barra de cor (filament.color_hex), texto Helvetica builtin, QR Code PNG luma embutido
|
||||
- Página com dimensões exatas em mm via `printpdf::Mm`
|
||||
- Usa `Polygon` + `PaintMode::Fill` para retângulos (API do printpdf 0.7)
|
||||
- QR Code embutido via `ImageXObject` com pixels luma brutos — sem depender do feature `image` do printpdf
|
||||
- **Handler**: `export_label_pdf_handler` em `filament_handler.rs`
|
||||
- **Rota**: `GET /api/v1/filaments/:id/label.pdf`
|
||||
|
||||
### ✅ Controle de Campos na Etiqueta (`fields` query param)
|
||||
|
||||
- **Struct**: `LabelFields` em `filament_service.rs` — parseia string CSV de campos ativos
|
||||
- **Aplicado em**: `generate_label_svg` e `generate_label_pdf`
|
||||
- **LabelQuery**: adicionado campo `fields: Option<String>` em `filament_handler.rs`
|
||||
- Permite que o cliente selecione quais elementos aparecem na etiqueta (cor, nome, material, peso, temp, QR)
|
||||
|
||||
### ✅ Correção: PUT Spool Preset retornava FORBIDDEN
|
||||
|
||||
**Local:** `src/adapters/outbound/postgres_spool_preset_repo.rs` — método `update()`
|
||||
|
||||
Reference in New Issue
Block a user