2024 to 2026 · Archive · Tyre wholesale
Novaya Doroga
A wholesale truck tyre and wheel storefront with its own admin CMS, built around the fact that the dealer’s stock lived in the accountant’s spreadsheets.
- Next.js 14
- Redux Toolkit
- MUI
- NestJS 10
- TypeORM
- PostgreSQL 16
- PapaParse
- backend modules
- 24
- entities
- 20
- migrations across 2024
- 19
- items in the offline snapshot
- 65
What I walked into
The dealer’s stock lived in the accountant’s spreadsheets, and the storefront had to follow them rather than the other way round.
The importer had to read the shop’s real 2024 exports, one product family at a time.
What I changed, and why
Import, not data entry
POST /parsing takes a CSV and a category slug and runs createFilters(), groupProperties() and creatItems() against four column maps.
Filters are rows
Filters and their options are database rows linked many-to-many to items, so faceted search is a SQL join on indexed UUIDs.
Offline at the transport layer
Every page still fires the real request and only falls back to a 65-item snapshot when it fails.
A new product family needs a column map, not a backend release.
Where it landed
The storefront turns the dealer’s CSV exports into filters and items, and faceted search is a join.
24 modules, 20 entities and 19 migrations spanning January to December 2024, with an offline demo that still tries the real API first.