@@ -219,22 +219,6 @@ count に q.size を使うと、includes 済み relation のロード状況次
|
|||||||
- [ ] 履歴に URL/thumbnail 変更を残す
|
- [ ] 履歴に URL/thumbnail 変更を残す
|
||||||
- [ ] UI の項目と API を一致させる
|
- [ ] 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 しない
|
### 32. [P1] Material 更新時に file 未指定で既存ファイルを purge しない
|
||||||
|
|
||||||
@@ -265,37 +249,7 @@ URL のみ素材でも material.file.attach(file) が呼ばれる。nil attach
|
|||||||
- [ ] file.present? の時だけ attach する
|
- [ ] file.present? の時だけ attach する
|
||||||
- [ ] URL-only create の request spec を追加する
|
- [ ] 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 コメントに件数上限・長さ上限・削除を入れる
|
### 36. [P1] Theatre コメントに件数上限・長さ上限・削除を入れる
|
||||||
|
|
||||||
@@ -315,127 +269,6 @@ show/watching/next_post/comments が会場の開催期間をほぼ見ていな
|
|||||||
- [ ] コメント削除/非表示 API を追加する
|
- [ ] コメント削除/非表示 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 を作る
|
### 44. [P2] タグ統合 UI/API を作る
|
||||||
|
|
||||||
@@ -455,127 +288,7 @@ Tag.merge_tags! は存在するが、運用 UI/API がない。タグ整理基
|
|||||||
- [ ] dry-run と実行を分ける
|
- [ ] 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] 御意見番フォームを実装する
|
### 52. [P1] 御意見番フォームを実装する
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user