Backend API for a simple issue tracking system built with Spring Boot.
The project is focused on learning backend development in Java and Spring while building something close to a real product workflow: users can authenticate, create tickets, browse tickets, and filter them by status.
- Java
- Spring Boot
- Spring Web
- Spring Data JPA
- Spring Security
- PostgreSQL
- Docker Compose
- Lombok
The API allows authenticated users to work with tickets.
Current core flow:
- create a ticket
- get all tickets
- get a single ticket by id
- filter tickets by status
- get current authenticated user
Each ticket contains:
idtitledescriptionstatuscreatedAtowner
A ticket represents a single issue/task in the system.
Fields visible in the current model:
id: UUIDtitle: Stringdescription: Stringstatus: TicketStatuscreatedAt: Instantowner: UserEntity
Tickets use an enum status, for example:
OPEN
If you add more statuses later, good next options are:
IN_PROGRESSDONECLOSED
Adjust paths if your controller mappings are different in your local code.
GET /api/users/meReturns the currently authenticated user.
POST /api/ticketsExample request body:
{
"title": "Login page throws 500",
"description": "Error appears after submitting valid credentials."
}GET /api/ticketsGET /api/tickets/{id}GET /api/tickets/status?status={status}Example:
GET /api/tickets/status?stauts=OPEN{
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"title": "Login page throws 500",
"description": "Error appears after submitting valid credentials.",
"status": "OPEN",
"createdAt": "2026-04-06T12:00:00Z"
}git clone https://github.com/SculptTechProject/Issue-Tracker-api.git
cd Issue-Tracker-apiCreate your environment configuration if the project requires it.
Typical values for local development might look like this:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=issue_tracker
DB_USER=postgres
DB_PASSWORD=postgres
JWT_SECRET=change_meIf your project uses application.properties or application.yml, make sure PostgreSQL connection settings match your local database.
If you are using Docker Compose:
docker compose up -dIf you use Maven wrapper:
./mvnw spring-boot:runOr build and run:
./mvnw clean install
java -jar target/*.jar- clear business domain
- practical CRUD-style backend learning
- good base for authentication and authorization
- strong portfolio direction for Java backend roles
- add update ticket endpoint
- add delete ticket endpoint
- add pagination and sorting
- add validation with
@Valid - replace generic
RuntimeExceptionwith custom exceptions - add global exception handling
- add Swagger / OpenAPI documentation
- add roles such as
USERandADMIN - add tests for service and controller layers
- add ticket comments and attachments
Use your configured auth flow to log in and get access to protected endpoints.
Send POST /api/tickets with title and description.
Call GET /api/tickets.
Copy the id and call GET /api/tickets/{id}.
Call GET /api/tickets/status/OPEN.
This project is meant to be more than a tutorial CRUD app. The goal is to grow it into a cleaner, production-style backend with authentication, authorization, ticket lifecycle management, and better engineering practices.
Mateusz