사용자가 카테고리의 "정보" 게시물을 삭제했습니다

한 사용자가 자신의 모든 게시물을 삭제했는데, 그 중 하나가 특정 카테고리의 “소개” 게시물이었습니다. 해당 게시물을 복원하고 소유권을 시스템 계정으로 변경했지만, 관리자 계정으로 접속하면 여전히 "삭제됨"으로 표시되고, 일반 사용자가 해당 게시물을 방문하면 오류가 발생합니다:

오류가 발생하는 해당 게시물: About the Music category - Music - KGLW.net Forum

해당 카테고리: Music - KGLW.net Forum

이 문제를 해결하는 방법이 있을까요?

(이런 상황을 방지하기 위해 모든 카테고리 “소개” 게시물을 시스템 계정에 할당해야 하나요?)

3개의 좋아요

안녕하세요,

이 방법으로 될지 확실하지는 않지만, 게시물의 HTML을 다시 빌드해 보세요. 세 개의 점(…) → 렌치 → "HTML 다시 빌드"를 클릭하면 됩니다.

1개의 좋아요

About 토픽은 삭제할 수 없도록 설계되어 있는데, 어떻게 삭제할 수 있었는지는 완전히 명확하지 않습니다. :thinking:

이 일이 어떻게 발생했는지 좀 더 자세히 설명해 주시겠어요? 해당 카테고리를 그들이 만든 건가요?

4개의 좋아요

사용자 관리 페이지의 모든 게시물 삭제 버튼을 사용하면 소개 게시물이 삭제됩니다. (다른 경우에는 소유권이 @system으로 이전됩니다)

새로운 카테고리를 만들고 모든 주제를 그 카테고리로 이동한 후, 기존 카테고리를 삭제할 수 있습니다. 하지만 이것은 수정이라기보다는 우회책에 가깝습니다.

이건 좀 아쉬운 우회 방법입니다. :thinking:

다만 제 테스트 사이트에서 재현해 보니 삭제 해제만 하면 바로 다시 복원되더군요. 그래서 이 특정 문제가 정확히 무엇인지 잘 모르겠습니다.

Rails 콘솔을 통해 소개 주제의 topic_id를 새로운 것으로 교체하는 것은 가능하지만, UI를 통한 '새 카테고리 전환’이 더 쉬운 방법일 수 있습니다.

2개의 좋아요

게시물의 소유권을 시스템으로 변경한 후 삭제 되돌리기를 수행할 때 문제가 발생합니다.

2개의 좋아요

우리가 같은 일을 하고 있는지 확인하기 위해 단계별 설명이 필요할 것 같습니다. 게시글만 삭제된 것이 아니라 사용자 자체가 삭제된 것으로 보이는데, 맞나요?

3개의 좋아요

두 가지 문제가 특히 불운하게 결합되어 있습니다.

  1. 사용자 관리 페이지에서 "모든 게시물 삭제"를 사용하면 “카테고리에 대해” 게시물이 삭제됩니다. (다만, 이를 복구할 수는 있습니다.)

  2. 작성자가 삭제된 게시물을 삭제한 후, 게시물을 복구하기 전에 소유권을 변경하면 게시물을 복구할 수 없습니다. (우회 방법으로 주제를 삭제하고 다시 복구할 수 있습니다. 이렇게 하면 첫 번째 게시물이 복구됩니다.)

따라서 다음과 같은 경우:

  • 테스트 사용자와 테스트 카테고리를 생성하고,
  • “카테고리에 대해” 주제 소유자를 테스트 사용자로 설정하고,
  • 사용자 관리 페이지에서 해당 사용자의 모든 게시물을 삭제하고,
  • (선택 사항) 테스트 사용자가 소유한 다른 주제를 생성하고,
  • (선택 사항) 다른 사용자로 두 주제에 답글을 달고,
  • 테스트 사용자를 삭제하고,
  • “카테고리에 대해” 주제(및 다른 주제)의 소유권을 변경하고,
  • 게시물 복구를 시도하면,

게시물을 복구할 수 없어 오류가 발생합니다. 참고: 주제 내 답글은 다른 사용자에게 표시되지만, 첫 번째 게시물은 볼 수 없습니다.

