Комментарии 6
Фикс
Ну и странный какой-то фикс. Почему мы юзера удаляем мягко, а запись из листа ожидания - жёстко?
У каждого компонента было своё определение «удалённый пользователь». У некоторых его не было вообще.
Ну бардак он и есть бардак.
Здесь код promoteFromWaitlist написан правильно — он делает именно то для чего предназначен: находит первого в очереди без активного appointment и продвигает его.
А если продолжить "... плюя на всё" - то уже как-то возникают сомнения в правильности. Своё сделал, а там хоть трава не расти.
PS. Stored procedures.
Мы тоже используем у себя мягкое удаление. И тоже, то что казалось идеальным решением стало небольшим геморроем, только у нас в этой же таблице есть еще и “архивные” записи с точно такой же логикой. Там где мы используем ORM еще можно использовать глобальные фильтры… но часть логики у нас сознательно протекла в хранимые процедуры SQL Server… ради скорости, и там приходится обмазываться фильтрами в каждом запросе.
Корневая проблема – не в том, что фильтров много, а в том, что в одной таблице живут три разных типа сущности: активная, мягко удалённая и архивная. ORM-фильтры и хранимые процедуры – это ручная компенсация отсутствующего типа. Выход: view `active_users` + `archived_users` поверх одной таблицы со status-колонкой enum – и SQL-сторона перестаёт «протекать».
Корневая проблема – не в том, что фильтров много
Корневая проблема в том, что наш продукт родился из эксельки с макросами… где зафигачить дополнительную колонку в таблицу оказалось быстрым и приемлимым решением. Так далеко никто не загадывал.
Выход
Я надеюсь что когда-нибудь наш стек будет помечен как “неприемлимо устаревший”, а сейчас он просто устаревший… и придется все переписать на Postgres с нормальными архитектурными решениями. Вопрос только в том не закончится ли жизненный цикл продукта раньше, чем это случится ))
Порядок важен: если сначала выставить deletedAt, а потом чистить вейтлист — в промежутке может сработать ...
А ещё существуют транзакции...
Если при выполнении подобных действий вы их не используете, то вас ждёт ещё много сюрпризов.

GHOST-01: soft delete — это не delete