Browse Source

feat(spec): add requirements for news-inappnotification

Ryotaro Nagahara 2 weeks ago
parent
commit
f35d2b2539

+ 19 - 18
.kiro/specs/news-inappnotification/requirements.md

@@ -2,7 +2,9 @@
 
 
 ## Introduction
 ## Introduction
 
 
-GROWI の InAppNotification にニュース配信・表示機能を追加する。外部の静的 JSON フィード(GitHub Pages)を GROWI 本体が cron で定期取得し、ローカル MongoDB にキャッシュした上で、InAppNotification の各 UI(ドロップダウン、サイドバー、通知ページ)にニュースとして表示する。ユーザーごとの既読/未読管理、ロール別の表示制御、多言語対応を含む。
+GROWI の InAppNotification にニュース配信・表示機能を追加する。外部の静的 JSON フィード(GitHub Pages)を GROWI 本体が cron で定期取得し、ローカル MongoDB にキャッシュした上で、InAppNotificationパネルおよび通知一覧ページにニュースとして表示する。
+
+ニュースは既存の InAppNotification とは別モデル(NewsItem)として管理する。InAppNotification はユーザーアクション起因で関係者のみに配信されるのに対し、ニュースは全ユーザー(またはロール単位)に配信されるため、1件のニュースを全ユーザーで共有する設計が SaaS 規模で効率的である。UI ではクライアント側で両データを時系列マージして統合表示する。
 
 
 ## Requirements
 ## Requirements
 
 
@@ -45,15 +47,16 @@ GROWI の InAppNotification にニュース配信・表示機能を追加する
 
 
 ### Requirement 4: ロール別表示制御
 ### Requirement 4: ロール別表示制御
 
 
-**Objective:** As a GROWI 管理者, I want ニュースの表示対象をロールで制御したい, so that 管理者向け情報を一般ユーザーに見せない
+**Objective:** As a GROWI 運営者, I want ニュースの表示対象をロールで制御したい, so that 管理者向け情報を一般ユーザーに見せない
+
+**Note:** 表示制御はニュース配信側(GROWI運営)がフィードJSON内の `conditions.targetRoles` で指定する。インスタンス側(GROWI管理者)による制御は設けない。
 
 
 #### Acceptance Criteria
 #### Acceptance Criteria
 
 
 1. When ニュースアイテムに `conditions.targetRoles` が設定されている場合, the News API shall ユーザーのロール(admin/general)に基づいてフィルタリングする
 1. When ニュースアイテムに `conditions.targetRoles` が設定されている場合, the News API shall ユーザーのロール(admin/general)に基づいてフィルタリングする
-2. Where GROWI の設定で `app:newsTargetRole` が `admin_only` に設定されている場合, the News API shall 管理者以外のユーザーにはニュースを返却しない
-3. When ニュースアイテムに `conditions.targetRoles` が未設定の場合, the News API shall 全ユーザーにニュースを表示する
+2. When ニュースアイテムに `conditions.targetRoles` が未設定の場合, the News API shall 全ユーザーにニュースを表示する
 
 
-### Requirement 5: InAppNotification UI 統合
+### Requirement 5: InAppNotification UI 統合表示
 
 
 **Objective:** As a GROWI ユーザー, I want 既存の InAppNotification UI でニュースを確認したい, so that 通知と同じ導線でニュースにアクセスできる
 **Objective:** As a GROWI ユーザー, I want 既存の InAppNotification UI でニュースを確認したい, so that 通知と同じ導線でニュースにアクセスできる
 
 
@@ -61,15 +64,15 @@ GROWI の InAppNotification にニュース配信・表示機能を追加する
 
 
 #### Acceptance Criteria
 #### Acceptance Criteria
 
 
-1. The InAppNotification ドロップダウン shall 通知とニュースを公開日時/作成日時の降順で混合した1つのリストとして表示する
-2. The InAppNotification ドロップダウン shall フィルタタブ(「すべて」「通知」「ニュース」)を提供し、デフォルトは「すべて」とする
-3. The InAppNotification ドロップダウン shall 通知設定ページへのリンクボタンを提供する
-4. The InAppNotification サイドバー shall ニュースセクションを通知リストの上部に表示す
-5. The InAppNotification ページ (/me/all-in-app-notifications) shall 「ニュース」タブを提供し、全ニュースアイテムを一覧表示する
+1. The InAppNotificationパネル shall 通知とニュースを公開日時/作成日時の降順で混合した1つのリストとして表示する
+2. The InAppNotificationパネル shall 上部にフィルタボタン(「すべて」「通知」「お知らせ」)を配置し、デフォルトは「すべて」とする。「お知らせ」選択時はニュースのみ、「通知」選択時はニュース以外のすべての通知を表示する
+3. The InAppNotificationパネル shall 既存の「未読のみ」トグルスイッチを廃止する。未読/既読の区別は Requirement 6(視覚表示:太字+青ドット)で十分に識別可能であり、種別フィルタとの競合を避けるため
+4. The InAppNotificationパネル shall リスト領域に最大高さを設定し、超過分はスクロールで表示する。ただし表示件数には上限を設け
+5. The InAppNotificationパネル shall リスト下部に「すべての通知」ボタンを配置し、クリック時に `/me/all-in-app-notifications` へページ遷移する。AC 4 の表示件数上限により全件を表示できないため、全件閲覧の導線として提供する
 6. When ユーザーがニュースアイテムをクリックした場合, the InAppNotification UI shall ニュースの詳細 URL を新しいタブで開く
 6. When ユーザーがニュースアイテムをクリックした場合, the InAppNotification UI shall ニュースの詳細 URL を新しいタブで開く
 7. When ユーザーがニュースアイテムをクリックした場合, the InAppNotification UI shall 該当ニュースを既読としてマークし、未読インジケータを更新する
 7. When ユーザーがニュースアイテムをクリックした場合, the InAppNotification UI shall 該当ニュースを既読としてマークし、未読インジケータを更新する
 
 