2번에 대한 우회 방법은 작동하지 않습니다. “카테고리에 대해” 주제를 삭제할 권한이 없기 때문입니다.

6개의 좋아요

네, 사용자가 해당 카테고리를 직접 만든 것 같습니다.

"Rebuild HTML"을 실행해도 아무런 변화가 없습니다.

새 카테고리를 만들고 기존 카테고리와 교체하는 방법을 고려할 수 있지만, 그렇게 하면 기존 카테고리에 구독/음소거/기타 설정을 해둔 사용자들도 새 카테고리에서 다시 설정해야 하는 건가요?

Rails 콘솔에는 두려움이 없으므로, 새로운 topic_id를 할당하는 것이 구조적으로 더 ‘올바른’ 방식이라면 그쪽으로 기울고 있습니다. 다만 실행할 구체적인 명령어에 대한 안내가 있으면 좋겠습니다. Category.find(10).topic_id = 723 …과 같은 형태인가요?

한편으로는:

…이것이 더 빠른 해결책일까요? (다만 렌치 아이콘 메뉴에서 "Archive Topic"만 보이고 "Delete Topic"는 보이지 않는데…)

여기 다른 분들만큼 이 문제를 철저히 테스트해 보지는 않았습니다(감사합니다!!) 하지만 첫 번째 게시물에서 언급된 문제의 해결책은 꽤 단순해 보입니다.

  • 사이트 관리자/운영자(모더레이터)가 사용자 관리(User Admin)에서 소개 주제(About topics)를 삭제하는 것을 허용하지 말 것

위와 같은 시도가 이루어질 경우 이를 차단하고 유용한 오류 메시지를 표시해야 합니다. 위에서 언급한 경우 소개 주제를 삭제할 수 있다는 것은 버그이므로, 해당 문제를 Contribute > Bug 카테고리로 이동시키고 있습니다.

방금 테스트 사용자를 생성하고, 그 계정으로 카테고리를 만든 후 사용자 관리에서 해당 사용자를 삭제해 보았습니다. 사용자가 주제(topic)를 가지고 있음에도 불구하고 사용자 관리에서 직접 사용자를 삭제할 수 있었습니다. 소개 주제의 작성자는 시스템 사용자(System user)로 변경되었습니다! 따라서 이 사용 사례는 적어도 이 측면에서는 꽤 안전한 것 같습니다.

또한 자기 삭제(self deletion) 사례도 시도해 보았습니다(계정 삭제 버튼을 보려면 먼저 사용자를 강등시켜야 합니다). 이 사용자를 삭제해도 주제 작성자는 시스템으로 넘어갔습니다. 또한 delete user self max post count의 기본값이 1로 설정되어 있다는 것을 확인했습니다. 이는 기본적으로 사용자가 주제 하나 이상을 가지고 있을 경우 스스로를 삭제할 수 없음을 의미합니다. 따라서 여기서는 어쨌든 안전합니다.

그리고 사용자 관리를 통한 사용자 삭제도 테스트해 보았습니다. 흥미롭게도, 소개 주제 하나만 있을 때는 게시물 삭제 버튼이 나타나지 않았습니다. 하지만 두 번째 주제를 생성한 후에는 게시물 삭제 버튼이 나타났습니다. 버튼을 선택하고 확인을 위해 긴 텍스트를 입력한 후 작동했습니다 - 소개 주제를 포함하여 사용자의 게시물을 삭제할 수 있었습니다. 드디어 재현(repro)에 성공했습니다! :wink:

마지막으로, 일괄 작업(bulk actions)을 사용하여 소개 주제를 삭제하는 것도 가능했습니다. 또 다른 재현 성공! 아, 이제 보니 일괄 작업으로 About 주제를 삭제하는 재현은 되지 않는 것 같습니다. 그냥 조용히 실패할 뿐입니다.

위 내용을 고려할 때, 사용자 삭제(사용자 관리 및 자기 삭제) 사례는 작성자가 시스템으로 넘어가므로 무시할 수 있습니다.

1개의 좋아요

