Войти Регистрация
Код-ревью

4. Суточный лимит по карте при авторизации

Сложная

Kotlin · 34 строк

Платёжная система ждёт ответа на авторизацию не дольше 150 мс. Сервис держит потраченное за сутки в памяти и вызывается из пула на 64 потока. Лимит задаётся клиентом в приложении, по умолчанию его нет.

При снятии наличных (MCC 6011) в лимит засчитывается сумма плюс комиссия 1 %. Отметьте строки с ошибками.

В работе: Онлайн-авторизация покупок по карте: ответ «одобрено» или «отказ» за доли секунды.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
многопоточностьатомарностьчасовые поясалатентность

Источник: на задачах Т‑Банка: авторизация платежей по карте. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. class CardLimitService(
  2. private val repo: LimitRepository,
  3. private val notifier: PushNotifier,
  4. ) {
  5. private val spentToday = HashMap<String, Long>()
  6. private var day = LocalDate.now()
  7. fun authorize(cardId: String, amountKop: Long, mcc: Int): Boolean {
  8. resetIfNewDay()
  9. val limit = repo.dailyLimit(cardId) ?: 0L
  10. val spent = spentToday[cardId] ?: 0L
  11. if (spent + amountKop > limit) {
  12. notifier.send(cardId, "Отказ: превышен лимит ${limit / 100} ₽")
  13. return false
  14. }
  15. spentToday[cardId] = spent + amountKop
  16. if (mcc == 6011) {
  17. spentToday[cardId] = spent + amountKop + amountKop / 100
  18. }
  19. return true
  20. }
  21. fun refund(cardId: String, amountKop: Long) {
  22. spentToday[cardId] = spentToday.getValue(cardId) - amountKop
  23. }
  24. private fun resetIfNewDay() {
  25. val today = LocalDate.now()
  26. if (today != day) {
  27. spentToday.clear()
  28. day = today
  29. }
  30. }
  31. }