Problem
The application needed to manage support tickets for multiple organizations while preventing access across organization boundaries. Customers should share their organization's queue, while staff-only notes must remain outside the customer view.
My contribution
I built ticket creation, assignment, status transitions, comments and internal notes with Java 21, Spring Boot, React and TypeScript. I implemented organization-scoped authorization in the API and added PostgreSQL/Testcontainers integration tests, GitHub Actions checks, and deployment and recovery documentation.
Architecture
This diagram outlines the data flow on a single host.
React / TypeScript
→ HTTPS / Nginx
→ Spring Boot API
→ Organization + role checks
→ PostgreSQL
├─ Ticket change
└─ Audit / history entry
(same transaction)
Flyway → schema migrations
Testcontainers → PostgreSQL integration tests
One decision and its tradeoff
I kept ticket changes and audit entries in the same transaction: if the audit write fails, the main change rolls back too. This prevents unrecorded changes, at the cost of blocking a user action when audit storage fails. Optimistic locking returns HTTP 409 for conflicting updates.
Evidence
The public repository contains source, sample screens and setup instructions. The verification report dated records 24 backend and 9 frontend tests as historical evidence and links to the successful CI run for that release. These are not results from a new test run today.
The hosted application requires a private account. Reviewers can use the public source and actual screenshots linked from the README.
Limitations
This is a single-host MVP for small teams. SSO, SLA automation, file uploads and high availability are not implemented. Customers share all tickets within their organization; there is no private per-requester inbox. Full comment and history pagination remains follow-up work.