
GHOST-01: soft delete — это не delete
Ariless 10 минут назад GHOST-01: soft delete — это не delete Средний 4 мин 351 Тестирование IT-систем * PostgreSQL * Кейс Из песочницы Как удалённый пользователь получил appointment. И что это говорит о том, что значит...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
В сфере искусственного интеллекта произошло заметное событие. Ariless 10 минут назад GHOST-01: soft delete — это не delete Средний 4 мин 351 Тестирование IT-систем * PostgreSQL * Кейс Из песочницы Как удалённый пользователь получил appointment. И что это говорит о том, что значит «удалить» сущность в системе с soft delete. Для удалённого пользователя.
Контекст Система клиники: пациенты бронируют слоты к врачам. Если слот занят — попадают в вейтлист. Когда appointment отменяется — первый из вейтлиста автоматически получает слот.
Технические детали
Удаление пользователей реализовано через soft delete: в таблице users есть поле deletedAt. «Удалённый» пользователь — это обычная запись с заполненным deletedAt. Физически запись никуда не исчезает.
Это стандартная практика: soft delete позволяет сохранить историю, восстановить данные, не нарушать foreign key constraints. ИнцидентFixture teardown в тесте:1. Пользователь user2 помечается как удалённый: softDeleteUser(user2)2.
Доктор отменяет appointment пациента user1: cancelAsDoctor(user1. Отмена освобождает слот4. Срабатывает promoteFromWaitlist(slotId)5.
Отраслевые последствия
Функция находит user2 в вейтлисте6. Проверяет: есть ли у user2 активный appointment? — нет (он soft-deleted, его appointment был cancelled раньше)7.
Продвижение: создаётся новый pending appointment для user2, слот занимается8. deleteSlot получает 409 SLOT_IN_USEБаза данных после teardown:-- appointment для пользователя которого "нет"SELECT FROM appointments WHERE patientId = ? ;-- id: 47, patientId: 2 (deletedAt: '2026-05-20 status: 'pending'-- слот который нельзя удалитьSELECT isAvailable FROM slots WHERE id = ?
;-- isAvailable: 0В production это означало бы: appointment в календаре врача для пациента, которого не существует. Без стандартного способа его отменить. Root causesoftDeleteUser выглядел так:async softDeleteUser(userId: number) { await db.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




