Разделить «удаление всех постов и тем разрешённых групп» на права для собственного контента и глобального контента

Я хотел бы предложить разделить настройку «Разрешённые группы для удаления всех постов и тем» на более узкие разрешения.

На данный момент эта настройка слишком широка: она позволяет выбранным группам удалять посты и темы, созданные другими пользователями, а также просматривать удалённые посты/темы. Это логично для модераторов или доверенных групп модерации, но избыточно для случая, когда требуется лишь предоставить пользователям более полный контроль над их собственным контентом.

Уточню: я не имею в виду безвозвратное (жёсткое) удаление из базы данных.

Речь идёт прежде всего о стандартном поведении удаления/истории изменений для обычных пользователей: например, когда пользователь удаляет свой собственный пост, остаётся ли обычная заглушка удалённого поста, сохраняется ли доступ к содержимому предыдущих правок через интерфейс истории изменений и можно ли ввести более узкое разрешение, касающееся управления этим только для собственных постов пользователя.

Возможное разделение может выглядеть так:

  1. Разрешённые группы для удаления собственных постов и тем
  2. Разрешённые группы для удаления всех постов и тем

Первая настройка применялась бы только к контенту, созданному текущим пользователем. Вторая настройка сохранила бы текущее более широкое поведение для групп, которым доверяется удаление контента других пользователей и просмотр удалённого контента.

Это упростило бы соблюдение принципа минимальных привилегий при проектировании ролей. Например, сайт мог бы предоставить пользователям уровня TL4/Лидер или специальной доверенной группе больше контроля над удалением их собственных постов/тем, не наделяя их при этом полномочиями модерации в отношении контента других пользователей.

Я понимаю, что потребуются дополнительные меры предосторожности, особенно в случаях, когда удаление первого поста влияет на тему, содержащую ответы других пользователей. В таких ситуациях Discourse мог бы сохранить текущее ограничение, требовать вмешательства модератора или ограничить разрешение на удаление собственного контента только ответами/темами без ответов.

Основная просьба заключается в том, чтобы разрешение на удаление/управление историей изменений собственного контента было отделено от текущего глобального разрешения на удаление, чтобы администраторам не приходилось выбирать между мягким удалением для обычных пользователей и гораздо более широким разрешением «может удалять посты/темы других пользователей».

Я думаю, что часть путаницы здесь связана с тем, что могут существовать различные проверки для «просмотра удалённого контента».

Если посмотреть на PostGuardian, то отдельный удалённый пост, по-видимому, не становится видимым через can_see_post? только потому, что пользователь входит в delete_all_posts_and_topics_allowed_groups.

Например, видимость отдельных удалённых постов, похоже, определяется так:

def can_see_deleted_post?(post)
  return false if !post.trashed?
  return false if @user.anonymous?
  return true if is_staff?
  post.deleted_by_id == @user.id && @user.has_trust_level?(TrustLevel[4])
end

Таким образом, обычный пользователь с уровнем доверия TL2, состоящий в delete_all_posts_and_topics_allowed_groups, не обязательно сможет открыть или прочитать тело каждого удалённого поста через can_see_post?.

Однако тот же самый параметр используется и здесь:

def can_see_deleted_posts?(category = nil)
  is_category_group_moderator?(category) ||
    @user.in_any_groups?(SiteSetting.delete_all_posts_and_topics_allowed_groups_map)
end

Это означает, что данный параметр концептуально шире, чем просто «автор может удалить свой собственный контент». Он применяется как для удаления видимых постов других пользователей, так и для предоставления хотя бы некоторых возможностей просмотра или перечисления удалённых постов.

Поэтому моя обеспокоенность заключается не в том, что «этот параметр точно раскрывает тело каждого удалённого поста в каждой конечной точке», а в том, что текущие разрешения объединяют несколько понятий:

  1. удаление постов/тем других пользователей;
  2. просмотр или перечисление удалённых постов/тем в некоторых контекстах;
  3. предоставление авторам большего контроля над их собственным следом.

Для моего случая использования мне нужен только третий пункт.

Именно поэтому я считаю, что отдельный параметр для собственного контента был бы более чистым решением. Он мог бы позволить пользователю удалять или отзывать свои собственные посты/темы, с учётом существующих мер безопасности, не предоставляя более широких разрешений, подобных модераторским, в отношении контента других пользователей или видимости удалённого контента.

Чтобы прояснить поведение интерфейса, я хочу следующее: я не прошу делать удалённый контент видимым для обычных пользователей.

Для разрешения на удаление собственного контента идеальное поведение должно зависеть от зрителя:

  • автор должен видеть, что его собственное сообщение было отозвано/удалено, возможно, в обычном красном стиле для удалённых сообщений или в свернутом состоянии, чтобы он понимал, что произошло, и мог восстановить его, если восстановление разрешено;
  • сотрудники/модераторы сохраняют любой необходимый им аудит и видимость для модерации;
  • обычные пользователи не должны видеть никаких следов удалённого контента — ни текста сообщения, ни истории изменений, и в идеале даже плейсхолдера удалённого сообщения.

Таким образом, я прошу о возможности для автора контролировать свой собственный видимый след, не предоставляя пользователям без прав модерации видимость удалённого контента или глобальные права над сообщениями/темами других пользователей.

Ещё один нюанс — история изменений.

Судя по PostRevisor, история редактирования хранится отдельно через PostRevision, поэтому я не предлагаю, чтобы разрешение на удаление собственного контента обязательно приводило к полному удалению записей о ревизиях или потере возможности аудита.

То разрешение, которое я имею в виду, касается скорее видимости для обычных пользователей: может ли автор удалить свой пост/тему, остаётся ли заполнитель удалённого поста, могут ли обычные пользователи просматривать предыдущие версии редактируемого контента, и сохраняют ли сотрудники/модераторы соответствующий доступ для аудита и модерации (например, через кнопку «ПОКАЗАТЬ ССКРЫТЫЙ ОТВЕТ»).

Таким образом, я предлагаю не такой разрыв:

  • «позволить пользователям стереть все следы из базы данных»

а скорее:

  • «дать пользователям больше контроля над своим видимым контентом/следом»
  • при этом не предоставляя им глобальных прав на удаление контента других пользователей или общий доступ к удалённому контенту.