A multi-tenant SaaS platform connecting bus passengers with transport companies.
Search routes. Buy tickets. Manage your fleet. All in one place.
- About the Project
- Key Features
- Tech Stack
- Architecture
- Getting Started
- Test Accounts
- Testing
- Localization
- Roadmap
- Contributing
- License
GoceTransportApp is a full-featured web platform built with ASP.NET Core MVC that solves two problems at once:
- π§³ For Passengers β An intuitive way to search bus routes, compare schedules, and purchase tickets online, no phone calls or guesswork needed.
- π’ For Transport Companies β A complete back-office system to manage fleets, drivers, routes, schedules, and ticket sales, all from a single organization dashboard.
The platform operates on a multi-tenant model: each transport company registers as an organization, manages its own resources independently, and is visible to all passengers browsing the platform. A tiered membership system (Free / Pro / Sponsor) controls how many organizations a user can operate and which premium features they can access.
| Feature | Description |
|---|---|
| π Route & Schedule Search | Find trips by origin city, destination, and date with advanced filtering and sorting |
| π« Ticket Purchase | Buy tickets with automatic seat capacity validation |
| π Personal Dashboard | View upcoming trips, travel history, and favorite companies at a glance |
| β Favorites | Follow your preferred transport companies for quick access |
| βοΈ Reviews & Ratings | Rate organizations after completing a trip (1β5 stars + comments) |
| π Real-Time Notifications | Instant toast alerts for live schedule status changes, new reviews, and ticket purchases via SignalR |
| π¬ Notification Inbox | Persistent bell icon in the navbar β unread badge, inbox dropdown, one-click mark-as-read |
| πΊοΈ Stop Navigation | View stop locations on an interactive Google Maps modal and get turn-by-turn navigation directions |
| π Dark Mode | Toggle between light and dark theme β preference is preserved across sessions |
| π Bilingual UI | Switch between π¬π§ English and π§π¬ Bulgarian with one click |
| Feature | Description |
|---|---|
| π Fleet Management | Register and manage vehicles with capacity tracking |
| π¨β |
Maintain your driver roster linked to your organization |
| πΊοΈ Route Builder | Create routes between cities with Google Maps coordinate picker for exact stop locations |
| π Schedule Generator | Set up recurring schedules with departure/arrival times and pricing |
| π‘ Live Status Broadcasting | Push real-time status updates (delays, cancellations) to all passengers viewing that schedule (Pro/Sponsor) |
| π Organization Dashboard | Real-time metrics β active routes, vehicles, drivers, and tickets sold |
| ποΈ Passenger Lists | View boarded passengers per schedule with boarding toggle |
| Feature | Description |
|---|---|
| π·οΈ Membership Tiers | Free (1 org), Pro (3 orgs), Sponsor (unlimited) β controls resource limits and premium feature access |
| π Premium Feature Gating | Backend nulls restricted data for Free users; frontend shows upgrade prompts β double-layer protection |
| π Role-Based Access | ASP.NET Identity with Admin, Organization Owner, and Passenger roles |
| π± Auto-Seeding | TestScenarioSeeder populates the database with realistic test data on first run |
| π§ Email Notifications | SendGrid integration for ticket confirmations and cancellations (pluggable β uses NullSender in dev) |
| π¬ Contact Form | Built-in contact form; admins receive a real-time SignalR alert on every new submission |
| π SEO | robots.txt, sitemap.xml, Open Graph & Twitter Card meta tags, per-page descriptions |
| π‘οΈ GDPR | Full privacy policy (data collected, legal basis, retention, subject rights) and Terms of Service page |
| Layer | Technology |
|---|---|
| Backend | C# / ASP.NET Core 8 MVC |
| Database | SQL Server + Entity Framework Core |
| Frontend | Bootstrap 5, HTML5, JavaScript |
| Authentication | ASP.NET Core Identity (Cookie-based) |
| Real-Time | ASP.NET Core SignalR |
| Maps | Google Maps JavaScript API (coordinate picker + interactive modal) |
| Object Mapping | AutoMapper (custom IMapFrom<T> / IMapTo<T> interfaces) |
SendGrid (with graceful fallback to NullMessageSender) |
|
| Resilience | Polly (retry + circuit breaker policies for HTTP clients) |
| E2E Testing | Playwright + NUnit |
| API Docs | Swagger / Swashbuckle (WebApi project) |
The solution follows an N-Tier architecture with clean separation of concerns across 16 projects:
GoceTransportApp/
βββ Web/
β βββ GoceTransportApp.Web # ASP.NET Core MVC (main entry point)
β βββ GoceTransportApp.Web.Infrastructure # Filters, extensions, middleware
β βββ GoceTransportApp.Web.ViewModels # View models & input models
βββ Services/
β βββ GoceTransportApp.Services # Business logic contracts
β βββ GoceTransportApp.Services.Data # Service implementations (EF queries)
β βββ GoceTransportApp.Services.Mapping # AutoMapper profiles & interfaces
β βββ GoceTransportApp.Services.Messaging # Email (SendGrid) + templates
βββ Data/
β βββ GoceTransportApp.Data # DbContext, migrations, seeders
β βββ GoceTransportApp.Data.Models # Entity models (EF Code-First)
β βββ GoceTransportApp.Data.Common # Base models, repositories
βββ Common/
β βββ GoceTransportApp.Common # Constants, enums, shared utilities
βββ API/
β βββ GoceTransportApp.WebApi # RESTful API with Swagger
βββ Tests/
βββ GoceTransportApp.Services.Data.Tests # Unit tests for services
βββ GoceTransportApp.Web.Tests # Unit tests for controllers
βββ GoceTransportApp.E2ETests # Playwright E2E browser tests
βββ Sandbox # Experimental / scratch project
| Tool | Version | Download |
|---|---|---|
| .NET SDK | 8.0+ | dotnet.microsoft.com |
| SQL Server | 2019+ (or LocalDB) | SQL Server Downloads |
| Node.js | 18+ (only for E2E tests) | nodejs.org |
git clone https://github.com/DimitarTashkov/GoceTransportApp.git
cd GoceTransportAppOpen Web/GoceTransportApp.Web/appsettings.json and update the connection string to match your local SQL Server instance:
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=GoceTransportApp;Trusted_Connection=True;TrustServerCertificate=True;"
}To enable the interactive stop location picker and map modal, add your key to appsettings.json:
"GoogleMaps": {
"ApiKey": "YOUR_API_KEY_HERE"
}Without a key the map sections are hidden for Free-tier users. Pro/Sponsor users will see a placeholder until a valid key is provided.
Using the Package Manager Console (Visual Studio):
Update-Database
Or via CLI:
dotnet ef database update --project Web/GoceTransportApp.Webπ‘ Auto-Seeding: On the first run, the
TestScenarioSeederautomatically populates the database with 3 transport companies, 3 cities (Sofia, Plovdiv, Varna), routes, vehicles, drivers, schedules, and a sample ticket β so you can explore the app immediately without manual data entry.
cd Web/GoceTransportApp.Web
dotnet runThe app will start at https://localhost:5001 (or the port shown in your terminal).
The TestScenarioSeeder creates the following accounts (password for all: Test1234!):
| Role | Description | |
|---|---|---|
org1@test.com |
Organization Owner | Owns Express Lines (Sofia β Plovdiv) |
org2@test.com |
Organization Owner | Owns Global Trans (Plovdiv β Varna) |
org3@test.com |
Organization Owner | Owns Eco Travel (Varna β Sofia) |
passenger@test.com |
Passenger | Has a ticket on the Express Lines route |
Each organization comes pre-loaded with 1 vehicle (Mercedes Travego, 50 seats), 1 driver, 1 route, and 1 schedule departing 7 days from the seed date.
The project includes end-to-end browser tests covering organization CRUD, vehicle/route/schedule creation, ticket checkout, and more.
# Install Playwright browsers (first time only)
pwsh Tests/GoceTransportApp.E2ETests/bin/Debug/net10.0/playwright.ps1 install
# Run E2E tests
dotnet test Tests/GoceTransportApp.E2ETestsdotnet test Tests/GoceTransportApp.Services.Data.Tests
dotnet test Tests/GoceTransportApp.Web.TestsTest Coverage:
- β Organization CRUD + validation
- β Vehicle, Route, and Schedule creation
- β Ticket purchase and passenger management
- β Login and authentication flows
The entire UI is available in English (en-US) and Bulgarian (bg-BG), covering 55+ view files with matching .resx resource files.
- Toggle language via the π¬π§ / π§π¬ flag dropdown in the navigation bar
- Language preference is saved in a cookie (persists for 1 year)
- Default language: English
Localized areas: Navigation, Home/Landing page, Organizations, Schedules, Tickets, Routes, Vehicles, Drivers, Cities, Contact Form, Login/Register, Dashboards, Notifications, and more.
Contributions are welcome! If you'd like to help improve GoceTransportApp:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please make sure your code compiles (
dotnet build) and existing tests pass before submitting.
Made with β€οΈ in Bulgaria
Built with ASP.NET Core 8 β’ Entity Framework Core β’ Bootstrap 5 β’ SignalR