diff --git a/%E8%AA%B2%E9%A1%8C%E6%95%B4%E7%90%86.md b/%E8%AA%B2%E9%A1%8C%E6%95%B4%E7%90%86.md index cfc36df..ca25f63 100644 --- a/%E8%AA%B2%E9%A1%8C%E6%95%B4%E7%90%86.md +++ b/%E8%AA%B2%E9%A1%8C%E6%95%B4%E7%90%86.md @@ -219,22 +219,6 @@ count に q.size を使うと、includes 済み relation のロード状況次 - [ ] 履歴に URL/thumbnail 変更を残す - [ ] UI の項目と API を一致させる -# - -### 31. [P2] NicoTagsController の cursor / id エラーを 400/404 にする - -**種別**: bug - -**対象** -- `backend/app/controllers/nico_tags_controller.rb` - -**背景 / 問題** -cursor に不正 ISO8601 が来た場合や存在しない id の更新で 500 系になりうる。外部入力なので明示的に 400/404 を返すべき。 - -**完了条件** -- [ ] 不正 cursor は 400 -- [ ] 存在しない nico tag は 404 -- [ ] エラー JSON を統一する ### 32. [P1] Material 更新時に file 未指定で既存ファイルを purge しない @@ -265,37 +249,7 @@ URL のみ素材でも material.file.attach(file) が呼ばれる。nil attach - [ ] file.present? の時だけ attach する - [ ] URL-only create の request spec を追加する -### 34. [P1] Material の tag_id 一意制約を discarded_at と整合させる -**種別**: data integrity - -**対象** -- `backend/app/models/material.rb` -- `backend/db/migrate/20260329034700_create_materials.rb` - -**背景 / 問題** -Material は MyDiscard を使うが tag_id uniqueness が破棄済みも含んでしまう。削除後に同じタグの素材を作れない。 - -**完了条件** -- [ ] 有効レコードだけ一意にする生成列/部分相当 index を作る -- [ ] model validation も kept に合わせる -- [ ] discard 後の再作成 spec を追加する - -### 35. [P1] Theatre の opens_at / closes_at を API で強制する - -**種別**: bug / moderation - -**対象** -- `backend/app/controllers/theatres_controller.rb` -- `backend/app/controllers/theatre_comments_controller.rb` - -**背景 / 問題** -show/watching/next_post/comments が会場の開催期間をほぼ見ていない。閉場後も入室・コメント・進行できると運用上混乱する。 - -**完了条件** -- [ ] 未開場・閉場後の挙動を決める -- [ ] watching/comment/next_post で期間チェックする -- [ ] 閉場後は閲覧だけ可など仕様化する ### 36. [P1] Theatre コメントに件数上限・長さ上限・削除を入れる @@ -315,127 +269,6 @@ show/watching/next_post/comments が会場の開催期間をほぼ見ていな - [ ] コメント削除/非表示 API を追加する - [ ] 削除履歴を残す -### 37. [P2] Theatre next_post の候補抽出を URL 部分一致からサイト別判定へ変える - -**種別**: bug / quality - -**対象** -- `backend/app/controllers/theatres_controller.rb` -- `frontend/src/components/PostEmbed.tsx` - -**背景 / 問題** -next_post は nicovideo.jp / youtube.com を含む URL だけで候補にしている。watch URL 以外や youtu.be などの漏れ/誤爆が出る。 - -**完了条件** -- [ ] 投稿 URL から embed 対応種別を判定する service を作る -- [ ] next_post は embedable な投稿だけ選ぶ -- [ ] youtu.be 等にも対応する - -### 38. [P2] Theatre のホストブラウザ依存進行をサーバ主導へ寄せる - -**種別**: architecture / feature - -**対象** -- `backend/app/controllers/theatres_controller.rb` -- `frontend/src/pages/theatres/TheatreDetailPage.tsx` - -**背景 / 問題** -現状の自動進行はホスト側ブラウザのタイマーに依存する。ホスト端末がスリープすると会場が止まる。実験機能としてはよいが、一般公開で推すなら弱い。 - -**完了条件** -- [ ] サーバ側で現在投稿の終了判定を持つか決める -- [ ] 定期 job / polling / manual next の責務を整理する -- [ ] ホスト不在時の移譲ルールを明記する - -### 39. [P2] Theatre 一覧・作成・編集 API/UI を追加する - -**種別**: feature - -**対象** -- `backend/config/routes.rb` -- `backend/app/controllers/theatres_controller.rb` -- `frontend/src/pages/theatres/*` -- `frontend/src/components/TopNav.tsx` - -**背景 / 問題** -現在のトップメニューは /theatres/1 固定。複数会場や運用にはならない。 - -**完了条件** -- [ ] GET /theatres を作る -- [ ] POST/PATCH /theatres を作る -- [ ] 会場一覧・作成・編集画面を作る -- [ ] 権限と公開期間を設定できる - -### 40. [P2] 存在しない /users/:id 導線を実装するかリンクを消す - -**種別**: bug / UX - -**対象** -- `frontend/src/pages/wiki/WikiHistoryPage.tsx` -- `frontend/src/pages/posts/PostHistoryPage.tsx` -- `frontend/src/pages/tags/TagHistoryPage.tsx` -- `frontend/src/components/TagDetailSidebar.tsx` -- `backend/config/routes.rb` - -**背景 / 問題** -複数画面が /users/:id へリンクしているが、対応 route/page/API がない。クリックした瞬間に迷子になる。 - -**完了条件** -- [ ] ユーザ詳細 API/UI を実装する、またはリンクをやめる -- [ ] bot/null user の表示を統一する -- [ ] 既存 #169/#170 と統合する - -### 41. [P1] ユーザ一覧・詳細・ロール変更の管理 UI を作る - -**種別**: feature / admin - -**対象** -- `backend/app/controllers/users_controller.rb` -- `frontend/src/pages/users/*` - -**背景 / 問題** -member/admin 昇格、BAN、編集履歴確認の導線がない。一般公開前の運用装備として必須。 - -**完了条件** -- [ ] admin 向け users index/show を作る -- [ ] role 変更 API を作る -- [ ] BAN/解除 API を作る -- [ ] 操作履歴を残す - -### 42. [P2] settings テーブルを実利用する API/UI を作る - -**種別**: feature - -**対象** -- `backend/db/migrate/20250227212500_create_settings.rb` -- `backend/app/models/user.rb` -- `frontend/src/pages/users/SettingPage.tsx` - -**背景 / 問題** -settings テーブルはあるが、表示名/引継ぎコード以外のユーザ設定に接続されていない。 - -**完了条件** -- [ ] GET/PUT /settings または /users/settings を作る -- [ ] テーマ、カテゴリ色、ミュートタグ、非表示タグ、埋め込み自動再生を段階的に実装する -- [ ] 設定 key の型とバリデーションを決める - -### 43. [P1] タグ別名の作成・解除・履歴表示 UI を専用化する - -**種別**: feature - -**対象** -- `frontend/src/pages/tags/TagDetailPage.tsx` -- `backend/app/controllers/tags_controller.rb` -- `backend/app/models/tag_name.rb` - -**背景 / 問題** -現状は TagDetailPage のテキスト欄に空白区切りで aliases を突っ込む形。誤操作の破壊力が大きい。 - -**完了条件** -- [ ] 別名追加/解除を個別操作にする -- [ ] 別名が既存タグ/Wiki を持つ場合のエラーを丁寧に出す -- [ ] 変更履歴を見える化する -- [ ] 既存 #165 と統合する ### 44. [P2] タグ統合 UI/API を作る @@ -455,127 +288,7 @@ Tag.merge_tags! は存在するが、運用 UI/API がない。タグ整理基 - [ ] dry-run と実行を分ける - [ ] 統合履歴を残す -### 45. [P2] タグ上位関係の管理画面を作る - -**種別**: feature - -**対象** -- `backend/app/controllers/tags_controller.rb` -- `frontend/src/pages/tags/*` -**背景 / 問題** -上位タグ API はあるが管理 UI が薄い。タグ体系の骨格なのに手操作が危険。 - -**完了条件** -- [ ] 親候補補完つき UI を作る -- [ ] 循環検出結果を表示する -- [ ] 追加/削除を個別履歴として残す - -### 46. [P2] タグ詳細ページの責務を決める - -**種別**: design - -**対象** -- `frontend/src/pages/tags/TagDetailPage.tsx` -- `frontend/src/components/TagDetailSidebar.tsx` -- `frontend/src/pages/wiki/WikiDetailPage.tsx` - -**背景 / 問題** -タグ詳細を管理中心にするのか、Wiki を詳細ページにするのかが曖昧。両方を育てると導線が割れる。 - -**完了条件** -- [ ] タグ詳細と Wiki の責務表を作る -- [ ] 通常ユーザ導線と管理者導線を分ける -- [ ] TagLink の遷移先を統一する - -### 47. [P2] 投稿から別投稿へのタグ・インポート機能を作る - -**種別**: feature - -**対象** -- `frontend/src/components/PostEditForm.tsx` -- `backend/app/controllers/posts_controller.rb` - -**背景 / 問題** -類似投稿やシリーズ投稿では、既存投稿のタグをコピーして微修正したい。既存 #292 の実装候補。 - -**完了条件** -- [ ] 投稿 ID/URL からタグを読み込める -- [ ] nico タグと手入力タグの扱いを分ける -- [ ] 差分確認してから反映する - -### 48. [P2] 投稿編集時のタグ推薦を実装する - -**種別**: feature / ML-lite - -**対象** -- `backend/app/models/post_similarity.rb` -- `backend/app/models/tag_similarity.rb` -- `frontend/src/components/PostEditForm.tsx` - -**背景 / 問題** -post_similarities / tag_similarities があるなら、編集時に「付け忘れ候補」を出せる。既存 #168 と相性がよい。 - -**完了条件** -- [ ] 現在タグと類似投稿から候補タグを返す API を作る -- [ ] 候補理由を表示する -- [ ] ワンクリック追加できる - -### 49. [P2] 類似度計算を差分更新できるようにする - -**種別**: performance / ops - -**対象** -- `backend/lib/tasks/post_similarity.rake` -- `backend/lib/tasks/tag_similarity.rake` -- `backend/app/models/post_similarity.rb` -- `backend/app/models/tag_similarity.rb` - -**背景 / 問題** -類似度が全再計算前提だと、データ増加後にバッチが重くなる。タグ変更時の差分更新か、夜間全再計算の運用設計が必要。 - -**完了条件** -- [ ] 全再計算の所要時間を測る -- [ ] 差分更新対象を定義する -- [ ] 失敗時の再実行手順を README に書く - -### 50. [P1] post_versions / tag_versions / wiki_versions の復元専用 API を作る - -**種別**: feature / audit - -**対象** -- `backend/app/controllers/post_versions_controller.rb` -- `backend/app/controllers/tag_versions_controller.rb` -- `backend/app/controllers/wiki_pages_controller.rb` -- `frontend/src/pages/posts/PostHistoryPage.tsx` -- `frontend/src/pages/tags/TagHistoryPage.tsx` - -**背景 / 問題** -現状の復元は通常 update に過去値を投げる形。復元操作としての意味が履歴上で曖昧になる。 - -**完了条件** -- [ ] POST /post_versions/:id/restore 等を作る -- [ ] event_type restore を記録する -- [ ] 復元者と復元元 version_no を保存する -- [ ] UI に「この版へ戻す」を出す - -### 51. [P1] 投稿・タグ・Wiki の削除/復元導線を整理する - -**種別**: moderation / feature - -**対象** -- `backend/app/models/my_discard.rb` -- `backend/app/controllers/*` -- `frontend/src/pages/*` - -**背景 / 問題** -Discard は複数モデルに入っているが、公開 UI/API と復元導線が揃っていない。荒らし対応には削除より復元可能な非表示が重要。 - -**完了条件** -- [ ] 対象モデルごとの discard/restore API を決める -- [ ] 管理画面から復元できる -- [ ] 削除履歴が残る -- [ ] 一般ユーザには非表示になる ### 52. [P1] 御意見番フォームを実装する