Как использовать метод DELETE так, чтобы не получить по шапке?
Метод DELETE под собой БАЗОВО подразумевает, что вызвав его - мы удалим полностью данные.
Но что делать, если есть сомнение: а действительно ли надо удалять ресурс? Может его надо обновить и просто скрыть без удаления, вдруг понадобится?
Если такой вопрос возникает, значит нам надо понять как действовать, потому что если мы неправильно спроектируем взаимодействие и удалим данные, которые нужны на самом деле, то есть большой риск, что компания получит убытки, а вы по шапке.
Приведу примеры на нескольких кейсах.
Кейс 1️⃣. Удаление банковской транзакции
Вы совершили отложенный перевод денежных средств в банк клиенте. Заявка в статусе на отправку, но деньги еще не ушли и вы хотите ее удалить.
Если мы просто удалим заявку на денежный перевод и она не ушла, то наверное ничего страшного, однако, это финансовая операция и поэтому у нее должен быть жесткий учет, значит DELETE в данном случае использовать нельзя.
➡️ можно сделать SOFT DELETE и просто прокинуть статус disable, а лучше поменять статус на "отменена" и тогда сохранится историчность.
Кейс 2️⃣. Удаление товара из системы в интернет-магазине.
У вас есть справочник товаров, которым управляют сотрудники. Они могут добавлять товары и удалять.
У вас есть старые товары, которые уже перестали продаваться в магазине. Сотрудник хочет их удалить.
Тут у нас двоякая ситуация, потому что с одной стороны, товар уже не используется, но не факт что он не использовался раньше, и отсутствует в заказах, поэтому здесь можно пойти таким путем:
Мы проверяем, был ли товар добавлен хотя бы в 1 заказ.
➡️ Если был, то удалять такой товар нельзя и его нужно архивировать, так как, если мы его удалим, у нас умрут связи и это повлияет не только на историю заказов, но может затронуть финансовые операции, расчеты, а это очень больно, уж поверьте. Используем SOFT DELETE.
➡️ Если товар ни с чем не связан, то спокойно делаем DELETE.
Кейс 3️⃣. Удаление учётной записи пользователя в интернет-магазине
У вас есть учетная запись и функциональность по удалению этой учетки. Как ее реализовать?
Тут как и в предыдущем пункте - два варианта:
➡️ Если у пользователя не было покупок → можно удалить его аккаунт так:
DELETE /users/{id}➡️ Если он совершал заказы → удалять нельзя, потому что его данные связаны с чеками, гарантиями, возвратами, заказами.
Но если бы я реализовывал именно этот кейс, то не закладывал бы сложную логику, потому что я не люблю усложнять. Сделать бы так:
➡️ во всех случаях, когда Клиент удаляет учетку, я бы делал SOFT DELETE и еще добавил бы анонимность данных.
Как оформить запрос при DELETE и SOFT DELETE?
«Полное» удаление (DELETE)
«Мягкое» удаление (SOFT DELETE)
• Endpoint: resource/{id}, где передаём значение поля is_deleted = true или archived = true или status = "cancelled".
PATCH /api/v1/products/123
Headers:
Content-Type: application/json
Body:
{
"is_archived": true,
"archived_at": "2025-02-26T12:00:00Z"
}Почему при SOFT DELETE мы не используем метод DELETE?
В целом, мы можем делать и soft delete и обычное удаление через метод DELETE, но в этом случае такой запрос не очевидно читается. И внутри придется делать дополнительную логику.
⚡️⚡️⚡️
Не важно через какой метод вы это делаете, важно лишь то, что вы понимаете БАЗОВЫЕ принципы и логику, а еще используете мышление системного аналитика для решения таких задач.