削除されたユーザーが作成したカテゴリ説明投稿を復元できません

カテゴリが作成された後に、そのカテゴリを作成したユーザーが削除されたことがありました。ログを確認すると、ユーザーが削除された時点で、Discourse が自動的にそれらの投稿を削除したことがわかります。

このことが問題を引き起こしていることに気づいたのは、その後しばらく経ってからでした。管理者は影響を受けたカテゴリの説明投稿をまだ表示(および編集)できる一方で、一般ユーザーがそれらの投稿を表示しようとすると、代わりに「エラー;読み込み中に問題が発生しました」というメッセージが表示されます。

これらのカテゴリ説明投稿は赤い背景で表示されます。これらがいつ削除されたかは確認できますし、「削除取り消し」ボタンも表示されていますが、クリックしても何の反応もありません。

影響を受けたカテゴリの1つに移動し(編集ボタンをクリック)、説明編集ボタンをクリックすると、対応する削除された投稿に移動します。ここで変更を加えて保存し、ページをリフレッシュすると新しい説明が表示されます。しかし、一般ユーザーはまだ投稿の内容(エラーメッセージのみ)を見ることができません。

1つの投稿の所有者を自分の管理者アカウントに変更することはできましたが、「削除取り消し」ボタンは依然として機能しません。

Meta Discourse で同様の報告を見つけたのですが、これまでのところどのアドバイスも役に立ちませんでした。

Discourse API を使って同様に影響を受けた投稿の削除取り消しに成功したという事例を1つ見つけ、それについて調べ始めましたが、API ドキュメントで投稿の削除取り消しに関する記述は見つかりませんでした。詳細は Can't recover a topic by a deleted user を参照してください。

影響を受けたカテゴリを最初から再作成する必要がない解決策があることを願っています。

追記:これらの投稿の1つに対して「削除取り消し」ボタンをクリックすると、エラーログに以下のエントリが生成されます:

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. トピックの削除取り消し/復元を試みても機能しない
  5. 所有権の変更は技術的には機能するが、UI からどのような操作を行っても、トピックは奇妙な削除状態のまま残る

コンソールを確認すると、ユーザー削除時にトピックに関連付けられた posts レコードも削除されているようです。トピックレコードを various な投稿関連属性で確認すると、多くの値が 0 になっています。

エンジニアに、ここでもう少し graceful な処理ができないか検討してもらう価値があるかもしれませんが、言うは易し行うは難しだと思います。


コマンドラインを使用すれば、正常な状態に戻す回避策を見出せました。@jrivettcsa さん、これを試す前に必ずバックアップを取得することをお勧めします。

必要な値

後で使用する About トピックのコンテンツをメモ帳などにコピーしておいてから、以下の手順を実行してください。

Rails コンソールにアクセス

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

以下のコマンド内の <ABOUT_TOPIC_ID> をカテゴリの「About」トピック 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 タスクを実行してカテゴリ用の新しい About トピックを作成します。

exit
rake categories:create_definition

これでそのカテゴリは修正されました!必要に応じて、この手順を繰り返してください。

「いいね!」 6

はい、本来ならもっと良く分かっているはずの誰かが、不運な変更を加えてしまいました。それ以上は言えません。幸い、これらの事象は Discourse によってログに記録されています。

「いいね!」 1

問題の確認と解決策のご提示、ありがとうございます。試してみますので、その結果をこちらに投稿いたします。

「いいね!」 1

この解決策は完璧に機能しました。ありがとうございます!

それぞれ個別に修正しましたが、rails コンソールセッションで destroy_allupdate_all の処理をまとめて行い、最後に rake categories:create_definition コマンドを一度実行すればよかったかもしれません。どう思いますか?これで誰かが数分節約できるかもしれません。

「いいね!」 4

@jrivettcsa さん、これは明らかにバグです。ユーザーの削除でサイトが破損するようでは問題です。すぐに修正いたします。

「いいね!」 4

ご報告いただきありがとうございます。この PR で修正を行いました。

ユーザーが削除された場合、そのユーザーが投稿したカテゴリに関する投稿は削除され不再るようになりました。代わりに、投稿の著者は元のユーザーからシステムユーザーに変更されます。

「いいね!」 4