Hayrettin DalAdminTR|EN
blog/Vaka Çalışması

B2B Support Desk: organization boundaries and transactional audit

I built a support desk around organization boundaries and ticket history, with public source evidence and a hosted application that requires a private account.

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.

Back to all projects

More writingView all writing