30 Commits

Author SHA1 Message Date
Claude
a4b4974431 Selbstheilung: /api/auth/me stellt abgelaufenes/fehlendes preview_session-Cookie neu aus
Portal-Session (webklar_portal_session) lebt unabhaengig vom preview_session-JWT.
Fehlte das Preview-Cookie (WebView-Datenverlust, Ablauf), liefen alle
*.project.webklar.com-Hosts in eine 302-Login-Schleife (schwarze Seite im
Kundenportal), obwohl der Nutzer eingeloggt war - Re-Login war der einzige
Ausweg. Jetzt heilt jeder Aufruf der Projektuebersicht das Cookie automatisch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 20:13:44 +00:00
Claude
55991c9008 previewDeploy: node_build-Autodetect fuer App-Repos + Build-Output-Erkennung
- runDeploy: Repos mit package.json-build-Script ohne index.html werden
  automatisch als node_build gebaut (Expo/Vite/React zeigen sonst nur den
  Platzhalter); Build-Fehler fallen auf static+Platzhalter zurueck
- deployNodeBuild: npm-ci-Fallback auf npm install, Output-Erkennung
  dist/build/out/web-build, maxBuffer+Timeout
- updateWebsiteProject: bestehenden type/index aus .webklar-preview.json
  erhalten statt bei jedem Edit auf static zurueckzusetzen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 13:37:34 +00:00
Claude
f3bde44b3d previewDeploy: vorhandene HTML-Datei statt Platzhalter als Startseite befoerdern
Fehlt im Repo eine index.html, zeigte die Preview nur die
'wird vorbereitet'-Platzhalterseite, obwohl das eigentliche Projekt
(z.B. prototyp-app.html in knso/videogen) laengst deployt war.
ensureIndexHtml befoerdert jetzt die beste vorhandene HTML-Datei
(bevorzugte Namen, sonst einzige/groesste) per Kopie zur index.html;
der Platzhalter kommt nur noch, wenn gar keine HTML-Datei existiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 09:26:04 +00:00
webklar
943c6307c8 previewDeploy: private Repos per Token klonen (authedCloneUrl)
Anonymer git clone scheiterte bei privaten Gitea-Repos
("could not read Username"). Clone nutzt jetzt config.gitea.apiToken
via oauth2-Basic-Auth; Token wird aus Fehlermeldungen maskiert.
2026-07-12 20:49:56 +00:00
Claude
b6f5ea11ec Portal-Admin: archivierte Projekte/Kunden ausblenden, Kundentabelle ohne Horizontal-Scroll
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 19:30:16 +00:00
Claude
1b4262b09f fix: 403-Schutz + Selbstheilung fuer geloeschte Preview-Config
- runDeploy schreibt Platzhalter-index.html, wenn das Deploy-Verzeichnis
  keine index.html enthaelt (leergeraeumtes Repo/Fehlbuild) -> nie mehr
  nginx 403 Forbidden, Subdomain bleibt erreichbar.
- deployStatic: Fallback auf Repo-Wurzel bei fehlendem index-Unterordner,
  .git wird nicht mehr mit ausgeliefert.
- Webhook: fehlt .webklar-preview.json im Repo, wird die Hosting-Config aus
  dem Appwrite-Projektstand rekonstruiert, ins Repo zurueckgeschrieben und
  normal deployt (ensureRepoPreviewConfig).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 18:05:00 +00:00
Claude
07ebcc7e62 feat(portal): Live-Vorschaufenster pro Projektkarte im Kundenbereich
Statt nur Name + Link zeigt jede Projektkarte jetzt ein kleines,
skaliertes Live-Fenster der echten Webseite (iframe der previewUrl,
responsiv per ResizeObserver auf 1280px-Basisbreite herunterskaliert).
Klick aufs Fenster oeffnet die Seite im neuen Tab. Nicht-fertige
Projekte zeigen einen Platzhalter statt iframe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 12:42:35 +00:00
a874e51773 Update preview config from ticket system 2026-07-12 09:37:45 +00:00
Claude
bed738d8bd fix: verwaiste Projekte archivierbar (Gitea-Repo 404 nicht mehr hart abbrechen)
- archiveRepo: fehlt das Gitea-Repo (404), wird nur das Appwrite-Dokument
  (ent)archiviert statt hart zu scheitern -> orphaned Projekte lassen sich
  aus der Liste entfernen
