A full-stack ticket management system built to handle issue tracking, role-based workflows,and organization tenet system
This project focuses on scalable backend architecture, clean separation of concerns, and efficient data handling.
- Role-based access control (Admin, Agent, User)
- Ticket lifecycle management (Open → In Progress → Resolved → Closed)
- Comment system for ticket discussions
- email provider integration
- Structured API with validation and error handling
- Multi-tenant Organization support
- Backend: Express + TypeScript
- Frontend: React , zustand, tailiwndcss
- Database: PostgreSQL with Prisma
- Architecture: modular stricture
The system follows a layered architecture:
- Controllers handle request/response
- Services contain business logic
- Prisma manages database access
This separation allows better scalability and maintainability.
Detailed architecture: Architecture docs
Business logic is separated from controllers to keep routes clean and reusable.
Used for type safety and faster development, reducing runtime query errors.
Middleware-based role checks ensure secure access control across endpoints.
-
Did not implement microservices to keep deployment simple
-
Did not add real time webhook notification
-
Limited caching to reduce system complexity
-
Focused on backend strength over UI polish
-
authentication is manual (auth + refresh token)
-
email servers is integrated inside app
See: API docs
See database docs
Ticket management
Use this method to spin up the entire stack (Frontend, Backend, and Database) in a containerized environment.
-
Configure Environment:
cp .env.example .env
-
*Launch Containers: Note: This command initializes three orchestrated containers. Once healthy, the application is accessible at
http://localhost(Port 80).
Use this method if you want to make active code changes with Hot Module Replacement (HMR).
-
Environment: Create a
.envfile in the/backenddirectory using.env.exampleas a template. -
Dependencies: Run
pnpm installin the root or backend folder. -
Database: Ensure you have a local PostgreSQL server running.
-
Prisma Initialization:
pnpm run generate # Generates Prisma Client pnpm run migrate # Syncs database schema
-
Create a dev role for runtime , it support row level security
pnpm run db:setup
Run the following command from the root directory:
pnpm run devDefault Port Mapping:
- Backend: Runs on port
3000(unless specified otherwise in.env).- Frontend: Launches on port
5173(or your configured Vite/Next.js port).- Database: Default PostgreSQL connection usually occupies port
5432.
This project is licensed under the MIT License.


