mirror of
https://github.com/Dvorinka/Bookra.git
synced 2026-06-03 20:13:00 +00:00
164a37e997
This commit performs a major architectural refactor by migrating the standalone `auth-service` into the main `backend` application, enabling a unified codebase and simplified deployment. It also introduces comprehensive Stripe billing support and a new administrative dashboard.
Key changes:
- **Architecture**: Deleted `apps/auth-service` and integrated its functionality (JWT, magic links, OAuth, user management) into `apps/backend`.
- **Billing**: Added Stripe integration to `backend`, supporting both monthly and yearly subscription cycles with automatic plan entitlement enforcement (e.g., location limits).
- **Admin Dashboard**: Implemented a new administrative service and API endpoints to manage tenants, users, and view platform-wide statistics.
- **Frontend**:
- Added a new pricing page with monthly/yearly toggle and comparison table.
- Integrated Stripe and Sentry for payments and error tracking.
- Improved dashboard UX/UI and added i18n support for new features.
- Enhanced the public booking flow with better validation and contact form integration.
- **Database**: Added migrations for users, magic links, password resets, OAuth states, admin audit logs, and refresh tokens.
- **DevOps**: Updated environment configurations for Railway and Vercel, and streamlined the project's `package.json` scripts.
Bookra Backend
Go + Gin API for Bookra, designed for Railway deployment with Neon Auth, Neon Postgres, and Paddle billing.
Commands
go run ./cmd/api
go build ./...
npm run db:generate
npm run db:migrate:status
npm run db:migrate:up
Environment
BOOKRA_FRONTEND_URLallowed browser originBOOKRA_DATABASE_URLNeon pooled connectionBOOKRA_DATABASE_DIRECT_URLNeon direct connection for migrations/admin tasksBOOKRA_NEON_AUTH_URLNeon Auth base URL used for JWKS verificationBOOKRA_AUTH_JWT_SECREToptional local JWT fallback when not using Neon AuthBOOKRA_JOB_RUNNER_KEYshared secret for remote reminder dispatch callsBOOKRA_EMAIL_FROMsender identity for email remindersBOOKRA_PADDLE_ENVbilling environment:sandboxorliveBOOKRA_PADDLE_API_KEYPaddle API keyBOOKRA_PADDLE_WEBHOOK_SECRETPaddle notification destination secretBOOKRA_PADDLE_{STARTER,PRO,BUSINESS}_{CZK,USD}_PRICE_IDPaddle price IDsBOOKRA_UMAMI_API_URLandBOOKRA_UMAMI_API_KEYoptional analytics integration
Notes
- Auth verification is isolated in
internal/auth. - OpenAPI lives in
openapi/bookra.openapi.yaml. - SQL migrations live in
migrations/. sqlc.yamlis wired throughnpm run db:generate.- Goose migrations are wired through
npm run db:migrate:*and use the Neon direct connection URL. - Reminder dispatch now runs through
POST /v1/internal/jobs/reminders/dispatchwithX-Bookra-Job-Key.
Production Auth
Bookra production auth should use Neon Auth directly:
- frontend uses
VITE_NEON_AUTH_URL - backend verifies Neon JWTs with
BOOKRA_NEON_AUTH_URL - auth-service may stay deployed for standalone auth/admin workflows, but backend billing and app APIs do not depend on it
Trusted redirect domains in Neon Auth should include your frontend origin such as https://bookra.eu, plus local dev origins when needed.
Paddle Setup
Get these values from Paddle dashboard:
BOOKRA_PADDLE_ENV:sandboxfor testing,livefor productionBOOKRA_PADDLE_API_KEY: Developer tools -> AuthenticationBOOKRA_PADDLE_WEBHOOK_SECRET: Notification settings -> destination secret keyBOOKRA_PADDLE_*_PRICE_ID: Catalog -> each SaaS plan recurring price ID
Create one recurring price per plan/currency you support:
starterczkstarterusdproczkprousdbusinessczkbusinessusd
Set your webhook destination to:
POST /v1/webhooks/paddle
POST /api/paddle_webhook
Use Paddle webhook simulator for event testing.