Files
adminandClaude Sonnet 5 4b229a992b Webapp-Mechanismus (Phase 2): Server-seitige DB+API+Favicon-Fetch
Nachtrag: Migration 0030 (App-Store-Batch-1-Merkmale) war im letzten
Commit versehentlich nicht mit dabei - jetzt nachgeholt (git status hat
es aufgedeckt).

Neue Tabelle workspace_webapps (Migration 0032): kundeneigene
{name, url}-Eintraege pro Workspace, kein fester Katalog wie bei
Merkmalen - jede Organisation/jeder Workspace hat ihre/seine eigene
Liste (Nutzer-Anforderung 09.09.2026: 'der Kunde hat diverse URLs').

app.py-Aenderungen:
- fetch_favicon(): bestes-Effort-Ermittlung des Website-Favicons
  (erst <link rel=icon> per Regex aus dem HTML, sonst /favicon.ico an
  der Domain-Wurzel) - bewusst ohne neue pip-Abhaengigkeit (nur
  urllib, passt zum bisher sehr schlanken requirements.txt).
- CRUD-Endpunkte /api/v1/workspaces/{id}/webapps[/​{webapp_id}]
  (GET/POST/PUT/DELETE), Icon-Serving unter /webapp-icons/{filename}
  (unauthentifiziert wie /golden-images/, gleicher
  Path-Traversal-Schutz).
- Checkin-Response um 'webapps' erweitert (fetch_workspace_webapps(),
  gleiches assignments->bereitstellungsvorlagen-Join-Muster wie
  fetch_assigned_blueprints()).
- WICHTIG: Server komponiert nie eine eigene oeffentliche URL (ANODE_URL
  ist nur client-seitig bekannt, siehe agent.py/backend.sh) - Checkin
  liefert nur den relativen icon_path, der Agent haengt ANODE_URL davor.

Gehört zusammen mit admin/ansible-content (neue Rolle
webapp-shortcuts, echt end-to-end getestet) und admin/kundenplattform
(Admin-UI unter /admin/technik/workspaces/{id}, Icon-Proxy analog zum
bestehenden ISO-Download-Proxy-Muster).

Live auf anode angewendet: Migration 0032 (workspace_webapps-Tabelle).
app.py-Deployment (git pull + Neustart) folgt separat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-09 14:58:51 +02:00

104 lines
4.8 KiB
PL/PgSQL

BEGIN;
-- Erste Batch Phase 2 (App-Store-Merkmale, siehe
-- project_phase2_app_store_merkmale-Memory): 28 Apps mit regulärem
-- Debian/Ubuntu-Paket, per apt-cache auf einer echten Debian-trixie-Quelle
-- verifiziert (09.09.2026), kein Flatpak nötig - apt/deb hat laut
-- Nutzer-Entscheidung ohnehin Vorrang. Nur die drei apt-basierten Backends
-- (mint-image/debian-image/ubuntu-image), Fedora bewusst ausgeklammert.
INSERT INTO merkmale (id, key, name, description, kategorie_id, im_auftragskatalog) VALUES
(gen_random_uuid(), 'gimp', 'GIMP', NULL,
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
(gen_random_uuid(), 'inkscape', 'Inkscape', NULL,
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
(gen_random_uuid(), 'scribus', 'Scribus', NULL,
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
(gen_random_uuid(), 'librecad', 'LibreCAD', NULL,
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
(gen_random_uuid(), 'audacity', 'Audacity', NULL,
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
(gen_random_uuid(), 'musescore', 'MuseScore', NULL,
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
(gen_random_uuid(), 'metronome', 'Metronom', NULL,
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
(gen_random_uuid(), 'minuet', 'Minuet', NULL,
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
(gen_random_uuid(), 'stellarium', 'Stellarium', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'octave', 'GNU Octave', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'kalgebra', 'KAlgebra', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'kalzium', 'KAlzium', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'kbruch', 'KBruch', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'step', 'Step (Physik-Simulator)', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'tuxmath', 'Tux Math', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'filius', 'Filius', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'gcompris', 'GCompris', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
(gen_random_uuid(), 'ktouch', 'KTouch', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
(gen_random_uuid(), 'kwordquiz', 'KWordQuiz', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
(gen_random_uuid(), 'kanagram', 'Kanagram', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
(gen_random_uuid(), 'tuxtype', 'Tux Typing', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
(gen_random_uuid(), 'foliate', 'Foliate', NULL,
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
(gen_random_uuid(), 'evolution', 'Evolution', NULL,
(SELECT id FROM kategorien WHERE key = 'buero-produktivitaet'), TRUE),
(gen_random_uuid(), 'kturtle', 'KTurtle', NULL,
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
(gen_random_uuid(), 'fritzing', 'Fritzing', NULL,
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
(gen_random_uuid(), 'remmina', 'Remmina', NULL,
(SELECT id FROM kategorien WHERE key = 'internet-kommunikation'), TRUE),
(gen_random_uuid(), 'geogebra', 'GeoGebra', NULL,
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE),
(gen_random_uuid(), 'marble', 'Marble', NULL,
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE);
INSERT INTO blueprints (id, merkmal_id, backend_id, ansible_role)
SELECT gen_random_uuid(), m.id, b.id, m.key
FROM merkmale m
JOIN backends b ON b.key IN ('mint-image', 'debian-image', 'ubuntu-image')
WHERE m.key IN (
'gimp',
'inkscape',
'scribus',
'librecad',
'audacity',
'musescore',
'metronome',
'minuet',
'stellarium',
'octave',
'kalgebra',
'kalzium',
'kbruch',
'step',
'tuxmath',
'filius',
'gcompris',
'ktouch',
'kwordquiz',
'kanagram',
'tuxtype',
'foliate',
'evolution',
'kturtle',
'fritzing',
'remmina',
'geogebra',
'marble'
);
COMMIT;