A secure, reliable and easy to configure job status tracker API.
This Spring Boot application helps users manage their job applications in an organized and efficient way, making it easy to retrieve and update entries quickly. It also includes social features, such as viewing trending companies that other users are applying to. The app uses a full authentication system based on JSON Web Tokens (JWT), integrated with Spring Security for secure access control. To improve performance, Redis is used to cache frequent database queries, and AWS S3 is used to store user-uploaded media files.
Follow these steps to configure and run the application for local development.
Ensure you have Maven installed. From the root of the project, run:
mvn installThis will install all required dependencies as specified in the pom.xml file.
Create a .env file in the root directory. Alternatively, set the following environment variables through your IDE or terminal:
DB_URI: URI of your PostgreSQL databaseDB_USERNAME: Your database usernameDB_PASSWORD: Your database passwordJWT_SECRET: A 256-bit hexadecimal secret for JWT generationS3_ACCESS_KEY: Your AWS S3 access keyS3_SECRET_KEY: Your AWS S3 secret keyS3_BUCKET_NAME: Name of your S3 bucket
⚠️ If you rename any of the above variables, update them accordingly in/src/main/resources/application.yml.
To run locally using Maven:
mvn spring-boot:runIf you prefer a containerized setup, ensure Docker is installed. From the root of the project, build the Docker image:
docker build -t tracker-app .Then run the Docker container:
docker run -p 5000:5000 tracker-appVerify the application is running correctly by sending a GET request to:
http://localhost:5000/api/v1/user
Expected response: "Hello World!"
These endpoints do not require authentication and bypass the security filter chain.
- Description: A basic test route.
- Response:
200 OK: Returns"Hello World!"
- Description: Register a new user.
- Request Body:
JSON object with user registration details (e.g., email, password). - Responses:
201 Created: Successfully registered.400 Bad Request: Email already exists (EmailAlreadyExistsException)
- Description: Authenticate an existing user.
- Request Body:
JSON object with login credentials. - Responses:
200 OK: Login successful.401 Unauthorized: Invalid credentials (IncorrectCredentialsException)
All secured endpoints require a valid Bearer token in the Authorization header.
- Description: Upload a profile picture.
- Request: Multipart file (max size: 1MB)
- Responses:
201 Created: Upload successful.500 Internal Server Error: Upload failure (IOException)
- Description: Retrieve user's profile picture.
- Responses:
200 OK: Image retrieved.500 Internal Server Error: Retrieval failure (IOException)
- Description: Create a new job application.
- Request Body:
JSON object representing anApplicationDto. - Response:
201 Created: Application created successfully.
- Description: Get paginated list of applications.
- Note: Uses Redis caching.
- Response:
200 OK: List of applications (can be empty)
- Description: Edit an existing application by ID.
- Request Body:
JSON object with updated application data. - Responses:
201 Created: Update successful.404 Not Found: Application not found (ApplicationNotFoundException)
- Description: Delete a specific application.
- Responses:
204 No Content: Deletion successful.404 Not Found: Application not found (ApplicationNotFoundException)
- Description: Retrieve applications where company name starts with provided string.
- Response:
200 OK: List of matching applications (can be empty)
- Description: Get recent applications with status
"Applied", by page. - Response:
200 OK: List of applications