Skip to main content

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 single shared/ directory holds the OpenAPI contract, configuration, and database schemas that all three clients depend on.
rakcha/
├── apps/
│   ├── desktop/              # JavaFX Desktop Application
│   │   ├── src/main/         # Source code organized by feature
│   │   ├── src/test/         # Unit and integration tests
│   │   ├── pom.xml           # Maven configuration
│   │   └── Dockerfile        # Container definition
│   │
│   ├── mobile/               # Flutter Mobile Application
│   │   ├── lib/              # Dart source code
│   │   ├── android/          # Android native code
│   │   ├── ios/              # iOS native code
│   │   ├── firebase/         # Firebase configuration
│   │   ├── pubspec.yaml      # Flutter dependencies
│   │   └── test/             # Flutter tests
│   │
│   └── web/                  # Symfony Web Application
│       ├── src/              # PHP source code
│       ├── public/           # Web-accessible files
│       ├── templates/        # Twig templates
│       ├── migrations/       # Database migrations
│       ├── composer.json     # PHP dependencies
│       ├── package.json      # JavaScript dependencies
│       ├── compose.yaml      # Docker Compose config
│       └── Dockerfile        # Container definition

├── shared/                   # Shared resources
│   ├── api-spec/            # OpenAPI specification
│   ├── config/              # Shared configuration
│   └── database/            # Database schemas and migrations

├── scripts/                  # Build and deployment scripts
├── Taskfile.yml             # Task automation
├── docker-compose.yaml      # Multi-container orchestration
└── README.md

Technology stack

LayerTechnologyVersion
Desktop clientJava, JavaFX, Maven21 LTS
Mobile clientFlutter, Dart, FirebaseLatest
Web clientSymfony, PHP, npm6.4 LTS
Backend APIRESTful API, Symfony6.4
DatabaseFirebase Firestore, MySQLLatest
AuthOAuth2, TOTP, JWTStandard
PaymentsStripe, PayPal APIsProduction
DevOpsDocker, Docker ComposeLatest
CI/CDGitHub 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 at shared/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 in apps/web/migrations/ and are applied with:
php bin/console doctrine:migrations:migrate --no-interaction
Firebase Firestore handles real-time data: live notifications, push events, seat availability updates, and activity feeds. The mobile app configures Firebase per-platform under 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 at GoogleController.php and MicrosoftController.php. Configured via GOOGLE_ID, GOOGLE_SECRET, MICROSOFT_LIVE_ID, MICROSOFT_LIVE_SECRET in .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, or cinema_manager).

Payment layer

Payment processing is handled by paymentStripeController.php in the web application. Two providers are supported:
ProviderEnvironment variables
StripeSTRIPE_KEY, STRIPE_SECRET_KEY
PayPalPAYPAL_CLIENT_ID, PAYPAL_SECRET_KEY, PAYPAL_CURRENCY
Both providers are configured in apps/web/.env. Use test-mode keys (pk_test_..., sk_test_...) during development.

API contract

The file shared/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:
EndpointDescription
GET /api/cinemasList all cinemas
GET /api/filmsList all films
GET /api/seriesList all series
GET /api/productsList all products
POST /api/users/authAuthenticate and receive a JWT
API clients for all three platforms can be regenerated from this spec using the api:generate task:
task api:generate
This runs 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:
DomainControllers
Cinema operationsCinemaController, SalleController, SeanceController, PlanningController
Film & series catalogFilmController, SeriesController, EpisodesController, ActorController, CategoriesController
E-commerceProduitController, CommandeController, CommandeitemController, PanierController, CategorieProduitController
User & authUsersController, LoginController, RegistrationController, SecurityController, ResetPasswordController, GoogleController, MicrosoftController
Reviews & socialAvisController, CommentaireController, CommentairecinemaController, CommentaireProduitController, RatingfilmController, FriendshipsController, FavorisController
PaymentspaymentStripeController
Content & discoveryListfilmsController, FilmcategoryController, FilmcomentController, SponsorController, FeedbackController

Build docs developers (and LLMs) love