Skip to content

Phase 1k.3 (Hub): User-Templates DB-Schema + API für Online Template-Editor #104

Description

@strausmann

Prämisse aktualisiert (2026-06-24)

Hinweis: Dieses Issue wurde ursprünglich vor Phase 1k.1a (Layout-Engine) geschrieben und
basierte auf Annahmen (templates-Tabelle, TemplateLoader, `templates:write` Scope), die in
Phase 1k.1a vollständig entfernt wurden. Die Beschreibung unten gibt den tatsächlichen Stand
der Umsetzung (Variante B/B1) wieder.


Parent

Phase 1k Umbrella: #101

Depends-on

Phase 1k.1 Layout-Engine: #103

Problem

Nach Phase 1k.1a läuft das Rendering vollständig über die LayoutEngine (Enum content_type +
tape_mm + LabelData). Es gibt keine User-Templates mehr im alten Sinne — die templates-Tabelle,
der TemplateLoader und der Scope templates:write existieren nicht. Es gab jedoch eine ungenutzte
presets-Tabelle, die als Grundlage für Layout-Presets (Variante B/B1) dient.

Benutzende haben keinen Weg, häufig genutzte Kombinationen aus content_type + tape_mm +
Label-Metadaten dauerhaft zu speichern und beim Druck per preset_id abzurufen.

Lösung (Variante B/B1 — umgesetzt)

Die presets-Tabelle wird zum Layout-Preset-Store ausgebaut. Ein PresetService übernimmt
Validierung und CRUD. Der Druck-Pfad bleibt vollständig unangetastet.

Scope

In:

  • presets-Tabelle erweitern (Felder content_type, tape_mm, Preset-Metadaten)
  • PresetService (Validierung + CRUD-Logik)
  • Router /api/v1/presets:
    • POST /api/v1/presets — Preset erstellen
    • GET /api/v1/presets — alle Presets auflisten
    • GET /api/v1/presets/{id} — Preset abrufen
    • PUT /api/v1/presets/{id} — Preset aktualisieren
    • DELETE /api/v1/presets/{id} — Preset löschen
    • GET /api/v1/presets/{id}/preview.png — Vorschau via bestehender LayoutEngine
  • Auth: Schreibzugriffe erfordern require_print, Lesezugriffe require_read
  • content_type-Default: qr_three_lines
  • Volle Unterstützung für content_type=qr_with_listing

Out (Folge-Arbeit):

  • Geometrie-Overrides (benutzerdefinierte x/y-Positionen pro Preset)
  • Editor-UI in Hangar (Companion-Issue, wird separat erstellt)
  • Versionierung von Presets
  • Sharing/Marketplace

Auth-Modell

3-stufiges Scope-System (wie im Rest der API):

  • Lesend (GET): require_read
  • Schreibend (POST, PUT, DELETE): require_print
  • kein eigener Scope templates:write

Akzeptanzkriterien

  • presets-Tabelle hat Felder content_type + tape_mm
  • PresetService implementiert Validierung + CRUD
  • GET /api/v1/presets listet alle Presets (erfordert require_read)
  • POST /api/v1/presets erstellt ein Preset (erfordert require_print)
  • PUT /api/v1/presets/{id} aktualisiert ein Preset (erfordert require_print)
  • DELETE /api/v1/presets/{id} löscht ein Preset (erfordert require_print)
  • GET /api/v1/presets/{id}/preview.png liefert Vorschau via LayoutEngine
  • Writes benötigen require_print, Reads require_read
  • content_type-Default ist qr_three_lines

Referenzen

Dokument Link
PR (Umsetzung) #136
Spec https://github.com/strausmann/Label-Printer-Hub/blob/main/docs/superpowers/specs/2026-06-23-user-presets-design.md
Plan https://github.com/strausmann/Label-Printer-Hub/blob/main/docs/superpowers/plans/2026-06-23-phase-1k3-user-presets.md
Phase 1k Umbrella #101
Phase 1k.1 Layout-Engine #103

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:apiREST API + SSE endpointsphase-1kPhase 1k: Layout-Engine + Multi-Label-Batch + Template-Editorsuperpowers:brainstormingKonzept wurde mit superpowers:brainstorming geplanttype:featureNew feature or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions