TechMove
A logistics management system with automated tests, a CI pipeline and a fallback when its currency API goes down.
Tech stack
- C#
- .NET 9
- ASP.NET Core MVC
- Entity Framework Core
- SQL Server
- xUnit
- Moq
- GitHub Actions
- Frankfurter API
My part
Started as a coursework assignment, then expanded on my own as a sandbox for practising DevOps and platform engineering.
What it does
- Manages logistics clients, freight contracts and service tasks
- Delivery prices that scale with the contract, such as 50% extra for express and double for hazardous materials
- Live USD to ZAR conversion from the Frankfurter API
- PDF document uploads, with files renamed to random IDs and deleted from disk when their record is removed
- Search and filters for contracts by status and date, service tasks and clients, kept in the address so a search can be bookmarked
- Live notifications when a contract's status changes, for example to Expired or On Hold
How it works
- A GitHub Actions pipeline restores, builds and runs the full xUnit suite on every push and pull request to main.
- On start-up it looks for a local SQL Server (Developer, Express or LocalDB), sets the connection, creates the database with migrations and seeds it, so a fresh clone runs with no setup.
- If the currency API is down, it falls back to cached or default rates instead of failing.
- Split into separate projects, with a data access layer kept apart from the controllers.
- Uses three Gang of Four patterns: a Strategy for the currency provider so it can be swapped, an Observer that reacts to contract status changes, and a Factory Method that creates contracts with their end dates, reference codes and starting status.
- Tests run against an in-memory database, and cover disguised file types such as .exe or .bat, currency API timeouts, and restricted contract states.