misskey icon indicating copy to clipboard operation
misskey copied to clipboard

削除されたノートのリプライ関係を保持するようにする

Open anatawa12 opened this issue 4 months ago • 14 comments

What

削除されたノートのリプライ関係とリモートの url を保持するようにします。

これにより、削除されたノートを挟んで会話を追うことができるようになります。

image

~~また、RemoteNoteCleaning によって削除されたノートについても remote で見ることができるようになります。~~ ~~リモートからの新しいノートの配送によって Note Cleaning によって削除されたノートが復活する際には同じ id を使用するようにしています。~~

~~Fixes https://github.com/misskey-dev/misskey/discussions/16232#discussioncomment-13796134~~

また、この uri => id の保持機構を使用して、管理者が削除したリモートのノートが復活することがないようにしました。

Fix #11437

Related #7342

Why

これにより、削除されたノートを挟んで会話を追うことができるようになります。

意図した挙動が保持されることだから。 see https://github.com/misskey-dev/misskey/issues/10659#issuecomment-3135607521 and related comments

~~また、RemoteNoteCleaning によって削除されたノートについても remote で見ることができるようになります。~~

~~リンク切れを避けるため。~~

この uri => id の保持機構を使用して、管理者が削除したリモートのノートが復活することがないようにしました。

モデレーションの理由。 #11437 また、別 id で同じ uri のノートが存在するとDeletedNoteテーブルの index 制約を将来的に違反して削除に失敗する可能性があるため。

Additional info (optional)

Checklist

  • [x] Read the contribution guide
  • [ ] Test working in a local environment
  • [ ] (If needed) Add story of storybook
  • [ ] (If needed) Update CHANGELOG.md
  • [ ] (If possible) Add tests

anatawa12 avatar Aug 02 '25 14:08 anatawa12

このPRによるapi.jsonの差分 差分はありません。 Get diff files from Workflow Page

github-actions[bot] avatar Aug 02 '25 15:08 github-actions[bot]

Codecov Report

:x: Patch coverage is 49.74093% with 194 lines in your changes missing coverage. Please review. :white_check_mark: Project coverage is 62.81%. Comparing base (988f5ab) to head (5c34fd4).

Files with missing lines Patch % Lines
...ges/backend/src/core/entities/NoteEntityService.ts 15.10% 118 Missing :warning:
packages/backend/src/server/api/GetterService.ts 31.03% 20 Missing :warning:
packages/backend/src/core/NoteDeleteService.ts 28.00% 18 Missing :warning:
packages/backend/src/core/NoteCreateService.ts 57.14% 9 Missing :warning:
packages/frontend/src/utility/get-note-menu.ts 0.00% 6 Missing and 3 partials :warning:
packages/backend/src/models/DeletedNote.ts 96.12% 5 Missing :warning:
packages/frontend/src/components/MkNote.vue 0.00% 3 Missing and 2 partials :warning:
...end/src/server/api/endpoints/notes/conversation.ts 33.33% 4 Missing :warning:
...ges/backend/src/server/api/endpoints/notes/show.ts 33.33% 4 Missing :warning:
...kages/frontend/src/components/MkSubNoteContent.vue 0.00% 2 Missing :warning:
Additional details and impacted files
@@             Coverage Diff             @@
##           develop   #16352      +/-   ##
===========================================
- Coverage    62.96%   62.81%   -0.15%     
===========================================
  Files         1150     1151       +1     
  Lines       115223   115548     +325     
  Branches      7921     7906      -15     
===========================================
+ Hits         72549    72585      +36     
- Misses       40514    40802     +288     
- Partials      2160     2161       +1     

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

:rocket: New features to boost your workflow:
  • :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

codecov[bot] avatar Aug 02 '25 15:08 codecov[bot]

もはや論理削除(noteテーブルでisDeletedを立てるの)でいいのではと思ったりするけど

tamaina avatar Aug 02 '25 15:08 tamaina

実装のシンプルさではnoteにdeletedAtみたいなカラム新設する方が優れてそうだけど、別にテーブルを作る実装にした理由ってあるかしら

syuilo avatar Aug 09 '25 11:08 syuilo

テキストとかを物理的に消すっためというのと、多くの場合は削除されているノートに対して操作を受け付けないので、すべての場所で削除されたノートかどうかのチェックを追加するより、限られた場所 (今回だとPackとendpoint2箇所の合計3箇所) でdeleted_noteにフォールバックするほうがミスも少ないと考えたためです。

https://nekolobby.niri.la/notes/aaz3h07ugg

deleted_noteを呼び出ししたいの、ノートを直接見るページのエンドポイント (つまり note/show と note/conversation くらいだと思う、漏れあったらsry) と、 Pack の detailed くらいで、削除チェックを回す必要があるのはすべてのタイムラインとすべてのノートの操作系のエンドポイント (fav clip reply renote reaction他) なので多くの場合は使わないなぁと

anatawa12 avatar Aug 09 '25 12:08 anatawa12

ほむん

syuilo avatar Aug 09 '25 13:08 syuilo

大きめだから2025.9.0かも

syuilo avatar Aug 13 '25 01:08 syuilo

機能の性質上、CASCADE削除無効化と同時に投入した方が良い感じはしますけれど…(後からmigrationとかでは対応出来ないような)

Sayamame-beans avatar Aug 13 '25 02:08 Sayamame-beans

レビュー力が回復するまで一ヶ月くらいかかりそう

syuilo avatar Aug 13 '25 02:08 syuilo

ノート作成のたびに、過去に削除されてないかチェックするのは無駄に感じるから、「管理者都合で削除したノートを復活させない」目的では別の仕組みで実現する方が良さそうな気がしている 例えばノートにも「凍結」(仮称)のような機能(何らかのフラグを追加して実質論理削除のようにする)を追加し、管理者は通常の削除か凍結かを選べるとか 凍結されたノートはDB上には(URIなど最低限の情報だけ)残っているため、ノート作成時のチェックが無くてもURIのユニーク制約に違反するため復活することがない

syuilo avatar Aug 19 '25 02:08 syuilo

また、別 id で同じ uri のノートが存在するとDeletedNoteテーブルの index 制約を将来的に違反して削除に失敗する可能性があるため。

なのでモデレーションの話は副作用として実装がすぐできたから実装したという感じです

anatawa12 avatar Aug 19 '25 03:08 anatawa12

レビュー力が回復するまで一ヶ月くらいかかりそう

そういえばこれどうなったかしら(入らないなら入らないなりに別の方法をトライするなどができそうだけど、話が止まっていそう)

tai-cha avatar Dec 08 '25 23:12 tai-cha

conflict resolved

anatawa12 avatar Dec 09 '25 14:12 anatawa12

Backend Memory Usage Comparison

Metric base head Diff
RSS 359.01 MB 361.02 MB 2.01 MB (.56%)

See workflow logs for details

github-actions[bot] avatar Dec 09 '25 14:12 github-actions[bot]

EmNote.vue, EmNoteDetailed.vueへの対応が不足していそうです

Sayamame-beans avatar Dec 15 '25 16:12 Sayamame-beans