The Problem

Organizers need a self‑hosted ticketing system that can be branded, integrated with Stripe, and run on their own infrastructure. Commercial SaaS solutions lock data and charge per‑ticket fees, forcing teams to trade control for convenience.

What This Does

Events delivers a full‑stack ticketing platform. The backend (Laravel + Express) lives under backend/ and implements the domain model, REST API, and Stripe integration. The frontend (React + Vite) in frontend/ provides a SPA for event creation, checkout, and admin dashboards. Docker orchestration (Dockerfile.all-in-one, docker/all-in-one/docker-compose.yml) lets you spin up the whole stack with a single command. Key entry files are:

  • backend/resources/js/app.js – compiles the admin UI assets.
  • frontend/src/App.tsx – root React component.
  • frontend/server.js – development server wrapper.

Configuration defaults are in backend/.env.example and docker/all-in-one/.env.example.

How It Is Wired

  1. Startup – docker compose -f docker/all-in-one/docker-compose.yml up builds the all‑in‑one image (Dockerfile.all-in-one). The image runs both PHP‑FPM (Laravel) and Node (Vite) processes.
  2. Request flow – An HTTP request hits the Nginx proxy (inside the image) and is routed to Laravel (backend/public/index.php). Laravel’s app/Http/Controllers resolve to service classes under app/Services/Domain. Business logic creates/updates domain objects such as OrderDomainObject.php or EventDomainObject.php.
  3. API layer – Laravel routes expose JSON endpoints consumed by the React SPA. The SPA’s data layer uses frontend/src/api/client.ts (the most‑connected module, imported by 19 other files) to call endpoints like /api/events.
  4. State handling – Responses are cached in Redux stores; UI components such as frontend/src/components/common/Modal/index.tsx (imported by 18 modules) render dialogs. Notification handling centralises through frontend/src/utilites/notifications.tsx (imported by 25 modules).
  5. External side‑effects – Stripe calls are wrapped in backend/app/DomainObjects/Enums/PaymentProviders.php and invoked from service classes. Webhooks are processed by Laravel listeners that push updates back to the SPA via Laravel Echo.

The import graph shows no circular dependencies and a clear hub in frontend/src/utilites/notifications.tsx, indicating that changes there have a wide blast radius. Deep nesting and duplicated code blocks (see measured findings) are concentrated in a few hook files (useFormErrorResponseHandler.tsx) and backend DTOs.

How To Use It

# 1. Clone
git clone https://github.com/moses-y/Events
cd Events

# 2. Prepare env files
cp backend/.env.example backend/.env
cp docker/all-in-one/.env.example docker/all-in-one/.env

# 3. Build and run (Docker)
docker compose -f docker/all-in-one/docker-compose.yml up -d

# 4. Install frontend deps (optional, for local dev)
cd frontend
yarn install
yarn dev   # runs Vite dev server on localhost:5173

Required variables are defined in the .env.example files (e.g., APP_KEY, DB_CONNECTION, STRIPE_SECRET). After the containers are healthy, the API is reachable at http://localhost/api and the UI at http://localhost.

Real‑World Use

A midsize conference organizer can deploy the stack on a private VPS, point APP_URL to their domain, configure Stripe Connect keys, and immediately gain a branded checkout page, QR‑code check‑in, and exportable attendee lists—all without third‑party fees. The REST API (/api/v1/events/{id}/tickets) can be called from a mobile app to display live inventory.

Code Health & Issues

  • Critical – Committed credentials in docker/development/.env; rotate and remove from Git.
  • Critical – Personal access token in .github/workflows/cla.yml; move to a workflow_run job or protected environment.
  • High – GitHub Actions use mutable tags; pin each action to a commit SHA.
  • High – Duplicate logic across multiple DTOs (EditOrderResultDTO.php, EditAttendeeResultDTO.php, etc.); extract shared helpers.
  • High – Hub module frontend/src/utilites/notifications.tsx imports 25 modules; keep stable, avoid volatile changes.
  • Medium – Deep nesting (max depth 7) in several hooks/components; refactor with early returns.
  • Medium – Base Docker images not pinned by digest; use @sha256 to lock CVE surface.

Additional observations: tests exist (76 files) and CI runs via GitHub Actions, but no dependency‑vulnerability scan is configured. A pre‑commit secret‑scan hook is absent despite the .env leak.

The Bottom Line

Events provides a complete, self‑hostable ticketing stack with a solid Laravel + React foundation and ready‑to‑run Docker image. The codebase is functional but suffers from secret leakage, unpinned CI actions, and some maintainability hotspots (deep nesting, duplicated DTOs). Teams comfortable managing Docker and Laravel can adopt it quickly; however, they should address the critical security findings before production deployment.