A full-stack web application for collecting, storing and presenting consultant assignment listings from multiple external sources. The project was developed during my internship at Rejlers as a way to centralize assignment data and make it easier to search, filter and review relevant consultant opportunities.
The application consists of a Spring Boot backend, a Vue frontend and a PostgreSQL database, all running together through Docker Compose.
The backend fetches assignment data from several sources using a combination of REST APIs, GraphQL endpoints, sitemap parsing and HTML parsing. The collected data is normalized and stored in a PostgreSQL database, then displayed in a searchable frontend interface.
-
Scrapes assignment listings from multiple external sources
-
Supports different scraping strategies:
- REST API integration
- GraphQL requests
- Sitemap parsing
- HTML parsing with Jsoup
-
Stores normalized assignment data in PostgreSQL
-
Frontend interface for browsing and filtering assignments
-
Keyword-based filtering
-
JWT-based authentication
-
Admin-only scraper trigger
-
Docker Compose setup for frontend, backend and database
- Java
- Spring Boot
- Spring Security
- Spring Data JPA
- PostgreSQL
- Jsoup
- Jackson
- JWT authentication
- Maven
- Vue 3
- Vite
- Tailwind CSS
- Axios
- Docker
- Docker Compose
- Nginx
Frontend (Vue + Nginx)
|
v
Backend (Spring Boot REST API)
|
v
PostgreSQL Database
^
|
External assignment sources
Make sure you have the following installed:
- Docker
- Docker Compose
Clone the repository:
git clone <repository-url>
cd <repository-folder>Start the application:
docker compose up --buildThe application will start three services:
- Frontend
- Backend
- PostgreSQL database
Frontend:
http://localhost:5173
Backend API:
http://localhost:6767
The application includes a simple JWT-based authentication system for demonstration purposes. To keep the project easy to run locally without additional configuration, it uses a simplified JWT authentication setup with predefined users and does not implement production-grade security practices.
Two predefined users are available for local testing:
- User
- Admin
The administrator account has permission to manually trigger scraper executions through the application.
.
├── backend/ # Spring Boot application
├── frontend/ # Vue application
├── docker-compose.yml
└── README.md
The application was built to handle several types of external data sources, including:
- JSON-based public APIs
- GraphQL endpoints
- Static HTML pages
- Sitemap-based page discovery
- JavaScript-hydrated pages where relevant data could be extracted from embedded page data
Each scraper maps external assignment data into a common internal project model.
This project gave me practical experience with:
- Building a full-stack application from scratch
- Designing a backend API with Spring Boot
- Working with PostgreSQL and JPA
- Containerizing a full-stack application with Docker Compose
- Handling inconsistent external data sources
- Implementing different scraping strategies depending on the structure of each website
- Structuring a frontend with Vue and reusable components
- Authentication and role-based access control with JWT
This project was developed as an internship project and is intended as a portfolio project. Some external sources may change their structure over time, which can affect scraper behavior.
Possible improvements include:
- More advanced error handling and retry logic
- Improved logging and monitoring
- More detailed project filtering
- Unit and integration tests
- CI/CD pipeline
- Deployment to a cloud environment