以下が私の提案です:
- ユーザーがトピックを作成
- ユーザーがトピック投稿を削除し、削除をスケジュール(
delete_removed_posts_afterサイト設定を1に変更しました) - 指定された時間後にトピックが削除される
- スタッフがトピックを復元し、投稿の元のバージョンに戻す(「著者によってトピックが取り下げられ、フラグが付けられない限り1時間後に自動的に削除されます」というメッセージ付きで投稿を戻すには、復元のみが必要です)
- 一定時間後にトピックが再度削除される
何が起きているか: ユーザーが自身のトピック投稿を削除すると、user_deleted というプロパティが true に設定されます。DestroyOldDeletionStubs というバックグラウンドジョブが30分ごとに実行されます。このジョブは PostDestroyer.destroy_stubs 関数を実行し、データベースを検索して user_deleted が true に設定され、かつ「削除タイマー」が期限切れになった投稿を削除します。
問題点: スタッフが投稿を復元しても、user_deleted が false に設定されないため、次に DestroyOldDeletionStubs が実行された際に投稿が再度削除されてしまいます。
解決策: staff_recovered 関数に、user_deleted を false に設定するロジックを追加する必要があると思います(user_recovered はすでにこれを行っています)。詳細は discourse/lib/post_destroyer.rb at main · discourse/discourse · GitHub をご覧ください。
簡易的な対処法: トピック投稿を復元し、その投稿IDを取得した後、Railsコンソールにアクセスして以下のコマンドを実行します:
Post.find_by_id(POST_ID).update(user_deleted: false)
投稿IDは、トピックURLの末尾に .json を追加することで簡単に取得できます。例えば、このトピックの場合:https://meta.discourse.org/t/topic-keeps-getting-deleted/128013.json。トピック投稿IDは 632362 です。