February 17

Как использовать метод DELETE так, чтобы не получить по шапке?

Метод DELETE под собой БАЗОВО подразумевает, что вызвав его - мы удалим полностью данные.

Но что делать, если есть сомнение: а действительно ли надо удалять ресурс? Может его надо обновить и просто скрыть без удаления, вдруг понадобится? Если такой вопрос возникает, значит нам надо понять как действовать, потому что если мы неправильно спроектируем взаимодействие и удалим данные, которые нужны на самом деле, то есть большой риск, что компания получит убытки, а вы по шапке.
Приведу примеры на нескольких кейсах.

Кейс 1️⃣. Удаление банковской транзакции

Вы совершили отложенный перевод денежных средств в банк клиенте. Заявка в статусе на отправку, но деньги еще не ушли и вы хотите ее удалить.

Что делать?

Если мы просто удалим заявку на денежный перевод и она не ушла, то наверное ничего страшного, однако, это финансовая операция и поэтому у нее должен быть жесткий учет, значит DELETE в данном случае использовать нельзя.

➡️ можно сделать SOFT DELETE и просто прокинуть статус disable, а лучше поменять статус на "отменена" и тогда сохранится историчность.

Кейс 2️⃣. Удаление товара из системы в интернет-магазине.

У вас есть справочник товаров, которым управляют сотрудники. Они могут добавлять товары и удалять.

У вас есть старые товары, которые уже перестали продаваться в магазине. Сотрудник хочет их удалить.

Что делать?

Тут у нас двоякая ситуация, потому что с одной стороны, товар уже не используется, но не факт что он не использовался раньше, и отсутствует в заказах, поэтому здесь можно пойти таким путем:

Мы проверяем, был ли товар добавлен хотя бы в 1 заказ.

➡️ Если был, то удалять такой товар нельзя и его нужно архивировать, так как, если мы его удалим, у нас умрут связи и это повлияет не только на историю заказов, но может затронуть финансовые операции, расчеты, а это очень больно, уж поверьте. Используем SOFT DELETE.

➡️ Если товар ни с чем не связан, то спокойно делаем DELETE.

Кейс 3️⃣. Удаление учётной записи пользователя в интернет-магазине

У вас есть учетная запись и функциональность по удалению этой учетки. Как ее реализовать?

Тут как и в предыдущем пункте - два варианта:

➡️ Если у пользователя не было покупок → можно удалить его аккаунт так:

DELETE /users/{id}

➡️ Если он совершал заказы → удалять нельзя, потому что его данные связаны с чеками, гарантиями, возвратами, заказами.

Но если бы я реализовывал именно этот кейс, то не закладывал бы сложную логику, потому что я не люблю усложнять. Сделать бы так:

➡️ во всех случаях, когда Клиент удаляет учетку, я бы делал SOFT DELETE и еще добавил бы анонимность данных.

➖➖➖

А дальше дело техники

Как оформить запрос при DELETE и SOFT DELETE?

«Полное» удаление (DELETE)

Метод: DELETE

Endpoint: /resource/{id}

«Мягкое» удаление (SOFT DELETE)

Метод: чаще PATCH или PUT

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, но в этом случае такой запрос не очевидно читается. И внутри придется делать дополнительную логику.

⚡️⚡️⚡️

Не важно через какой метод вы это делаете, важно лишь то, что вы понимаете БАЗОВЫЕ принципы и  логику, а еще используете мышление системного аналитика для решения таких задач.