Commit Graph

17 Commits

Author SHA1 Message Date
Zaid Marzguioui
28188bb3a6 fix(billing): wire up Stripe checkout with real price IDs and env vars
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m3s
Workflow / ⚫️ Test (push) Has been skipped
- Replace 8 placeholder price IDs (price_starter_monthly, etc.) with real
  Stripe test-mode price IDs created via API
- Add STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, NEXT_PUBLIC_BILLING_PROVIDER,
  and NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY to docker-compose.yml (build args + runtime)
- Add NEXT_PUBLIC_BILLING_PROVIDER ARG/ENV to Dockerfile
- Enable team and personal account billing (was 'false')
- Created Stripe webhook endpoint for production URL
- Created 4 Stripe products (Starter/Pro/Verband/Enterprise) with monthly+yearly prices

Checkout was crashing because:
1. STRIPE_SECRET_KEY was missing → Zod validation failed at createStripeClient()
2. STRIPE_WEBHOOK_SECRET was missing → same Zod schema rejection
3. NEXT_PUBLIC_BILLING_PROVIDER was unset → BillingProviderSchema.parse() failed
4. Price IDs were placeholders, not real Stripe price_xxx IDs
2026-04-02 23:34:30 +02:00
T. Zehetbauer
f82a366a52 Merge remote-tracking branch 'origin/main'
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 4m51s
Workflow / ⚫️ Test (push) Has been skipped
2026-04-01 14:05:13 +02:00
Zaid Marzguioui
49fd6b65b9 fix(supabase): use internal URL for all server-side clients with cookie name matching
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m38s
Workflow / ⚫️ Test (push) Has been skipped
ROOT CAUSE FIX: All server-side Supabase clients (server-client, middleware-client,
server-admin-client) now use SUPABASE_INTERNAL_URL (http://supabase-kong:8000)
when available, with cookieOptions.name set to match the external URL's cookie key
(e.g. sb-myeasycms-auth-token). This gives us:
- Reliable Docker-internal networking (no hairpin NAT through Traefik)
- Correct session cookie matching between browser and server
- No more 500 errors on SSR pages that query Supabase

Reverted per-page try/catch workarounds since root cause is now fixed.
2026-04-01 13:53:59 +02:00
T. Zehetbauer
c98cada7f6 refactor: improve code readability and consistency in api.ts and common.json 2026-04-01 13:33:43 +02:00
Zaid Marzguioui
5294cfab61 feat: enable Fischerei, Sitzungsprotokolle, Verbandsverwaltung modules
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m44s
Workflow / ⚫️ Test (push) Has been skipped
- Enable all 3 modules via NEXT_PUBLIC_ENABLE_* build args + runtime env
- Fix empty-string-to-null for date/optional columns in all module APIs:
  fischerei (24 fixes), verbandsverwaltung (15 fixes), sitzungsprotokolle (2 fixes)
- CACHE_BUST=12 for full rebuild with new feature flags
2026-04-01 13:23:57 +02:00
Zaid Marzguioui
72227b5aab fix(auth): revert SUPABASE_INTERNAL_URL — cookie name mismatch
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m17s
Workflow / ⚫️ Test (push) Has been skipped
Browser creates cookies keyed by the external hostname (sb-myeasycms-*),
but server was using SUPABASE_INTERNAL_URL (sb-supabase-kong-*) — different
keys = server can't find the session = infinite 'please wait' after login.

Both client and server now use the same NEXT_PUBLIC_SUPABASE_URL (external
domain). The SSR reaches Supabase via Traefik → Kong which works fine.
2026-04-01 11:42:00 +02:00
Zaid Marzguioui
c9f8101698 fix(docker): add SUPABASE_INTERNAL_URL for server-side Supabase access
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m31s
Workflow / ⚫️ Test (push) Has been skipped
Server-side code (proxy.ts, SSR, API routes) now uses SUPABASE_INTERNAL_URL
(http://supabase-kong:8000) instead of the external domain. This avoids
hairpin NAT / DNS resolution issues where Docker containers can't reach
their own external domain through the reverse proxy.

Browser-side JS still uses the external URL (baked at build time).
2026-03-31 22:55:15 +02:00
Zaid Marzguioui
e263bd93f8 fix(docker): restore runtime NEXT_PUBLIC vars, add DEFAULT_LOCALE build arg
Some checks failed
Workflow / ⚫️ Test (push) Has been cancelled
Workflow / ʦ TypeScript (push) Has been cancelled
- Restore NEXT_PUBLIC_SUPABASE_URL + NEXT_PUBLIC_SUPABASE_PUBLIC_KEY at runtime
  (server code reads from process.env — needs these for SSR)
- Use external URL (API_EXTERNAL_URL) for both build and runtime
- Add NEXT_PUBLIC_DEFAULT_LOCALE=de as Dockerfile build arg so next-intl
  compiles with the correct default locale (was falling back to 'en')
- CACHE_BUST=3 to force full rebuild
2026-03-31 22:44:06 +02:00
Zaid Marzguioui
f3f54da726 fix(docker): remove runtime NEXT_PUBLIC_SUPABASE_URL override
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m36s
Workflow / ⚫️ Test (push) Has been skipped
NEXT_PUBLIC_ vars are baked into the Next.js bundle at build time.
Setting them at runtime with Docker-internal URLs (http://supabase-kong:8000)
causes SSR to fail with 500 because RSC uses the runtime value which
is unreachable from the browser. Let the build-time value
(https://myeasycms.frontieralgorithmics.de) be used everywhere.
2026-03-31 22:18:05 +02:00
Zaid Marzguioui
1fbe8a630c fix(docker): remove network_mode for Dokploy compatibility
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m32s
Workflow / ⚫️ Test (push) Has been skipped
Dokploy injects 'networks' into all compose services for Traefik routing,
which is mutually exclusive with 'network_mode: service:supabase-kong'.

Changes:
- Remove network_mode from app service
- App server-side Supabase URL: http://supabase-kong:8000 (Docker DNS)
- App browser-side Supabase URL: ${API_EXTERNAL_URL} (external domain)
- Kong catch-all route: app:3000 instead of localhost:3000
2026-03-31 18:48:59 +02:00
Zaid Marzguioui
cae6657c53 fix(docker): simplify migrate command, remove heredoc
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m36s
Workflow / ⚫️ Test (push) Has been skipped
Replace shell heredoc with multiple -c flags for psql. Heredoc syntax
can cause issues in some Docker Compose implementations.
2026-03-31 18:39:25 +02:00
Zaid Marzguioui
e7e5d4126a fix(docker): fix healthchecks for PostgREST, Storage, Studio
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m35s
Workflow / ⚫️ Test (push) Has been skipped
- PostgREST: replace wget healthcheck with TCP socket check — PostgREST
  v12 is a minimal image without wget/curl
- All services: add start_period to healthchecks to avoid premature
  unhealthy marking during initial startup
2026-03-31 18:30:06 +02:00
Zaid Marzguioui
a2aa5598b5 fix(docker): make all services depend on db-migrate completion
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m33s
Workflow / ⚫️ Test (push) Has been skipped
PostgREST, Auth, Realtime, Storage, and Meta were starting before db-migrate
set role passwords. On existing volumes (where initdb didn't re-run),
these services would fail to authenticate to Postgres. Now all services
wait for db-migrate to complete successfully before starting.
2026-03-31 18:15:58 +02:00
Zaid Marzguioui
5f3d23273c fix(docker): remove host port bindings, add idempotent role passwords, Kong app route
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m33s
Workflow / ⚫️ Test (push) Has been skipped
Dokploy deployment fixes:
- Remove all host port bindings (Kong 8000/8443/3000, Studio 54323, Inbucket 54324,
  DB 5432) — Traefik handles external routing in Dokploy, host ports conflict
  with other services on the shared server
- Add idempotent ALTER ROLE password commands to db-migrate service — ensures
  role passwords are set even when DB volume persists across deployments
  (docker-entrypoint-initdb.d only runs on empty data dirs)
- Add catch-all app route to Kong config — proxies / to localhost:3000
  (Next.js app via network_mode: service:supabase-kong)
2026-03-31 18:09:10 +02:00
Zaid Marzguioui
a1470bd9f4 fix(docker): use build args for NEXT_PUBLIC vars, remove host port exposure
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m37s
Workflow / ⚫️ Test (push) Has been skipped
- Dockerfile: replace hardcoded NEXT_PUBLIC env vars with ARG+ENV pattern
  so the same Dockerfile works for any environment (local dev, Dokploy prod)
- docker-compose.yml: pass SUPABASE_ANON_KEY as build arg to Dockerfile
- docker-compose.yml: remove DB port 5432 exposure (not needed on server,
  services communicate via Docker network)
2026-03-31 17:57:50 +02:00
Zaid Marzguioui
ebd0fd4638 feat: complete CMS v2 with Docker, Fischerei, Meetings, Verband modules + UX audit fixes
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m26s
Workflow / ⚫️ Test (push) Has been skipped
Major changes:
- Docker Compose: full Supabase stack (11 services) equivalent to supabase CLI
- Fischerei module: 16 DB tables, waters/species/stocking/catch books/competitions
- Sitzungsprotokolle module: meeting protocols, agenda items, task tracking
- Verbandsverwaltung module: federation management, member clubs, contacts, fees
- Per-account module activation via Modules page toggle
- Site Builder: live CMS data in Puck blocks (courses, events, membership registration)
- Public registration APIs: course signup, event registration, membership application
- Document generation: PDF member cards, Excel reports, HTML labels
- Landing page: real Com.BISS content (no filler text)
- UX audit fixes: AccountNotFound component, shared status badges, confirm dialog,
  pagination, duplicate heading removal, emoji→badge replacement, a11y fixes
- QA: healthcheck fix, API auth fix, enum mismatch fix, password required attribute
2026-03-31 16:35:46 +02:00
Zaid Marzguioui
1294caa7fa feat: MyEasyCMS v2 — Full SaaS rebuild
Some checks failed
Workflow / ⚫️ Test (push) Has been cancelled
Workflow / ʦ TypeScript (push) Has been cancelled
Complete rebuild of 22-year-old PHP CMS as modern SaaS:

Database (15 migrations, 42+ tables):
- Foundation: account_settings, audit_log, GDPR register, cms_files
- Module Engine: modules, fields, records, permissions, relations + RPC
- Members: 45+ field member profiles, departments, roles, honors, SEPA mandates
- Courses: courses, sessions, categories, instructors, locations, attendance
- Bookings: rooms, guests, bookings with availability
- Events: events, registrations, holiday passes
- Finance: SEPA batches/items (pain.008/001 XML), invoices
- Newsletter: campaigns, templates, recipients, subscriptions
- Site Builder: site_pages (Puck JSON), site_settings, cms_posts
- Portal Auth: member_portal_invitations, user linking

Feature Packages (9):
- @kit/module-builder — dynamic low-code CRUD engine
- @kit/member-management — 31 API methods, 21 actions, 8 components
- @kit/course-management, @kit/booking-management, @kit/event-management
- @kit/finance — SEPA XML generator + IBAN validator
- @kit/newsletter — campaigns + dispatch
- @kit/document-generator — PDF/Excel/Word
- @kit/site-builder — Puck visual editor, 15 blocks, public rendering

Pages (60+):
- Dashboard with real stats from all APIs
- Full CRUD for all 8 domains with react-hook-form + Zod
- Recharts statistics
- German i18n throughout
- Member portal with auth + invitation system
- Public club websites via Puck at /club/[slug]

Infrastructure:
- Dockerfile (multi-stage, standalone output)
- docker-compose.yml (Supabase self-hosted + Next.js)
- Kong API gateway config
- .env.production.example
2026-03-29 23:17:38 +02:00