Conversation
…вал код ошибки уникальности к запросу БД на создание юзера
…вании других пакетов
…ью; Описал все обработчики сервиса, кроме /api/user/withdrawals (пока все они без реализации)
|
|
||
| if resp.StatusCode == http.StatusTooManyRequests { | ||
| retryAfter := resp.Header.Get("Retry-After") | ||
| retryAfterInt, _ := strconv.Atoi(retryAfter) |
There was a problem hiding this comment.
Никогда нельзя игнорировать ошибки, а тем более здесь - в заголовок могли поместить любое значение
There was a problem hiding this comment.
Так у нас ведь внутренний сервис в закрытом контуре? Кажется, если нам в конфиг подсунут левый сервис злоумышленника то неверный заголовок 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) |
There was a problem hiding this comment.
Таймауты лучше выносить в константы или конфиг
| 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) |
There was a problem hiding this comment.
Часть кода дублируется - явный звоночек, что тебе нужна отдельная функция, которая будет вызываться в цикле. Для такой функции requireOrder с циклом и слипами сложно будет написать юнит-тесты, поэтому нужно добиться того, чтобы она вызывала функцию попроще и поменьше, которую мы уже хорошенько протестим юнитами

No description provided.