Go · 52 строк
Обработчик получает операцию по карте и начисляет кешбэк по категории: не больше 3 000 ₽ за операцию и 5 000 ₽ в месяц. Процессинг повторяет запрос, если не получил ответ за 2 секунды.
Отметьте строки с ошибками.
В работе: Сервис лояльности: каждую покупку по карте процессинг присылает сюда.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: Т‑Банк: секция Go, код-ревью с доработкой под бизнес-задачу. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package cashbackimport ("database/sql""encoding/json""log""net/http")type Handler struct {db *sql.DB}type accrueRequest struct {OperationID string `json:"operation_id"`ClientID string `json:"client_id"`Amount float64 `json:"amount"`Category string `json:"category"`}var rates = map[string]float64{"АЗС": 0.05, "Кафе": 0.03, "Аптеки": 0.05}func (h *Handler) Accrue(w http.ResponseWriter, r *http.Request) {var req accrueRequestif err := json.NewDecoder(r.Body).Decode(&req); err != nil {w.WriteHeader(http.StatusInternalServerError)return}rate := rates[req.Category]cashback := req.Amount * rateif cashback > 3000 {cashback = 3000}rows, err := h.db.Query("SELECT sum(amount) FROM cashback WHERE client_id = $1 AND created_at >= date_trunc('month', now())", req.ClientID)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}var monthTotal float64rows.Next()rows.Scan(&monthTotal)if monthTotal+cashback > 5000 {cashback = 5000 - monthTotal}_, err = h.db.Exec("INSERT INTO cashback(operation_id, client_id, amount) VALUES ($1, $2, $3)",req.OperationID, req.ClientID, cashback)if err != nil {log.Printf("cashback insert failed: %v", err)}w.WriteHeader(http.StatusOK)json.NewEncoder(w).Encode(map[string]float64{"cashback": cashback})}