Skip to content

Сервис лояльности в первом приближении#2

Open
nessai1 wants to merge 30 commits intomasterfrom
loyalty-service
Open

Сервис лояльности в первом приближении#2
nessai1 wants to merge 30 commits intomasterfrom
loyalty-service

Conversation

@nessai1
Copy link
Owner

@nessai1 nessai1 commented Nov 21, 2023

No description provided.

…вал код ошибки уникальности к запросу БД на создание юзера
…ью; Описал все обработчики сервиса, кроме /api/user/withdrawals (пока все они без реализации)
@nessai1
Copy link
Owner Author

nessai1 commented Nov 21, 2023

Это проект в первом приближении. В этой верии из готового - авторизация&регистрация.

В проекте 3 сущности:

  1. Юзер
  2. Enrollment - заказы которые регает пользователь и получает за них баллы
  3. Withdrawn - заказы которые юзер оплачивает баллами

Схему БД прикрепляю в этом сообщении
Screenshot 2023-11-21 at 02 06 59

Текущий баланс юзера хранится в таблице юзера. Баланс считается так: если статус Enrollment === PROCESSED и is_accrual_transferred === false - перечисляем баланс на счет юзера и изменяем is_accrual_transferred на true

@nessai1 nessai1 requested a review from kilchik December 4, 2023 15:57

if resp.StatusCode == http.StatusTooManyRequests {
retryAfter := resp.Header.Get("Retry-After")
retryAfterInt, _ := strconv.Atoi(retryAfter)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Никогда нельзя игнорировать ошибки, а тем более здесь - в заголовок могли поместить любое значение

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так у нас ведь внутренний сервис в закрытом контуре? Кажется, если нам в конфиг подсунут левый сервис злоумышленника то неверный заголовок Retry-After будет меньшим из бед

Но проверку добавлю все равно

resp.Body.Close()
if err != nil {
worker.logger.Error("error while read response from accrual service", zap.String("order id", enrollment.OrderID))
time.Sleep(time.Second * 5)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Таймауты лучше выносить в константы или конфиг

if resp.StatusCode != http.StatusOK {
worker.logger.Error("got unsuccessful status from accrual service", zap.String("status", resp.Status))
resp.Body.Close()
time.Sleep(time.Second * 5)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Часть кода дублируется - явный звоночек, что тебе нужна отдельная функция, которая будет вызываться в цикле. Для такой функции requireOrder с циклом и слипами сложно будет написать юнит-тесты, поэтому нужно добиться того, чтобы она вызывала функцию попроще и поменьше, которую мы уже хорошенько протестим юнитами

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants