API erreferentzia
Endpoint guztien base URL-a: /api/* (backend-js, 3001 portua garapenean).
Autentikatutako endpoint guztiek Authorization: Bearer <access_token> goiburua behar dute, kontrakoa adierazten ez bada. Erroreek beti { "error": "message string" } itzultzen dute.
[!NOTE] Request eta response formak DTO iturrietatik, repository motetatik eta frontend bezeroaren motetatik egiaztatu dira. Paginazio default-ak eta admin-only endpoint-en response-ak Needs verification gisa markatuta daude frontend bezeroek estaltzen ez dituztenean.
Error response formatua
Endpoint guztiek errore egituratuak itzultzen dituzte:
{ "error": "Human-readable error message" }Erabilitako HTTP kodeak: 400 (balidazioa), 401 (autentikatu gabe), 403 (rol debekatua), 404 (ez aurkitua), 409 (gatazka), 500 (zerbitzari errorea).
Auth endpoint-ak
POST /api/auth/login
Publikoa. Erabiltzailea autentikatzen du, access token-a ematen du eta refresh token cookiea ezartzen du.
Request body
{ "email": "user@example.com", "password": "secret" }Response 200
{
"user": {
"id": 1,
"name": "Maria Garcia",
"email": "user@example.com",
"role": "distributor",
"is_active": true
},
"access_token": "<JWT>"
}Set-Cookie: refresh_token=...; HttpOnly; SameSite=Lax ezartzen du (dev) / SameSite=None; Secure (prod).
POST /api/auth/refresh
Refresh token cookiea erabiltzen du. Token-a biratzen du eta access token berria ematen du.
Request: body-rik gabe, cookiea automatikoki bidaltzen da.
Response 200
{ "access_token": "<new JWT>" }refresh_token cookie berria ezartzen du. Token zaharra ezeztatzen da.
POST /api/auth/logout
Uneko refresh token-a ezeztatzen du eta cookiea garbitzen du.
Request: body-rik gabe.
Response 200
{ "message": "Logged out" }GET /api/auth/me
Autentikatutako erabiltzailearen profila itzultzen du. Bearer token-a behar du.
Response 200
{
"id": 1,
"name": "Maria Garcia",
"email": "user@example.com",
"role": "distributor",
"is_active": true,
"created_at": "2025-01-15T10:30:00.000Z"
}POST /api/auth/forgotPassword
Publikoa. Password reset emaila bidaltzen du. Beti arrakasta itzultzen du email enumerazioa saihesteko.
Request body
{ "email": "user@example.com" }Response 200
{ "message": "If that email is registered, a reset link has been sent." }PATCH /api/auth/changePwd
Token bidezko endpoint publikoa. Bi modu ditu body edukiaren arabera.
1. modua - token-a bakarrik egiaztatu (new_password gabe):
{ "reset_pwd_token": "<token>" }Response 200: { "valid": true }
2. modua - password berria ezarri:
{ "reset_pwd_token": "<token>", "new_password": "newSecret123" }Response 200: { "message": "Password changed successfully" }
new_password gutxienez 6 karakterekoa izan behar da. Token-a erabileraren ondoren ezeztatzen da.
POST /api/auth/activateAccount
Token bidezkoa. Sortu berri den kontua aktibatzen du eta bere password-a ezartzen du.
Request: ?token=<activate_account_token> (query param) - Needs verification body eta query param banaketa zehatzari buruz.
User endpoint-ak (admin bakarrik)
Talde honetako endpoint guztiek role: admin behar dute.
POST /api/users/create
Erabiltzaile berria sortzen du eta aktibazio emaila bidaltzen du.
Request body
{ "name": "Jon Doe", "email": "jon@example.com", "role": "distributor" }role "admin" edo "distributor" izan behar da. Erabiltzailea inaktibo sortzen da; aktibazio emaila emandako emailera bidaltzen da.
Response 201 - Needs verification forma zehatzerako; sortutako user objektua espero da.
GET /api/users/list
Query params
| Param | Mota | Default | Deskribapena |
|---|---|---|---|
page | number | 1 | Orrialde zenbakia |
limit | number | 20 | Gehienez 100 |
role | "admin" | "distributor" | - | Rolaren arabera filtratu |
is_active | "true" | "false" | - | Egoera aktiboaren arabera filtratu |
Response 200 - Needs verification paginazio envelope-aren forma zehatzerako.
GET /api/users/getById?id=<number>
Response 200 - user objektua. 404 aurkitzen ez bada.
PATCH /api/users/update
Request body - Needs verification onartutako field-etarako; espero dena { name?, email?, role?, is_active? }.
DELETE /api/users/remove?id=<number>
Erabiltzailea ezabatzen du. Erabiltzaile batek ezin du bere burua ezabatu.
Response 200 edo 403 bere burua ezabatzen saiatuz gero.
PATCH /api/users/changeMyPwd
Autentikatutako edozein rol. Norberaren password-a aldatzen du.
Request body
{ "current_password": "oldSecret", "new_password": "newSecret123" }Response 200
{ "message": "Password updated successfully" }Package endpoint-ak
POST /api/packages/create - admin
Paketea sortzen du, helbidea geokodetzen du, tracking token-a sortzen du eta tracking emaila bidaltzen du.
Request body
{
"packageInfo": {
"recipient_name": "Ane Etxeberria",
"recipient_email": "ane@example.com",
"assigned_to": null,
"created_by": 1,
"status": "pending",
"weight_kg": 2.5,
"description": "Fragile"
},
"address_info": {
"street": "Kale Nagusia 12",
"city": "Tolosa",
"postal_code": "20400"
}
}assigned_to null (esleitu gabe) edo user ID baliozko bat izan daiteke. description aukerakoa da.
Response 201 - Needs verification paketearen forma zehatzerako.
GET /api/packages/list - admin
Query params - Needs verification filtro multzo osoa eta paginazio envelope-a egiaztatzeko.
GET /api/packages/getById?id=<number> - admin
Response 200 - PackageWithAddress:
{
"id": 42,
"tracking_code": "PAK-20260001",
"recipient_name": "Ane Etxeberria",
"recipient_email": "ane@example.com",
"weight_kg": 2.5,
"description": "Fragile",
"status": "pending",
"estimated_delivery": "2026-05-01",
"address_id": 7,
"assigned_to": null,
"created_by": 1,
"created_at": "2026-04-26T10:00:00.000Z",
"updated_at": "2026-04-26T10:00:00.000Z",
"street": "Kale Nagusia 12",
"city": "Tolosa",
"postal_code": "20400",
"latitude": 43.1298,
"longitude": -2.0773,
"country": "Espana"
}GET /api/packages/getMyPackages - distributor
Autentikatutako banatzaileari esleitutako pakete guztiak itzultzen ditu.
Response 200 - PackageWithAddress array-a.
PATCH /api/packages/updateStatus - distributor
Pakete baten edo batzuen egoera eguneratzen du. package_id edo package_ids bakarrik eman behar da, ez biak.
Request body (banakakoa)
{ "package_id": 42, "new_status": "in_transit" }Request body (batch)
{ "package_ids": [42, 43, 44], "new_status": "delivered" }new_status pakete egoera baliozkoa izan behar da: "pending" | "assigned" | "in_transit" | "delivered" | "undelivered" | "failed".
Response 200 - PackageWithAddress bakarra (banakako update-a) edo PackageWithAddress[] (batch).
Egoera log txertaketa eta email albo-efektuak eragiten ditu (ikusi Domeinu eredua).
PATCH /api/packages/update?id=<number> - admin
Pakete informazioa eta helbidea eguneratzen ditu. Needs verification onartutako field-etarako.
DELETE /api/packages/delete?id=<number> - admin
Response 200 - Needs verification.
GET /api/packages/getDailySummary - admin
Gaurko pakete kopurua egoeraka itzultzen du.
Response 200 - Needs verification forma zehatzerako; espero dena { pending: n, assigned: n, ... }.
Routes eta stops endpoint-ak
POST /api/routes/create - admin
Banatzaile baterako entrega ruta optimizatua sortzen du data batean.
Request body
{ "user_id": 3, "date": "2026-05-02", "package_ids": [10, 11, 12] }dateYYYY-MM-DDformatuan egon behar da eta gutxienez biharkoa izan behar da.package_idsez da hutsik egon behar, ez du bikoizturik izan behar, eta ID guztiak baliozko package ID-ak izan behar dira.
Response 200 - Needs verification ruta+stops envelope-aren forma zehatzerako.
GET /api/routes/getByUserAndDate - admin
Query params: user_id, date - Needs verification.
GET /api/routes/getMyDaily - distributor
Autentikatutako banatzailearen gaurko ruta eta stops itzultzen ditu.
Response 200
{
"route": { "id": 5, "route_date": "2026-04-26", "status": "in_progress" },
"stops": [
{
"id": 21,
"stop_order": 1,
"estimated_arrival": "09:30:00",
"actual_arrival": "09:28:00",
"package": {
"id": 42,
"recipient_name": "Ane Etxeberria",
"status": "delivered",
"address": {
"street": "Kale Nagusia 12",
"city": "Tolosa",
"lat": 43.1298,
"lng": -2.0773
}
}
}
]
}PATCH /api/routes/updateStatus/:id - admin edo distributor (mugatua)
Request body
{ "status": "in_progress" }status "in_progress" edo "completed" izan behar da.
Response 200
{ "message": "Route status updated" }GET /api/routes/continueFromPast - distributor
Banatzaileak aurreko ruta batean stop pendienteak dituen egiaztatzen du.
Response 200
{
"pending": {
"route_id": 3,
"route_date": "2026-04-25",
"status": "in_progress",
"pending_count": 2,
"route_count": 5
}
}pending null da aurreko ruta pendienterik ez badago.
POST /api/routes/continueFromPast - distributor
Aurreko ruta pendiente bateko stop pendienteak gaurko rutara migratzen ditu.
Request: body-rik gabe.
Response 200
{
"route_id": 6,
"new_route_date": "2026-04-26",
"migrated_stops": 2
}PATCH /api/stops/reorder - admin
Ruta barruko stop-ak berrordenatzen ditu. Needs verification body formari buruz.
PATCH /api/stops/updateArrival - distributor
Stop batera iristeko benetako ordua erregistratzen du.
Request body
{ "stop_id": 21 }Response 200
{
"id": 21,
"route_id": 5,
"package_id": 42,
"stop_order": 1,
"estimated_arrival": "09:30:00",
"actual_arrival": "09:28:00"
}Logs endpoint-ak
GET /api/logs/listByPackage - admin
Query params: packageId (required), page, limit.
Response 200
{
"logs": [
{
"id": 1,
"packageId": 42,
"oldStatus": "assigned",
"newStatus": "in_transit",
"changedBy": 3,
"notes": null,
"changedAt": "2026-04-26T09:00:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 20
}GET /api/logs/listAll - admin
Pakete guztietako egoera log guztiak zerrendatzen ditu. Needs verification filtro eta paginazio envelope-rako.
Tracking endpoint-a (publikoa)
GET /api/tracking/:trackingToken
Publikoa. Ez du auth behar. Token-a 32 byte-ko hex string-a da.
Response 200
{
"tracking_code": "PAK-20260001",
"recipient_name": "Ane Etxeberria",
"status": "in_transit",
"estimated_delivery": "2026-05-01",
"address": {
"street": "Kale Nagusia 12",
"city": "Tolosa",
"postal_code": "20400"
},
"last_update": "2026-04-26T09:00:00.000Z"
}Token-a TRACKING_EXPIRES_DAYS egun ondoren iraungitzen da (default 30). 404 itzultzen du token-a ezezaguna edo iraungita badago.