Краткое обновление о прогрессе после изучения существующего кода для постоянного удаления:
Я обнаружил, что в Discourse уже есть фактическое поведение массового удаления, необходимое здесь. Когда первый пост удаляется без возможности восстановления, PostDestroyer уже способен рекурсивно и безвозвратно удалить оставшиеся посты в теме. Ограничение заключается в основном в проверках разрешений и политик, которые в настоящее время требуют, чтобы другие посты были сначала удалены безвозвратно.
В связи с этим я отказался от общесайтового перечисления (enum), которое я предложил выше, и теперь использую рабочую реализацию с более консервативной моделью опционального включения:
- существующая настройка
can_permanently_deleteостаётся главным переключателем; - добавлен дополнительный скрытый механизм управления на уровне операторов, отключённый по умолчанию;
- когда оба условия активны, каждый администратор может индивидуально включить эту функцию в разделе «Настройки» → «Интерфейс»;
- включение функции одним администратором не изменяет поведение для других администраторов;
- отключение скрытого механизма немедленно восстанавливает существующее поведение для всего сайта;
- существующее подтверждение постоянного удаления и другие защитные механизмы остаются в силе.
Название предпочтения на данный момент следующее:
Разрешить постоянное удаление темы для удаления всех постов
с пояснением:
При постоянном удалении темы также безвозвратно удалять все оставшиеся посты, а не требовать их индивидуального постоянного удаления.
Я добавил тесты политики безопасности на стороне сервера, покрытие контроллера, подтверждающее, что тема и все оставшиеся посты действительно удаляются безвозвратно, покрытие сериализатора/API, а также тесты приёмки на стороне клиента для видимости и сохранения этого предпочтения. Все тесты проходят успешно.
Я также рассматриваю возможность записи изменений этого индивидуального включения для каждого администратора в журналах действий персонала (Staff Action Logs), поскольку активация более разрушительного режима удаления кажется достойным событием аудита с временной меткой.
Я опубликую PR на GitHub, когда закончу с этим и финальным обзором.