022026

Overkill

job offer aggregator

An aggregator of job, internship and apprenticeship offers, built as a team: a Symfony API, a React front end and a PostgreSQL database. My part covers the offers and the favourites: controllers, validation DTOs, filtered search and pagination.

  • Controllers for the offers and the favourites
  • Validation DTOs for incoming data
  • Filtered search and pagination

The approach

The need

Overkill brings job, internship and apprenticeship offers together in one place.

My part

I took the offers and the favourites. The offers controller carries the routes of the domain: filtered reads, reads by identifier, creation and deletion.

Key decisions

The DTO is the boundary of the domain. The offers do not come from a form but from a collector, so nobody reviews what comes in: the title is required and bounded, the type can only take three values, the country is a two-letter code, and the coordinates must stay within their ranges. The JSON is validated before it reaches the database, never after.

How it runs

It is a team project: a Symfony API, a React front end and a PostgreSQL database, all running under Docker. We split the API by domain.

The search accepts criteria that can be combined (free text, city, company, contract, type, remote work, minimum salary, category), paginates them, and only returns offers published in the last thirty days, because an expired listing in an aggregator is worse than no result at all. The favourites controller keeps its own on the logged-in user.