soft delete, где вы поля is_deleted и deleted_at обновляете? В репе или бизнесухе?
Это похоже на деталь хранения, но тогда какая-то каша: почему все поголовно created_at и updated_at в бизнес-логике обновляют? Есть какой-то подход, которого стоит придерживаться?
в бизнес логике так соблюдается правило, что репозиторий не модифицирует данные + проще тестировать
Я бы is_deleted обновлял в слое репозитория. Потому что это относится к особенностям хранения данных в хранилище. А вот время удаления я бы передавал из бизнес-логики. Потому что теоретически может быть какая-то необходимость удалять задним числом, например
Если поля используются в бизнес-логике, то обновляются в бизнес-логике. Если исключительно на уровне БД, то на уровне бизнес-логики они вообще не должны существовать
Вообще в бизнес слое, т.к. репа не должна знать ничего практически (могут возникнуть проблемы когда понадобится изменить поня в бизнес слое, но будут конфликты из-за того что в репе логика меняется). Но кажется что все больше я не навижу софтделиты и хочу их поменять на какую-нибудь archived_at т.к. не всегда понятно обновлять ли удаленные данные или нет, с архивными по проще
А как архивные данные принципиально отличаются от помеченных как is_deleted? Все равно ведь где-то нужна будет проверка, что их нельзя обновлять Или это просто название более передающее суть?
возможно это просто проблема в том что большинство ОРМ (с которыми я в последнее время чаще работаю) запищивают глобальное поведение на софтделиты и просто исключают их из всех выборок с архивными ты можешь не держать это условие постоянно в голове (хотя тебе везде надо учитывать что есть архивные записи)
Если мы все поля модифицируем в бизнес-логике, то по идее можно избавиться от метода repo.DeleteItem, оставив только repo.UpdateItem
лучше отдельный метод всё же, т.к в системах побольше удаление это не просто обновления одного поля в 1 таблице, а больше действий)
я имею ввиду, что при update вы меняете одну таблицу обычно, просто полей список может отличаться а при delete может быть софт удаление не только сущности но и связанных например или запись в лог
в репе транзакцией вероятно) но в реале где-нибудь в сервисе транзакцию открывают местами или в контексте кидают и тд делайте лишь бы протестировать можно было
Да, про транзакцию не подумал. Спасибо за помощь!
Обсуждают сегодня