Overview
Rakcha is a monorepo containing three client applications — a JavaFX desktop app, a Flutter mobile app, and a Symfony web app — all communicating with a shared Symfony REST API backend. A singleshared/ directory holds the OpenAPI contract, configuration, and database schemas that all three clients depend on.
Technology stack
| Layer | Technology | Version |
|---|---|---|
| Desktop client | Java, JavaFX, Maven | 21 LTS |
| Mobile client | Flutter, Dart, Firebase | Latest |
| Web client | Symfony, PHP, npm | 6.4 LTS |
| Backend API | RESTful API, Symfony | 6.4 |
| Database | Firebase Firestore, MySQL | Latest |
| Auth | OAuth2, TOTP, JWT | Standard |
| Payments | Stripe, PayPal APIs | Production |
| DevOps | Docker, Docker Compose | Latest |
| CI/CD | GitHub Actions | — |
Client applications
All three clients are independent applications that talk to the same Symfony REST API. They share no runtime code — the contract between them is the OpenAPI specification atshared/api-spec/openapi.yaml.
Desktop
Built with Java 21 and JavaFX, managed by Maven. Targets cinema operators and administrators who need a full-featured native experience. API clients are code-generated from the OpenAPI spec into
apps/desktop/src/generated.Mobile
Built with Flutter and Dart. Runs on Android and iOS. Firebase is configured per-platform under
apps/mobile/firebase/. API clients are generated into apps/mobile/lib/generated.Web
Built with Symfony 6.4 and PHP 8.2. Serves both the user-facing web UI (Twig templates) and the REST API consumed by the other clients. API clients for the web layer are generated into
apps/web/src/Generated.Data layer
Rakcha uses two datastores that serve different roles: MySQL via Doctrine ORM is the primary relational store. All entities — cinemas, films, series, products, users, orders, seating — are persisted here. Doctrine migrations live inapps/web/migrations/ and are applied with:
apps/mobile/firebase/.
Auth layer
Authentication is handled by the Symfony web application and covers three mechanisms:- OAuth2 — Google and Microsoft login via
knpuniversity/oauth2-client-bundle. Controllers atGoogleController.phpandMicrosoftController.php. Configured viaGOOGLE_ID,GOOGLE_SECRET,MICROSOFT_LIVE_ID,MICROSOFT_LIVE_SECRETin.env. - TOTP 2FA — Time-based one-time password for enhanced login security with trusted device management.
- JWT — Issued on successful authentication (
/api/users/auth) and sent as a Bearer token on subsequent API requests. The token payload includes the user’s role (client,admin, orcinema_manager).
Payment layer
Payment processing is handled bypaymentStripeController.php in the web application. Two providers are supported:
| Provider | Environment variables |
|---|---|
| Stripe | STRIPE_KEY, STRIPE_SECRET_KEY |
| PayPal | PAYPAL_CLIENT_ID, PAYPAL_SECRET_KEY, PAYPAL_CURRENCY |
apps/web/.env. Use test-mode keys (pk_test_..., sk_test_...) during development.
API contract
The fileshared/api-spec/openapi.yaml is the single source of truth for the REST API. It defines all endpoints, request/response schemas, and authentication requirements.
Current top-level resources defined in the spec:
| Endpoint | Description |
|---|---|
GET /api/cinemas | List all cinemas |
GET /api/films | List all films |
GET /api/series | List all series |
GET /api/products | List all products |
POST /api/users/auth | Authenticate and receive a JWT |
api:generate task:
openapi-generator-cli targeting Java (desktop), PHP (web), and Dart (mobile) output directories.
The full set of Symfony controllers —
FilmController, CinemaController, SeanceController, ProduitController, CommandeController, UsersController, and more — implement a broader surface than what is currently reflected in openapi.yaml. Contributions to expand the spec are welcome.Feature modules
The Symfony controller layer reflects the full set of platform features:| Domain | Controllers |
|---|---|
| Cinema operations | CinemaController, SalleController, SeanceController, PlanningController |
| Film & series catalog | FilmController, SeriesController, EpisodesController, ActorController, CategoriesController |
| E-commerce | ProduitController, CommandeController, CommandeitemController, PanierController, CategorieProduitController |
| User & auth | UsersController, LoginController, RegistrationController, SecurityController, ResetPasswordController, GoogleController, MicrosoftController |
| Reviews & social | AvisController, CommentaireController, CommentairecinemaController, CommentaireProduitController, RatingfilmController, FriendshipsController, FavorisController |
| Payments | paymentStripeController |
| Content & discovery | ListfilmsController, FilmcategoryController, FilmcomentController, SponsorController, FeedbackController |