Интеграции · Go · REST API
REST API на онлайн магазин на Go: поръчки без дубликати и наличности, които не падат под нулата
Клиент:
Личен проект
Категория: Интеграции
Стек: Go 1.25, chi, PostgreSQL 16, pgx, sqlc, golang-migrate, JWT, bcrypt, zap, Docker Compose, GitHub Actions, golangci-lint
Срок: личен проект, 2025 г.
Проблем
Беше нужно API за магазин, което коректно се справя с типичните ситуации при реален трафик: повторно изпращане на поръчка при прекъсната връзка и едновременно купуване на последните бройки от дадена стока.
Ограничения
Повторната заявка не бива да създава втора поръчка, наличността не бива да пада под нулата при конкурентни поръчки, а сумите трябва да се изчисляват без грешки от закръгляне при float.
Какво направих
- JWT автентикация: access токен за 15 минути и refresh токен, който се пази в базата само като хеш; роли user и admin, пароли — bcrypt
- Идемпотентност на поръчките по заглавката Idempotency-Key: повторната заявка връща запазения отговор, ключовете живеят 24 часа
- Атомарно намаляване на наличностите в транзакция: условен UPDATE не позволява падане под нулата, отказът от поръчка връща стоката в склада
- Слой за данни на sqlc и миграции с golang-migrate, сумите — в decimal, а не във float
- Странициране, филтриране и сортиране на каталога, валидиране на входните данни, rate limit по IP, graceful shutdown, структурирани логове със zap
- OpenAPI 3.0 (10 пътя) и Postman колекция; CI: компилиране, миграции, 20 модулни теста с -race и golangci-lint
Архитектура
chi рутер + middleware
→ Сервизен слой
→ sqlc хранилища
→ PostgreSQL 16 (транзакции)
→ OpenAPI / Postman
Резултат
API покрива цикъла „регистрация → каталог → поръчка → плащане или отказ“ и се държи предсказуемо при повторни и конкурентни поръчки; всяка промяна се проверява в CI.
Какво може да се преизползва
Идемпотентност на POST заявки по Idempotency-Key
Атомарно намаляване на наличностите с условен UPDATE в транзакция
Скелет на Go услуга: chi, sqlc, zap, CI с golangci-lint