feat(tracking): AfterShipProvider + Provider-Auswahl per Env #220

Merged
admin-mrrm merged 1 commit from feat-aftership-provider into main 2026-05-12 00:05:44 +02:00
Owner

Folge-PR von #219 (#140).

17track ist nach Trial kostenpflichtig — AfterShip dagegen mit dauerhaft kostenlosem 50/Monat-Free-Tier für private Volumen oft komplett ausreichend. Dieser PR fügt eine zweite TrackingProvider-Implementation hinzu und macht die Auswahl per Env steuerbar.

Was drin ist

  • providers/aftership.provider.ts:
    • register() ruft POST /trackings ein Item pro Call (AfterShip kennt keinen Bulk-Register)
    • getTrackInfo() ruft GET /trackings/{slug}/{number} pro Item
    • HTTP 409 (already exists) = accepted (Idempotenz)
    • Slug-Mapping: dhl→dhl-germany, ups→ups, hermes→hermesworld-de, dpd→dpd
  • TrackingModule wählt Provider über TRACKING_PROVIDER-Env-Var (17track | aftership, Default 17track)
  • Env: AFTERSHIP_API_KEY + optional AFTERSHIP_BASE_URL

Test plan

  • 10 Unit-Tests für AfterShipProvider grün
  • Track17Provider-Tests weiter grün (19 total)
  • Typecheck + Lint clean
  • Drone CI grün

Dieser PR ist auf feat-140-17track-client gestackt und re-targeted automatisch auf main sobald #219 gemerged ist.

Folge-PR von #219 (#140). 17track ist nach Trial kostenpflichtig — AfterShip dagegen mit dauerhaft kostenlosem 50/Monat-Free-Tier für private Volumen oft komplett ausreichend. Dieser PR fügt eine zweite `TrackingProvider`-Implementation hinzu und macht die Auswahl per Env steuerbar. ## Was drin ist - `providers/aftership.provider.ts`: - `register()` ruft `POST /trackings` ein Item pro Call (AfterShip kennt keinen Bulk-Register) - `getTrackInfo()` ruft `GET /trackings/{slug}/{number}` pro Item - HTTP 409 (already exists) = accepted (Idempotenz) - Slug-Mapping: `dhl→dhl-germany`, `ups→ups`, `hermes→hermesworld-de`, `dpd→dpd` - `TrackingModule` wählt Provider über `TRACKING_PROVIDER`-Env-Var (`17track` | `aftership`, Default `17track`) - Env: `AFTERSHIP_API_KEY` + optional `AFTERSHIP_BASE_URL` ## Test plan - [x] 10 Unit-Tests für AfterShipProvider grün - [x] Track17Provider-Tests weiter grün (19 total) - [x] Typecheck + Lint clean - [ ] Drone CI grün Dieser PR ist auf `feat-140-17track-client` gestackt und re-targeted automatisch auf `main` sobald #219 gemerged ist.
feat(tracking): AfterShipProvider als zweite TrackingProvider-Implementation
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
3a4dd6515b
AfterShip ist mit Free-Tier (50 Trackings/Monat dauerhaft kostenlos) für
private Volumen oft komplett ausreichend, anders als 17track das nach
Trial paid wird.

- providers/aftership.provider.ts: POST /trackings für register (ein
  Call pro Item), GET /trackings/{slug}/{number} für getTrackInfo
- HTTP 409 (already exists) wird als accepted gewertet, nicht als Fehler
- Slug-Mapping: dhl→dhl-germany, ups→ups, hermes→hermesworld-de, dpd→dpd
- TrackingModule wählt Provider über TRACKING_PROVIDER-Env-Var
  (17track | aftership, Default: 17track)
- Env: AFTERSHIP_API_KEY + optional AFTERSHIP_BASE_URL
admin-mrrm changed target branch from feat-140-17track-client to main 2026-05-11 23:55:05 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!220
No description provided.