-### Requirement 5.1: 既読/未読の視覚表示
+### Requirement 6: 既読/未読の視覚表示
 
 
 **Objective:** As a GROWI ユーザー, I want 未読のニュース・通知を視覚的に区別したい, so that 未確認の項目をすぐに見分けられる
 **Objective:** As a GROWI ユーザー, I want 未読のニュース・通知を視覚的に区別したい, so that 未確認の項目をすぐに見分けられる
 
 
@@ -79,19 +82,17 @@ GROWI の InAppNotification にニュース配信・表示機能を追加する
 2. The 未読アイテム shall 左端に青色の丸ドット(8px, `bg-primary`)を表示する
 2. The 未読アイテム shall 左端に青色の丸ドット(8px, `bg-primary`)を表示する
 3. The 既読アイテム shall タイトルを通常ウェイト(`fw-normal`)で表示する
 3. The 既読アイテム shall タイトルを通常ウェイト(`fw-normal`)で表示する
 4. The 既読アイテム shall ドットと同じ幅の透明スペーサーを配置し、インデントを統一する
 4. The 既読アイテム shall ドットと同じ幅の透明スペーサーを配置し、インデントを統一する
-5. The 視覚表示 shall 背景色の変更や opacity の変更を行わない
 
 
-### Requirement 6: 未読バッジ表示
+### Requirement 7: 未読バッジ表示
 
 
 **Objective:** As a GROWI ユーザー, I want 未読ニュースの存在をバッジで把握したい, so that 新しいニュースがあることに気づける
 **Objective:** As a GROWI ユーザー, I want 未読ニュースの存在をバッジで把握したい, so that 新しいニュースがあることに気づける
 
 
 #### Acceptance Criteria
 #### Acceptance Criteria
 
 
 1. The サイドバー通知アイコン shall 通知の未読数とニュースの未読数を合算してバッジに表示する
 1. The サイドバー通知アイコン shall 通知の未読数とニュースの未読数を合算してバッジに表示する
-2. The ヘッダードロップダウンの通知アイコン shall 通知の未読数とニュースの未読数を合算してバッジに表示する
-3. When 全てのニュースが既読の場合, the バッジ shall ニュース分のカウントを含めない
+2. When 全てのニュースが既読の場合, the バッジ shall ニュース分のカウントを含めない
 
 
-### Requirement 7: 多言語対応
+### Requirement 8: 多言語対応
 
 
 **Objective:** As a GROWI ユーザー, I want ニュースを自分の言語で読みたい, so that 内容を正しく理解できる
 **Objective:** As a GROWI ユーザー, I want ニュースを自分の言語で読みたい, so that 内容を正しく理解できる
 
 
@@ -99,5 +100,5 @@ GROWI の InAppNotification にニュース配信・表示機能を追加する
 
 
 1. When ニュースアイテムに複数言語のテキストが含まれる場合, the NewsItem コンポーネント shall ブラウザの言語設定に応じたテキストを表示する
 1. When ニュースアイテムに複数言語のテキストが含まれる場合, the NewsItem コンポーネント shall ブラウザの言語設定に応じたテキストを表示する
 2. If ブラウザの言語に対応するテキストが存在しない場合, then the NewsItem コンポーネント shall `en_US` → `ja_JP` の順にフォールバックする
 2. If ブラウザの言語に対応するテキストが存在しない場合, then the NewsItem コンポーネント shall `en_US` → `ja_JP` の順にフォールバックする
-3. The UI ラベル(「ニュース」「ニュースはありません。」等) shall `ja_JP`, `en_US`, `zh_CN`, `ko_KR`, `fr_FR` の i18n ロケールファイルで提供する
-4. The フィルタタブ用ラベル `in_app_notification.notifications`(「通知」)shall 全対応言語のロケールファイルに追加する
+3. The UI ラベル(「ニュース」「ニュースはありません。」等)shall `ja_JP`, `en_US`, `zh_CN`, `ko_KR`, `fr_FR` の i18n ロケールファイルで提供する
+4. The フィルタボタン用ラベル(「通知」「お知らせ」)shall 全対応言語のロケールファイルに追加する

+ 2 - 2
.kiro/specs/news-inappnotification/spec.json

@@ -1,7 +1,7 @@
 {
 {
   "feature_name": "news-inappnotification",
   "feature_name": "news-inappnotification",
-  "created_at": "2026-03-12T00:00:00Z",
-  "updated_at": "2026-03-12T12:00:00Z",
+  "created_at": "2026-03-24T00:00:00Z",
+  "updated_at": "2026-03-24T01:00:00Z",
   "language": "ja",
   "language": "ja",
   "phase": "requirements-generated",
   "phase": "requirements-generated",
   "approvals": {
   "approvals": {