REST API · DDD + CQRS · Async

Publikuj oferty.
Gotowe w 2 godziny.

Produkcyjne API do publikowania ofert pracy IT. Asynchroniczne kolejki, autoryzacja Bearer i rate limiting. Zero zbędnych konfiguracji, pełna kontrola.

Dokumentacja API Utwórz konto
POST /api/v1/jobs
$ curl -X POST https://api.2hr.pl/api/v1/jobs \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"title":"Senior PHP Dev","location":"Remote","snippet":"Szukamy doswiadczonego dewelopera","link":"https://example.com/apply","salary":{"type":"monthly","min":15000,"max":20000,"currency":"PLN"}}'
# Odpowiedz 202 Accepted
{ "message": "Job creation queued", "status": "pending" }
$ Worker przetwarza → status=published
10/min
Limit zapytań
<50ms
Avg. odpowiedź
202
Async tworzenie
Hashed
Przechowywanie tokenów

Dokumentacja API

Wszystkie endpointy

Każde zapytanie wymaga nagłówka Bearer token, chyba że oznaczono jako Publiczny.

GET
/api/v1/jobs
Lista Twoich opublikowanych ofert pracy, maks. 20, sortowane po dacie aktualizacji.
sync auth
POST
/api/v1/jobs
Utwórz ofertę pracy. Trafia do kolejki Redis - odpowiedź 202 natychmiast.
async auth
PUT
/api/v1/jobs/{uuid}
Edytuj tytul, lokalizacje, wynagrodzenie, link lub opis. Tylko wlasciciel.
sync auth
PUT
/api/v1/jobs/{uuid}/status
Zmien status oferty na ended lub published.
sync auth
GET
/api/v1/companies
Lista Twoich profili firmowych.
sync auth
POST
/api/v1/companies
Utworz profil firmy powiazany z Twoim kontem.
sync auth
PUT
/api/v1/companies/{uuid}
Zaktualizuj dane firmy. Tylko wlasciciel.
sync auth
POST
/api/register
Zarejestruj nowe konto (indywidualne lub firmowe). Limit IP.
publiczny

Wbudowane funkcje

Wszystko, czego potrzebujesz

Gotowe funkcje produkcyjne bez zadnej konfiguracji.

🔑
Autoryzacja Bearer Token
Tokeny przechowywane jako bezpieczne skroty. Zadnych plaintext sekretow w bazie danych.
Asynchroniczna kolejka
POST /jobs trafia do kolejki asynchronicznej. Worker przetwarza w tle - klient dostaje 202 natychmiast.
🛡️
Rate Limiting
10 zapytan na minute na token, przechowywane w Redis. Zwraca 429 z naglowkiem retry_after.
Moderacja ogloszen
Niezweryfikowani uzytkownicy dostaja status requires_review. Admin zatwierdza przed publikacja.
🏗️
DDD + CQRS
Czysty model domenowy, separacja komend i zapytan, wzorzec repozytorium. Doctrine ORM tylko do persystencji.
🚫
Ochrona przed spamem
Niezweryfikowane konta maks. 3 oferty dziennie. Blokada domen (.ru, .cn, .tk) w polu link.

Jak dziala tworzenie oferty

Non-blocking z zalozenia. Odpowiedz HTTP jest natychmiastowa, a przetwarzanie odbywa sie w tle.

1
POST /api/v1/jobs
Kontroler waliduje zapytanie i zapisuje rekord Job ze statusem pending.
2
Dispatch do Redis
CreateJobCommand trafia przez Symfony Messenger do transportu async.
3
HTTP 202 Accepted
Klient od razu dostaje odpowiedz. Bez czekania na przetwarzanie.
4
Worker przetwarza
messenger:consume async odbiera wiadomosc i uruchamia CreateJobHandler.
5
Status zaktualizowany
Zweryfikowany uzytkownik → published. Niezweryfikowany → requires_review.
Przyklad uzycia PHP
// 1. Utworz oferte pracy $response = Http::withToken($token) ->post('https://api.2hr.pl/api/v1/jobs', [ 'title' => 'Senior PHP Developer', 'location' => 'Zdalnie', 'snippet' => 'Szukamy doswiadczonego PHP...', 'link' => 'https://example.com/aplikuj', 'type' => 'full-time', 'salary' => [ 'type' => 'monthly', 'min' => 15000, 'max' => 20000, 'currency' => 'PLN', ], ]); // 2. Zwraca 202 natychmiast // $response->status() === 202   // 3. Pobierz opublikowane oferty $oferty = Http::withToken($token) ->get('https://api.2hr.pl/api/v1/jobs') ->json('data');   // 4. Zakoncz oferte Http::withToken($token) ->put("https://api.2hr.pl/api/v1/jobs/{$id}/status", [ 'status' => 'ended', ]);