Skip to content

Backend API for allocating customer orders to batches of stock in a warehouse with scalable architectural patterns.

Notifications You must be signed in to change notification settings

msolorio/allocation_service

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Allocation Service

Backend API for allocating customer orders to batches of stock in a warehouse.

Stack

  • Python
  • PostgreSQL
  • Flask
  • SqlAlchemy
  • Docker

Architecture

The application uses the dependency inversion principle, and creates abstractions around I/O and injects them. This allows us to pass a fake I/O to the service layer for testing the application "edge-to-edge" with fast, in-memory unit tests.

in-memory-implementation


For real-world and E2E testing, the service layer is passed real I/O that talks to a database. Because we have already exhaustively tested the service layer with fast, in-memory tests, less slow E2E tests are needed. We can achieve a healthy testing pyramid with high coverage.

e2e-implementation


A few patterns are used to aid dependency inversion.

Repository - an abstraction around data access. Handles syncing between the domain model and the ORM.
Unit of Work - an abstraction around transactions and atomicity.
Service Layer - the entrypoint for injecting I/O and defines the application's use cases.
Domain Model - an object module of the business domain free of dependencies on data access.
Data Mapper - handles conversion between domain objects and db objects.

Trade-offs - Each pattern adds indirection and congintive load and wouldn't be necessary in a simple application. You could, for example, still achieve dependency inversion and abstracting I/O with only a simple repository and a service layer.

About

Backend API for allocating customer orders to batches of stock in a warehouse with scalable architectural patterns.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published