삭제된 사용자가 만든 카테고리 설명 게시물을 복구할 수 없음

일부 카테고리가 생성된 후, 해당 카테고리를 생성한 사용자가 삭제되었습니다. 로그를 확인해 보니, 사용자가 삭제된 시점에 Discourse가 해당 게시글들을 자동으로 삭제한 것을 알 수 있었습니다.

이 문제가 어떤 영향을 미칠지 인지하지 못한 채 시간이 흘러, 관리자만 해당 카테고리 설명 게시글을 볼 수 있고(수정도 가능하지만), 일반 사용자가 해당 게시글을 보기 시도하면 다음과 같은 오류 메시지가 표시된다는 사실이 밝혀졌습니다: “Error; while trying to load; Something went wrong.”

해당 카테고리 설명 게시글들은 빨간색 배경으로 표시됩니다. 게시글이 삭제되었고 언제 삭제되었는지는 확인할 수 있습니다. ‘undelete’(삭제 해제) 버튼도 보이지만, 클릭해도 아무런 반응이 없습니다.

영향을 받은 카테고리 중 하나의 설정으로 이동(편집 버튼 클릭)하여 ‘Edit Description’(설명 편집) 버튼을 클릭하면, 해당 삭제된 게시글로 이동합니다. 내용을 수정하고 저장한 후 페이지를 새로고침하면 새로운 설명이 표시됩니다. 하지만 일반 사용자는 여전히 게시글 내용을 볼 수 없고(오류만 표시됨) 마찬가지입니다.

게시글 중 하나의 소유권을 제 관리자 계정으로 변경할 수는 있었지만, 삭제 해제 버튼은 여전히 아무런 동작을 하지 않습니다.

Meta Discourse에서 비슷한 보고를 찾았지만, 지금까지 제시된 조언은 도움이 되지 않았습니다.

Discourse API를 사용하여 유사한 문제가 발생한 게시글을 삭제 해제한 사례를 한 건 발견하여 이에 대해 조사하기 시작했지만, API 문서에서 게시글 삭제 해제에 관한 내용을 찾을 수 없었습니다. Can't recover a topic by a deleted user 를 참고하세요.

영향을 받은 카테고리를 처음부터 다시 만드는 것을 포함하지 않는 해결책이 있기를 바랍니다.

업데이트: 이 게시글 중 하나의 삭제 해제 버튼을 클릭하면 오류 로그에 항목이 생성됩니다:

Url: mysite/assets/ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js
Line: 1
Column: 266460
Window Location: mysite/t/about-the-showcases-and-use-cases-category/28```
3개의 좋아요

누군가가 카테고리를 생성한 사용자에게 삭제 명령을 내린 건가요? 이 사용자를 익명 처리하는 대신 삭제한 특별한 이유가 있나요?

카테고리 설명 주제는 카테고리를 생성한 사용자가 소유하게 되므로, 해당 사용자(그리고 모든 게시글)를 삭제하면 이런 문제가 발생할 수 있습니다. @tshenry 다음 주에 이 시나리오를 테스트해 볼 수 있을까요?

3개의 좋아요

방금 빠르게 테스트해 보았으며 동일한 결과를 재현할 수 있었습니다.

  1. 관리자 계정으로 카테고리를 생성합니다.
  2. 해당 사용자의 관리자 권한을 취소하고 사용자를 삭제합니다.
  3. 사용자가 삭제되면 해당 카테고리의 “소개”(About) 토픽이 소프트 삭제됩니다.
  4. 토픽을 복원(undelete)하려고 해도 작동하지 않습니다.
  5. 소유권을 변경하는 것은 기술적으로 작동하지만, UI에서 무엇을 하든 토픽은 이상한 삭제 상태로 남아 있습니다.

콘솔을 확인해 보면, 사용자가 삭제될 때 토픽과 연관된 posts 레코드가 삭제되는 것으로 보입니다. 토픽 레코드를 보면 포스트 관련 여러 속성 값이 0으로 설정되어 있습니다.

개발자가 이 부분을 좀 더 우아하게 처리할 수 있는지 살펴보는 것이 가치가 있을 수 있지만, 말처럼 쉽지 않을 것 같습니다.


정상적인 상태로 되돌리기 위한 우회 방법을 찾았지만, 명령줄을 사용해야 했습니다. @jrivettcsa 님은 시도하기 전에 백업을 해 두시는 것을 권장합니다:

필요한 값

나중에 사용할 “소개” 토픽의 내용을 메모장 등에 복사해 두었다가 다음 단계를 진행하세요:

Rails 콘솔을 시작합니다.

cd /var/discourse
./launcher enter app
rails c

아래 명령어에서 <ABOUT_TOPIC_ID>를 카테고리의 “소개” 토픽 ID로 대체한 후 실행하여 손상된 토픽을 하드 삭제합니다.

Topic.where(id: <ABOUT_TOPIC_ID>).destroy_all

필요할 경우 q 키를 눌러 콘솔로 돌아가세요.

카테고리는 여전히 손상된 토픽과 연관되어 있으므로 이를 해제해야 합니다. 아래 명령어에서 <CATEGORY_ID>를 카테고리 ID로 대체한 후 실행합니다.

Category.where(id: <CATEGORY_ID>).update_all(topic_id: nil)

필요할 경우 q 키를 눌러 콘솔로 돌아가세요.

Rails 콘솔을 종료하고 아래 rake 작업을 실행하여 카테고리에 새로운 소개 토픽을 생성합니다:

exit
rake categories:create_definition

이제 해당 카테고리가 수정되었어야 합니다! 필요할 때마다 이 과정을 반복할 수 있습니다.

6개의 좋아요

네, 더 잘 알았어야 할 누군가에 의해 불행한 변경 사항이 적용되었습니다. 더 이상 말씀드릴 수 없습니다. 다행히도 이러한 사항은 Discourse에 기록됩니다.

1개의 좋아요

문제를 확인해 주시고 해결 방법을 알려주셔서 감사합니다. 시도해 본 후 결과를 여기에 공유하겠습니다.

1개의 좋아요

이 솔루션이 완벽하게 작동했습니다. 감사합니다!

각 항목을 개별적으로 수정했지만, 사실 하나의 rails 콘솔 세션에서 destroy_all과 update_all 작업을 한 번에 처리한 뒤, 마지막에 rake categories:create_definition 명령을 한 번만 실행할 수도 있었을 것 같습니다. 어떻게 생각하시나요? 누군가 몇 분을 절약할 수 있을지도 모르겠습니다.

4개의 좋아요

@jrivettcsa, 이건 확실히 버그입니다. 사용자 삭제 시 사이트가 깨질 수 있다는 건 큰 문제예요.我们会尽快 수정하겠습니다.

4개의 좋아요

해당 문제를 등록해 주셔서 감사합니다. 이 PR에서 수정했습니다.

사용자가 삭제되면 해당 카테고리를 설명하는 게시물이 더 이상 삭제되지 않습니다. 대신 게시물의 작성자가 원래 사용자에서 시스템 사용자로 변경됩니다.

4개의 좋아요