- Reaktivierungs-Redeploy wird bei fehlendem Repo uebersprungen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 09:19:25 +00:00
Claude
376a8ae34d feat: Projekt-Typ Vorlage (template) - login-geschuetzt, isTemplate-Flag
- neuer Typ template: hasWebsite wie preview, isPublic=false, isTemplate=true
- deriveProjectType erkennt isTemplate; Appwrite-Update schreibt isTemplate
- .webklar-preview.json bekommt template-Flag

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 09:09:57 +00:00
Claude
617d463a5a fix: updateWebsiteProject - kein hasPreview-Attribut, TLS-Sync nach Appwrite-Update
- hasPreview existiert im Live-Schema nicht -> Appwrite lehnte Update ab
- syncPreviewTls muss NACH updateDocument laufen, sonst liest es isPublic
  noch im alten Zustand (oeffentlicher Router bekam faelschlich preview-auth)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 00:30:24 +00:00
Claude
b474c4aa48 feat: Website-Projekte bearbeiten (Name/Subdomain/Typ) + Archivierung
- updateWebsiteProject: synct Name/Subdomain/Typ nach Gitea (.webklar-preview.json,
  Repo-Beschreibung), Preview-Deploy (Redeploy+Teardown+TLS) und Appwrite
- Projekt-Typen: preview (Login), website (oeffentlich ohne Login), project (kein Hosting)
- syncPreviewTls erzeugt fuer isPublic-Projekte Router ohne preview-auth
- archiveRepo: Gitea archived + Appwrite-Flag + Preview-Teardown; Reaktivieren redeployt
- syncReposToAppwrite uebernimmt repo.archived
- Routen: PATCH /:id, POST /:id/archive, POST /:id/unarchive

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 00:21:50 +00:00
8880b10b28 feat: archived-Feld in Kunden-Admin-API durchreichen
sanitizeCustomer liefert jetzt customers.archived, damit das Ticketsystem den
Archiviert-Status ueber /api/admin/customers erhaelt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 18:44:21 +00:00
1c1826d25d fix: Repo-only-Projekte bekommen keine Subdomain vom Webhook; WOID numerisch
- Webhook: Subdomain-Fallback auf Repo-Name nur noch bei aktivierter Preview,
  Projekte ohne Website behalten leere Subdomain/previewUrl
- generateNextWoid: numerisches Maximum statt String-Sortierung (gemischt
  5-/6-stellige WOIDs im Bestand)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 18:14:41 +00:00
d4bd510dcd feat: Kundenportal-Ausbau - Tabs, Projekt-Einblicke, Git-Zeiterfassung, Rechnungen, Chat
Kunden-Dashboard:
- Tab-Navigation: Projekte | Was wurde gemacht | Rechnungen | Chat
- Projekt-Details pro Projekt: letzte Git-Commits (Titel+Beschreibung),
  Projektgroesse, Datei-Uebersicht (Top-Level aggregiert), Ticket-Arbeiten
- Rechnungen: gestylte Liste mit Status-Pillen, Ansehen/Zahlen-Link,
  PDF-Download ueber Server-Proxy (IDOR-geschuetzt)
- Chat mit dem Webklar-Team (Polling, Ungelesen-Badge, viewAs blockiert)

Admin-Dashboard:
- Chat-Tab: Konversationsliste + Thread + Antwortfeld, Ungelesen-Badge

