작은 액션 게시물에 관리자 도구/렌치 적용

작은 액션 게시물(예: closed/pinned 같은 메시지)에 관리 도구를 포함할 수 있을까요? 예를 들어 영구 삭제, 소유권 변경 등이 가능하도록 하는 것입니다.

저는 이 사이트에서 유일한 관리자입니다. 이러한 게시물이 소프트 삭제 상태로 숨겨져 있긴 하지만, 스태프 사용자로서도 여전히 보기 좋지 않습니다. 때로는 대략적인 초안을 정식 게시물로 만들기 전에 소프트 삭제된 메시지에 메모를 남기기도 해서, 숨겨진 답변을 표시하기 위해 클릭할 때마다 이러한 메모와 작은 액션 메시지를 구별하기가 다소 어렵습니다.

컴포넌트에 CSS를 사용하는 것도 별로 원하지 않습니다. 특정 주제에 대해 아카이브하거나 닫았다는 것을 사용자에게 알리는 것처럼, 작은 액션 메시지가 표시되어야 하는 경우가 몇 가지 있기 때문입니다. 저는 단순히 고정/해제/고정/해제 같은 흐름이 계속되는 것을 원하지 않을 뿐입니다. 이런 상황은 모두 본 적이 있을 테니 제가 어떤 의미인지 이해하시리라 생각합니다.

참고로, 저는 약 10명의 사용자가 있는 작은 사이트를 운영 중이며, 이는 기본적으로 다양한 노트와 미디어를 위한 디지털 라이브러리처럼 사용되고 있습니다. 취미로 이벤트 홍보를 하기도 해서, 정보의 영구 링크를 위해 페이지 게시 기능이 매우 유용합니다.

제 추측에 따르면, 작은 액션 게시물에 렌치(설정)가 구현되지 않은 것은 의도적인 것일 수 있습니다. 대부분의 사이트에서는 누가 어떤 게시물을 어떻게 처리했는지 스태프가 감사 추적을 할 수 있기를 원하기 때문이죠. 이는 타당한 이유입니다. 하지만 특정 상황에서는 유용할 수 있다고 생각하며, 아마도 추가 플러그인 형태로 제공될 수 있을 것입니다.

또한 이 사이트에 처음 게시물을 올리는 것입니다. 이 요청에 대한 적절한 장소라고 생각하지만, 그렇지 않다면 죄송합니다! :hugs:

3개의 좋아요

훌륭한 첫 게시글입니다. 이 같은 요청에 대해 구체적인 맥락을 함께 제공해 주시는 것이 매우 도움이 되므로, 이렇게 공유해 주셔서 감사합니다.

귀하의 사용 사례에서 현재 수행할 수 없어 가장 필요한 것이 "영구 삭제"인가요?

아니면 다른 동작에 대한 필요성이 있나요? (있다면 어떤 것들이며, 이유는 무엇인가요?)

2개의 좋아요

따뜻한 말씀 감사드립니다. 정말 감사합니다!

영구 삭제가 가장 핵심적인 기능입니다. 작은 액션의 소유권을 변경하거나, 일반적으로 게시물에서 사용할 수 있는 다른 관리자 옵션에 대해 개인적으로 구체적인 사용 사례를 떠올리기 어렵습니다.

rails를 통해 이 메시지를 삭제할 수는 있지만, 특정 게시물 ID를 찾고 콘솔에 접근해야 하므로 UI 내에서 처리하는 것이 훨씬 편리할 것입니다.

컴포넌트 생성에는 어느 정도 익숙합니다(플러그인 설계에는 아직 익숙하지 않지만 곧 배우고 싶습니다!). 컴포넌트로 이 기능을 구현할 수 있다면 — 가능하다면 — 커뮤니티를 위해 GitHub 링크를 definitely 제공하겠습니다!

2개의 좋아요

조금 전에 이 게시물을 떠올랐습니다. 혹시 다른 분들도 이 문제를 해결하는 데 도움이 될 수 있을 것 같아, 제가 결국 이 문제에 대해 적용한 해결책을 공유합니다!


원치 않는 작은 작업(small action) 게시물 삭제하기

이 작업을 수행하려면 아래 rails 스크립트가 필요합니다. 저는 이를 smalldelete.rb라고 이름 붙여 컨테이너 내부의 /var/www/discourse/script 경로에 배치했습니다.

또한, 삭제하려는 모든 작은 작업 게시물에 실제 게시물 본문 부분에 delete라는 단어를 넣어두어야 합니다. 이는 유지하고 싶은 게시물과 구별하기 위한 것입니다. 자동 올림(Auto Bump) 게시물에 제가 말씀드린 내용이 어떻게 적용되는지 예시를 보여드리겠습니다:

필요하다면 p.raw.strip.downcase == "delete" 라인을 다른 키워드로 수정하여 이 키워드를 변경할 수 있습니다.

smalldelete.rb 스크립트


class TopicCleaner
  def self.delete_small_actions(topic_id, dry_run: false)
    topic = Topic.find_by(id: topic_id)
    unless topic
      puts "Topic #{topic_id} not found"
      return
    end

    posts = topic.posts.where(post_type: Post.types[:small_action])
    to_delete = posts.select { |p| p.raw.strip.downcase == "delete" }

    if to_delete.empty?
      puts "No small action posts with 'delete' found in topic #{topic_id}"
      return
    end

    puts "Found #{to_delete.size} matching posts in topic ##{topic_id}"

    to_delete.each do |post|
      if dry_run
        puts "Would PERMANENTLY delete post ##{post.id} (created #{post.created_at}, by #{post.user.username})"
      else
        post.destroy()
        puts "🗑️ Permanently deleted post ##{post.id}"
      end
    end

    puts dry_run ? "Dry run complete — no posts deleted." : "Finished permanent cleanup of topic #{topic_id}"
  end
end

이 스크립트는 ID로 주제를 찾은 후, 해당 주제 내의 모든 게시물이 정의된 키워드만 포함하고 있는지 확인합니다. 조건이 충족되면 해당 특정 게시물을 삭제 대상으로 지정합니다.


스크립트가 설정되면 rails 콘솔로 이동하여 이를 로드할 수 있습니다:

load Rails.root.join("script/smalldelete.rb")

그리고 마지막으로 다음을 실행할 수 있습니다.

TopicCleaner.delete_small_actions(topic_id, dry_run: false)

dry_run 플래그도 포함되어 있으며, 원할 경우 영구적으로 삭제될 항목이 정확히 무엇인지 목록으로 확인할 수 있습니다.


물론 이러한 변경 사항은 완전히 외관상의 문제일 뿐이며, 소프트 삭제된 게시물은 본래 스태프가 아닌 멤버들에게 표시되지 않으므로 콘텐츠 측면에서는 차이가 없습니다.

하지만 저는 모든 것을 깔끔하고 정갈하게 유지하는 것을 특히 좋아하기 때문에, 일부 포럼 운영자가 이를 활용하고 싶어 할 수 있는 경우를 충분히 이해할 수 있습니다!

1개의 좋아요