또한 about 게시글을 다른 주제로 이동시켜 보았습니다. 이동은 잘 되지만 삭제 타이머가 표시되고, x일 후 주제가 삭제되지 않습니다. 타이머가 그냥 사라지네요. 그래서 이 부분은 정상적으로 작동합니다.

1개의 좋아요

@alxndr 님, 상황을 해결하셨나요?

2개의 좋아요

이렇게 하면 앞으로 이런 일이 일어나는 것을 방지할 수 있을 것입니다.

그럼에도 불구하고, 현재 system 사용자가 소유한 게시물임에도 불구하고 사용자가 이 카테고리의 “About” 게시물을 읽으려 할 때 오류 페이지를 확인하고 있는 상황에서 어떻게 복구해야 할까요?

아직 아무것도 시도해 보지 않았습니다. “네, 그게 올바른 명령입니다” 또는 "아니요, 그렇게 하면 모든 것이 망가집니다"라고 누군가 먼저 의견을 제시해 주기를 바라고 있었거든요…

2개의 좋아요

제가 전에 시도했을 때 사용한 형식은 아마도 이거였던 것 같습니다:

Category.where(id: CAT_ID).update(topic_id: NEW TOPIC_ID)

하지만 API를 이용해 원래 토픽을 삭제 해제하는 것도 가능한지 궁금합니다. :thinking:

@alxndr 직접 호스팅을 하고 있는지, 아니면 저희 호스팅을 이용하고 있는지 확인해 주실 수 있을까요? 만약 저희 호스팅을 이용 중이시거나 저희 호스팅으로 전환하실 경우, 지원 팀에 문의하시면 기술 지원 담당자가 문제를 해결해 드릴 수 있습니다.

제가 그 자리에 있다면, 새로운 카테고리를 만들고 모든 주제를 그 카테고리로 옮기는 것이 가장 직관적이고 간단한 방법이라고 생각합니다.

만약 rails 콘솔이나 API를 실험하기로 결정하신다면, 이는 아직 검증되지 않은 영역이므로 변경 사항을 되돌려야 할 경우를 대비해 사이트 전체를 백업해 두시는 것이 좋습니다!

1개의 좋아요

하 :slight_smile: 내 조언을 잘 믿지 않는 것 같네요 @tobiaseigen :slight_smile:

rails 콘솔보다 API를 사용하는 것이 더 안전한 옵션이지만, 해당 상황 때문에 이 특정 주제를 성공적으로 복구할 수 있을지는 명확하지 않습니다.


UI에서 유사한 시도가 차단되었기 때문에 API가 작동할지 확신이 없었지만, 일부 성공을 거둔 것 같습니다 (:partying_face:).

이 경우, 게시글의 undelete 옵션이 하려던 것(주제 복구)이 아니라 게시글을 복구하기 위한 엔드포인트를 사용했습니다:

/posts/POST_ID/recover

4개의 좋아요

네, 자체 호스팅입니다.

1개의 좋아요

“이 게시물 undelete” 버튼은 이 엔드포인트를 사용하는 것 같지만, errorThrown이 비어 있고 textStatus: "error"인 403 오류를 반환합니다.

하지만 웹 UX가 아닌 API를 통해 동일한 라우트를 사용하면 작동했다는 말씀이신가요?

테스트 결과, 삭제 취소 버튼이 토픽 복구 엔드포인트(/t/TOPIC_ID/recover)를 사용하려고 시도하며 403 오류를 발생시키고 있었습니다. 대신 게시글 복구 버전을 사용했을 때는 정상적으로 작동하는 것으로 보였습니다.

확인해 주실 수 있을까요?

2개의 좋아요

아, 설명해 주셔서 감사합니다. 말씀이 맞습니다.

개별 게시물의 ID를 어떻게 식별해야 하는지 잘 모르겠습니다. 카테고리 ID는 10이고, 토픽 ID는 723인 것 같네요?
업데이트: 아, 찾았어요! <article> DOM 요소에 data-post-id가 있네요…

API 문서… 에서 이 엔드포인트를 찾을 수 없습니다… PUT 요청이어야 하나요? 데이터를 포함해야 하나요?
업데이트: 네, 데이터를 포함하지 않는 PUT 요청이었습니다 — 작동했습니다! @JammyDodger 님, 감사합니다!!

2개의 좋아요