Юрий Белк – Full stack Developer (страница 27)
– логин: 10/10 минут на IP + 5/10 минут на email
– поиск задач: 60/мин на пользователя
Что возвращаем клиенту
Если лимит превышен, стандартно:
– HTTP 429 Too Many Requests
– заголовок Retry-After (сколько ждать)
И важный момент: сообщение в ответе не должно быть токсичным.
“Too many requests, retry later” – нормально. “Вы слишком много хотите” – это уже лишнее.
7.2. Idempotency для POST (и “платёжных” операций как паттерн)
Идемпотентность – это способность повторить запрос и получить тот же результат, не создав дубликатов.
Почему это важно:
– сеть ненадёжна,
– клиент может не получить ответ и повторить запрос,
– прокси может повторить запрос,
– пользователь может нажать “создать” дважды (классика жанра).
Где нужна идемпотентность
В TaskFlow критично для:
– POST /tasks (создание задач)
– POST /projects
– любые “операции эффекта” (например, отправка webhook/уведомления, загрузка файла – по дизайну)
Идея из платежей:
– клиент отправляет Idempotency-Key
– сервер по этому ключу понимает: это повтор или новый запрос
– повтор возвращает прежний результат
Как это выглядит
Клиент отправляет заголовок:
– Idempotency-Key: <random-uuid>
Сервер:
1) проверяет, есть ли запись по ключу + пользователю + endpoint’у
2) если есть – возвращает сохранённый результат (например, 201 и тело созданной задачи)
3) если нет – выполняет операцию, сохраняет результат и возвращает
Важные детали
– Ключ должен быть уникальным на сторону клиента (обычно UUID).
– Хранить идемпотентные ключи надо с TTL (например, 24 часа).
– Нужно привязывать ключ к пользователю (или workspace), иначе один пользователь сможет “повторить” чужую операцию.
Что сохранять
Минимально:
– статус-код,
– response body,
– время создания,
– fingerprint запроса (опционально).
И ещё правило: если по тому же ключу пришёл другой запрос (другая payload), можно вернуть 409 Conflict. Это честно и защищает от странных багов клиента.
7.3. Audit log (журнал аудита)
Аудит – это ответ на вопрос: кто и что сделал.
Даже если вы не банк, аудит полезен:
– для разборов инцидентов,
– для поддержки пользователей,
– для безопасности (“кто удалил проект?”),
– для аналитики.
Что писать в аудит
События минимум:
– user зарегистрировался
– user вошёл (логин)
– создан/обновлён/архивирован проект
– создана/обновлена/удалена задача
– добавлен/изменён/удалён комментарий
– изменения ролей и участников workspace
Структура записи (концептуально)
AuditEvent:
– id
– workspace_id (если событие в workspace)
– actor_user_id (кто сделал)
– action (например: task.created, project.archived)
– entity_type и entity_id
– timestamp