Skip to content

feat: add LetterXpress (A&O Fischer) API v3 carrier#50

Merged
emuuu merged 4 commits into
mainfrom
feat/letterxpress-carrier
Jun 23, 2026
Merged

feat: add LetterXpress (A&O Fischer) API v3 carrier#50
emuuu merged 4 commits into
mainfrom
feat/letterxpress-carrier

Conversation

@emuuu

@emuuu emuuu commented Jun 23, 2026

Copy link
Copy Markdown
Owner

Summary

Adds LetterXpress (A&O Fischer GmbH & Co. KG) as a new carrier — a print-and-mail service (upload a PDF, it's printed and posted, optionally via SMART@MAIL e-mail).

Because it's a letter/print-mail product rather than a parcel carrier, it does not implement IShipmentService/ITrackingService; it exposes its own ILetterXpressClient, mirroring the DHL Internetmarke design.

Packages

  • Parcel.NET.LetterXpress — options, builder, DI, exception, error helper
  • Parcel.NET.LetterXpress.Letters — client: print jobs, SMART@MAIL e-mail jobs, balance, price, transactions, invoices
  • Parcel.NET.LetterXpress.All — meta-package

Carrier specifics (verified against the live API)

  • Auth in the JSON body (auth object on every request, incl. GET/DELETE) — no auth header.
  • Content-Type pinned to exactly application/json — the API rejects ; charset=utf-8 with HTTP 400.
  • Timestamps are Europe/Berlin local time (no TZ in the payload) — parsed DST-aware into DateTimeOffset.
  • EmailJobFilter values (queue/hold/canceled/draft/success) were probed empirically, not guessed.
  • snake_case wire models + source-generated JsonSerializerContext; base64 + MD5 computed by the client.

Validation

Local guards for the 50 MB request limit (incl. attachments/backgrounds/terms), empty file, registered-mail-national-only, serial+email exclusivity, numeric serial separator, future dispatch date, and price page count / shipping.

Tests

38 unit tests (mocked HTTP). Read and write paths (create → get → delete in test-mode Postbox) were additionally verified against the live API.

Docs

  • API reference now includes the LetterXpress types (generator assembly list extended).
  • New guide page under Carriers > LetterXpress.

Release / NuGet

  • Per-package release workflows (letterxpress, letterxpress-letters, letterxpress-all), listed in the release-tag dispatcher.
  • CI runs the LetterXpress test project.
  • ⚠️ Publish order due to dependencies: letterxpressletterxpress-lettersletterxpress-all.

Note: LetterXpress is a server-to-server API and intentionally has no CORS, so it is not wired into the interactive browser Playground (that would also expose the API key). API reference + guide cover it instead.

emuuu and others added 4 commits June 23, 2026 14:59
Add the LetterXpress carrier following the post-product pattern (its own
ILetterXpressClient rather than the parcel IShipmentService abstraction):

- Parcel.NET.LetterXpress: options, builder, DI extensions, exception, error helper
- Parcel.NET.LetterXpress.Letters: client covering print jobs, SMART@MAIL email
  jobs, balance, price, transactions and invoices, with snake_case wire models
  and a source-generated JsonSerializerContext
- Parcel.NET.LetterXpress.All: meta-package

Auth is injected into the JSON request body (no header), the Content-Type is
pinned to exactly "application/json", and timestamps are parsed as Europe/Berlin
local time — all verified against the live API. Includes request validation and
38 unit tests. Wires the packages into the solution and Parcel.NET.All, and
documents the carrier in the README.
Include the LetterXpress assemblies in the docs API reference generator and add
a Carriers > LetterXpress guide page. Regenerates api-docs.json, content-index.json
and sitemap.xml accordingly.
Add per-package release workflows for letterxpress, letterxpress-letters and
letterxpress-all, list them in the release-tag dispatcher, and run the
LetterXpress test project (plus a core-change check) in CI.
@emuuu emuuu merged commit ee7602b into main Jun 23, 2026
5 checks passed
@emuuu emuuu deleted the feat/letterxpress-carrier branch June 23, 2026 13:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant