Navigation

Download CV (in Spanish) ↓esen

Socials

©Code by Bryan

FuelTrack

Role

Architecture, back end and front end

Type

B2B ordering and dispatch platform

Stack

C#
FuelTrack

Fuel ordering and dispatch platform for companies in Peru: customers order online and track the tanker on a map; operators approve against terminal stock, assign trucks and sign off deliveries. Five .NET 9 microservices that talk only through events.

ResultCovers all 40 stories in the course report, with 61 domain tests and 64 end-to-end checks in CI.

The challenge

It started as a course project with a single API that mixed users, orders, prices and dispatch, and covered part of the report. The goal for this second version was to finish every story in the report (notifications, MFA, inventory, GPS, signed receipts, PDF reports) with an architecture where a failure in one part does not take the rest down.

What I built

I split the domain into five bounded contexts (Identity, Catalog with inventory, Orders, Dispatch and Notifications), each with its own PostgreSQL database. They coordinate by choreography over RabbitMQ with MassTransit's transactional outbox and idempotent inbox: a change and its event commit together, and if the broker goes down, events wait and nothing is lost. A YARP gateway is the single entry point, and every service validates the JWT itself. The Vue 3 front end receives notifications over Server-Sent Events and includes a live monitor that animates each event between services.

Live GPS tracking: route, distance left and ETA while the tanker is on its way
Live GPS tracking: route, distance left and ETA while the tanker is on its way
Live event monitor: every RabbitMQ message animated from the service that publishes it to each consumer
Live event monitor: every RabbitMQ message animated from the service that publishes it to each consumer
Load plan: each product goes in its own compartment, previewed on the tanker before confirming
Load plan: each product goes in its own compartment, previewed on the tanker before confirming
Inventory per terminal: stock reserved on approval, deducted on departure, alerts below the minimum
Inventory per terminal: stock reserved on approval, deducted on departure, alerts below the minimum
New order with live total, volume gauge and the delivery point picked on the map
New order with live total, volume gauge and the delivery point picked on the map
Sales report by month, product and company, downloadable as PDF or CSV
Sales report by month, product and company, downloadable as PDF or CSV
Swagger for each of the five services: 59 endpoints, each mapped to the report stories it covers
Swagger for each of the five services: 59 endpoints, each mapped to the report stories it covers
A real authenticated request from Swagger through the API gateway, with its correlation id
A real authenticated request from Swagger through the API gateway, with its correlation id
Transactional e-mail sent by the Notifications service on each status change (local SMTP inbox)
Transactional e-mail sent by the Notifications service on each status change (local SMTP inbox)
Customer companies with their volume and billing
Customer companies with their volume and billing
Public landing page for both customer segments
Public landing page for both customer segments
Order history on mobile
Order history on mobile

Highlights

  1. 015 microservices, a database per service and 17 integration event types
  2. 02Transactional outbox and idempotent inbox, with a reproducible broker-outage test
  3. 03Rotating refresh tokens with reuse detection and MFA by code to place orders
  4. 04Stock validated in Orders and reserved by events in Catalog, without distributed transactions
  5. 05Live GPS tracking, signed receipts and PDF/CSV reports
  6. 06Swagger per service, 9 ADRs and a traceability matrix against the report

Built with

ASP.NET CoreC#C#PostgreSQLRabbitMQDockerVue.jsTypeScriptTailwind CSSSwagger