A RESTful backend for tracking job applications. The project demonstrates practical junior .NET backend skills: secure authentication, user-owned data, filtering, pagination, status history, relational data modeling, automated tests, API documentation, and containerization.
- User registration and login with JWT bearer authentication
- Secure password hashing with ASP.NET Core Identity's
PasswordHasher - User-specific job application CRUD operations
- Application status workflow: Saved, Applied, Interview, Offer, Rejected, Withdrawn
- Status-change history for every application
- Search, filtering, sorting, and pagination
- Personal dashboard statistics
- Role-protected admin statistics endpoint
- SQLite persistence through Entity Framework Core
- Swagger/OpenAPI documentation with JWT support
- Health-check endpoint
- xUnit service tests
- Dockerfile and GitHub Actions build/test workflow
- .NET 10 / ASP.NET Core Web API
- C#
- Entity Framework Core 10
- SQLite
- JWT Bearer Authentication
- Swagger / OpenAPI
- xUnit
- Docker
- GitHub Actions
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register |
Register a user |
| POST | /api/auth/login |
Log in and receive a JWT |
| GET | /api/applications |
Search and paginate the current user's applications |
| GET | /api/applications/{id} |
Get one application |
| POST | /api/applications |
Create an application |
| PUT | /api/applications/{id} |
Update an application |
| PATCH | /api/applications/{id}/status |
Change status and save history |
| DELETE | /api/applications/{id} |
Delete an application |
| GET | /api/applications/{id}/history |
View status history |
| GET | /api/applications/stats |
View personal statistics |
| GET | /api/admin/stats |
View admin statistics |
| GET | /health |
Health check |
- .NET 10 SDK
dotnet restore
dotnet run --project src/JobTrack.ApiOpen the Swagger page shown in the terminal, usually:
http://localhost:5080/swagger
The SQLite database is created automatically on first run.
The included JWT key is for local development only. For a real deployment, replace it with an environment variable:
Jwt__Secret="a-long-random-secret-with-at-least-32-characters"An optional admin account can be created at startup by setting:
SeedAdmin__Email="admin@example.com"
SeedAdmin__Password="StrongPassword123!"Environment variable syntax differs by terminal and operating system.
dotnet testdocker build -t jobtrack-api .
docker run -p 8080:8080 \
-e Jwt__Secret="a-long-random-secret-with-at-least-32-characters" \
jobtrack-apiThen open:
http://localhost:8080/swagger
jobtrack-api-aspnet-core
This project is intentionally structured at a junior-friendly level. Before presenting it in an interview, be ready to explain JWT authentication, password hashing, dependency injection, EF Core relationships, ownership checks, pagination, and the tests.