A desktop ticketing system for managing basketball tournament tickets.
The application provides authentication, ticket sales, search, and logout features.
It utilizes JavaFX for the client, gRPC for communication, CompletableFuture for asynchronous backend operations, and adheres to the Observer pattern with Proxy to broadcast live updates to all connected clients.
-
Login
- Cashier authenticates with username & password (stored as BCrypt hashes).
- On success, a window opens showing all matches (Team A vs Team B, Semifinals, Final), ticket price, and available seats.
-
Ticket Sale
- Sell tickets for a match by entering the customer's name, address, and number of seats.
- All other clients immediately see updated availability (Observer pattern).
- If no seats remain, the match is marked SOLD OUT in red.
-
Search
- Search tickets purchased by a client using name and/or address.
- If multiple clients share the same name, all their tickets are shown.
- Results display customer name, address, match, and number of seats.
-
Logout
- Ends the session and disconnects the user from the system.
- Java 17+
- JavaFX (desktop UI)
- gRPC + Protocol Buffers
- SQLite + JDBC
- BCrypt (password hashing)
- CompletableFuture (async backend)
- Observer & Proxy design patterns
Passwords are never stored in plain text (only BCrypt hashes).
Password hashes are not returned in gRPC responses.
Sessions tracked to prevent duplicate logins.
![]() Login |
![]() Matches List |
![]() Search |
![]() Ticket Sale |



