Към съдържанието
N1
Интеграции · 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