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