Backend:
- giteaAdmin: getRepoInfo, listRepoCommits, getRepoTreeSummary
- projectInsights: 5-min-Cache, Invalidierung per Gitea-Webhook
- /api/projects/:id/git|files|work mit Ownership-Check (404)
- /api/chat/* (Kunde) + /api/portal-admin/chats/* (Admin), portalMessages-Collection
- mailer: E-Mail-Benachrichtigung an Admins bei Kundennachricht (15-min-Throttle)
- gitWorksheet: dd.mm.yyyy, voller Commit-Body, startTime leer (Zeit-Nachtrag),
  Auto-Webpage-Ticket bei Push auf Projekt ohne Ticket (ensureProjectTicket)
- customerActivity: Git-Push-Eintraege fuer Kunden sichtbar

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 18:01:24 +00:00
177ee6a13d feat: Admin-Bereich im Kundenportal (Ticketsystem-Login, Projektsuche, Kundenverwaltung)
- Login: Appwrite-User mit Label 'admin' (Ticketsystem-Mitarbeiter) bekommen
  eine Admin-Session und landen auf /admin.html
- Admin-Dashboard: Statistik-Uebersicht, Projektsuche ueber alle Projekte
  (inkl. Preview-/Gitea-Links, Vorschau ohne Kunden-Login), Kundenliste mit
  Portal-Status, letztem Login und Projektanzahl
- Kundennummer (code) direkt im Admin-Bereich pflegbar
- 'Als Kunde ansehen': Admin sieht das Portal exakt wie der Kunde (Banner
  mit Rueckweg zur Admin-Uebersicht)
- Kunden-Dashboard: neue Bereiche 'Meine Rechnungen' (InvoiceNinja inkl.
  Link ins Rechnungsportal) und 'Was wurde gemacht' (Tickets + Worksheets
  aus dem Ticketsystem, ohne interne Akquise-Tickets); Kundennummer im Header
- Admin-API /api/portal-admin/* (Session-basiert), Kunden-API /api/invoices
  und /api/activity
- appwriteClient: uebrig gebliebene Debug-Instrumentierung entfernt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:09:39 +00:00
0320042045 fix: Gitea-Webhook akzeptiert HMAC-Signatur (X-Gitea-Signature)
Gitea sendet das Webhook-Secret als HMAC-SHA256-Signatur des Bodys, nicht als
Klartext-Header. Bisher liefen alle per Secret konfigurierten Repo-Hooks auf
401 - Push-Deploys funktionierten nur ueber ?token= in der URL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:49:49 +00:00
cc57cf887a feat: HTTPS-TLS-Sync nach Deploy, Projekte ohne Subdomain, portalPassword-Feld
- previewDeploy.syncPreviewTls(): schreibt Traefik-Router (Host-Regeln) fuer alle
  Preview-Subdomains nach preview-hosts.yml, damit Let's Encrypt Zertifikate
  ausstellt. Laeuft nach jedem Deploy und beim Serverstart (ersetzt das nie
  aufgerufene bash-Script sync-preview-tls.sh).
- createProjectFromTemplate: Subdomain optional. Ohne Subdomain wird nur das
  Gitea-Repo angelegt (projectType 'repo', Status 'created'), kein Deploy.
- customerAdmin: Portal-Passwort liegt jetzt im Feld customers.portalPassword
  statt als __portalPassword__-Prefix in den Notizen; Legacy-Notizen werden
  beim naechsten Update bereinigt. CRM-Stufe (lead/customer) wird beim Setzen
  des Portal-Passworts nicht mehr auf 'active' ueberschrieben.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:34:23 +00:00
cf4b3ce4d1 chore: aktuellen Live-Stand sichern (Admin-API, Services, Auth-Erweiterungen)
Sichert den bisher uncommitteten Produktionsstand des Kundenbereich-Servers,
damit kuenftige Deploys (git reset --hard) nichts mehr verwerfen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:24:53 +00:00
cff72eb528 fix 2026-05-28 06:57:54 +02:00
901ab1adae fix 2026-05-25 16:49:13 +02:00
bbcc5dc05e design 2.0 2026-05-25 16:47:15 +02:00
d83bc33fd9 design 2026-05-25 16:23:22 +02:00
3840ecf494 fix 4 2026-05-23 01:18:44 +02:00
3f2572ca59 fix 3 2026-05-23 00:36:45 +02:00
29918f2a8a fix2 2026-05-23 00:21:31 +02:00
root
bd59243e2c Fix Login: Appwrite-Session ohne secret auf dem Server
session.secret wird ohne API-Key nicht zurückgegeben. Login nutzt
daher session.userId und die Admin Users API statt account.get().

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 22:16:31 +00:00
f313410770 fix1 2026-05-23 00:03:10 +02:00
8f167a20df tickt db übernahme 2026-05-22 23:51:20 +02:00
f31727aeb4 Implementiere Kundenportal mit zentraler Appwrite-Anbindung.
Express-Server für Appwrite-Auth, Session, Projekt-Dashboard und Gitea-Webhook; statisches Frontend und Schema-Dokumentation für woms-database.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 23:38:38 +02:00