A backend application built as part of the HackYourFuture Mid Backend Track, implementing a complete ticket tracking system with:
- User management
- Project management
- Ticket creation & updates
- Ticket assignment
- Email notifications
- Validation & error handling
- Secure environment configuration
- Controller & service layer testing
- The project follows clean architecture principles and uses Spring Boot 4, Java 25, PostgreSQL, and dotenv for secure configuration.
Code
┌────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Controller │ --> │ Request DTO │ --> │ Service │ --> │ Repository │ --> DB
└────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
↑ ↓
└────────────── Response DTO ────────────────┘
- Controller Layer — REST endpoints
- Service Layer — business logic, validation, email notifications
- Repository Layer — JDBC queries using
JdbcTemplate - Database Layer — PostgreSQL schema
The system uses four tables:
usersprojectsticketsticket_assignees(many‑to‑many)
Relationships:
- One project → many tickets
- Many users ↔ many tickets
Based on your real folder structure:
Code
src/main/java/net/hackyourfuture/tickettrackingsystem
│
├── controller
│ ├── ProjectController
│ ├── TicketController
│ └── UserController
│
├── dto
│ ├── project
│ │ ├── ProjectRequest
│ │ └── ProjectResponse
│ ├── ticket
│ │ ├── TicketRequest
│ │ └── TicketResponse
│ └── user
│
├── exception
│ ├── ErrorResponse
│ ├── GlobalExceptionHandler
│ ├── NotFoundException
│ └── ValidationException
│
├── model
│ ├── Project
│ ├── Ticket
│ ├── TicketAssignee
│ └── User
│
├── repository
│ ├── ProjectRepository
│ ├── TicketAssigneeRepository
│ ├── TicketRepository
│ └── UserRepository
│
├── service
│ ├── EmailNotificationService
│ ├── ProjectService
│ ├── TicketService
│ ├── UserService
│ └── TicketTrackingSystemApplication
│
└── resources
├── db/TrackTicket_schema.sql
└── application.properties
You mentioned:
Tests are only made for controller and service
Your test folder:
Code
src/test/java/net/hackyourfuture/tickettrackingsystem
│
├── controller
│ ├── ProjectControllerTest
│ ├── TicketControllerTest
│ └── UserControllerTest
│
├── service
│ ├── ProjectServiceTest
│ ├── TicketServiceTest
│ └── UserServiceTest
✔ Uses MockMvc for controller tests ✔ Uses Mockito for service tests ✔ Matches HYF expectations for mid‑backend level
Inside TicketTrackingSystemApplication:
java
Dotenv dotenv = Dotenv.load();
System.setProperty("DB_URL", dotenv.get("DB_URL"));
System.setProperty("DB_USERNAME", dotenv.get("DB_USERNAME"));
System.setProperty("DB_PASSWORD", dotenv.get("DB_PASSWORD"));
System.setProperty("EMAIL_API_KEY", dotenv.get("EMAIL_API_KEY"));
System.setProperty("EMAIL_FROM", dotenv.get("EMAIL_FROM"));
✔ No secrets printed ✔ No secrets committed ✔ Works in CI/CD
Code
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver
Code
mvn clean install
Code
docker run --name postgres -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres
Code
mvn spring-boot:run
Your API is fully documented in API_DESIGN.md. Here is the summary:
- GET /users
- GET /users/{id}
- POST /users
- PUT /users/{id}
- DELETE /users/{id}
- GET /projects
- POST /tickets
- GET /tickets
- GET /tickets/{id}
- PUT /tickets/{id}
- POST /tickets/{ticketId}/assignees
- DELETE /tickets/{ticketId}/assignees/{userId}
Emails are sent when:
- A ticket is updated
- A user is assigned
Emails include:
- Ticket ID
- Title
- Description
- Status
If sending fails:
- Ticket update still succeeds
- Error is logged
GitHub Actions pipeline includes: Java 25 Maven build Tests Cache optimization
Triggers:
push → main
pull_request → main
- Write clean, readable code
- Follow naming conventions
- Keep controllers thin
- Put logic in services
- Validate all inputs
- Add tests for new features
- Use meaningful commit messages