Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Iindexable test2 #19

Merged
merged 12 commits into from
Sep 24, 2024
Merged

Iindexable test2 #19

merged 12 commits into from
Sep 24, 2024

Conversation

penginn-net
Copy link
Owner

@penginn-net penginn-net commented Sep 24, 2024

What

Why

Additional info (optional)

Checklist

  • コントリビューションガイドを読みました( Read the contribution guide)
  • ローカル環境で動作しました(Test working in a local environment)
  • (必要なら)CHANGELOG_YOJO.mdの更新((If needed) Update CHANGELOG_YOJO.md)
  • (必要なら)テストの追加((If possible) Add tests)

Summary by CodeRabbit

  • 新機能
    • Mastodonのインデックス機能をサポートし、プライバシー設定に基づく検索の可視性を制御可能に。
    • リモートクリップをお気に入りとして保存する機能を追加。
    • リモートコンテンツの再生機能を追加。
    • 検索機能の改善により、ユーザーのインタラクションに基づいたノートの検索が可能に。
    • 新しいインデックス作成機能により、ノート、リアクション、投票のインデックス化が強化。
  • バグ修正
    • リアクションが表示されない問題を修正。
  • ドキュメンテーション
    • 変更内容を反映した新しいAPIリクエストタイプの追加。

Copy link

coderabbitai bot commented Sep 24, 2024

Walkthrough

このプルリクエストでは、OpenSearchのインデックス機能を強化するための新しい設定ファイルやマイグレーション、サービスの変更が行われました。ユーザーのインデックス可能性を制御する新しいプロパティが追加され、関連するAPIエンドポイントやフロントエンドコンポーネントも更新されています。これにより、ユーザーのプライバシー設定や検索機能が改善され、より柔軟なデータ管理が可能になります。

Changes

ファイル 変更の概要
CHANGELOG_YOJO.md インデックス機能に関する新機能や改善点が記載され、完全な再インデックスが必要であることが強調される。
packages/backend/src/core/AdvancedSearchService.ts インデックス機能を強化するために、さまざまな新しいメソッドが追加され、検索ロジックが改善される。
packages/backend/src/core/ClipService.ts AdvancedSearchServiceを統合し、クリップの作成および削除時にインデックスを管理する機能が追加される。
packages/backend/src/core/NoteCreateService.ts ノート作成時のインデックス処理が変更され、条件付きでインデックスされるように改善される。
packages/backend/src/server/api/endpoints/notes/favorites/create.ts お気に入り作成時にAdvancedSearchServiceを使用してインデックスを管理する機能が追加される。
packages/backend/src/server/api/endpoints/notes/favorites/delete.ts お気に入り削除時にAdvancedSearchServiceを使用してインデックスを管理する機能が追加される。
packages/backend/test/e2e/search-notes.ts 高度な検索機能のためのエンドツーエンドテストが追加され、ユーザーの権限やロール管理を検証する。

Poem

🐇 うさぎの歌 🐇
インデックスの新しい道、
プライバシーも守るよ、
みんなの声、響かせて、
データの森を駆け巡る、
うさぎの夢、叶えよう! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    -- I pushed a fix in commit <commit_id>, please review it.
    -- Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    -- @coderabbitai generate unit testing code for this file.
    -- @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    -- @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    -- @coderabbitai read src/utils.ts and generate unit testing code.
    -- @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    -- @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

github-actions bot commented Sep 24, 2024

이 PR에 의한 api.json 차이

차이점은 여기에서 볼 수 있음
--- base
+++ head
@@ -13122,6 +13122,29 @@
             "bearerAuth": []
           }
         ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "index": {
+                    "type": "string",
+                    "enum": [
+                      "notes",
+                      "reaction",
+                      "pollVote"
+                    ]
+                  }
+                },
+                "required": [
+                  "index"
+                ]
+              }
+            }
+          }
+        },
         "responses": {
           "204": {
             "description": "OK (without any results)"
@@ -50014,6 +50037,9 @@
                   "isExplorable": {
                     "type": "boolean"
                   },
+                  "isIndexable": {
+                    "type": "boolean"
+                  },
                   "hideOnlineStatus": {
                     "type": "boolean"
                   },

Get diff files from Workflow Page

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 25

Outside diff range and nitpick comments (22)
.github/cherrypick/test-opensearch.yml (1)

1-4: URLとポート設定が適切です。コメントの改善を提案します。

ローカルテスト用のURL設定と、競合を避けるためのポート設定が適切に行われています。

コメントの改善案:

-# ローカルでテストするときにポートを被らないようにするためデフォルトのものとは変える(以下同じ)
+# ローカルテスト時のポート競合を避けるため、デフォルト値から変更しています(以下の設定も同様)

この変更により、コメントがより簡潔で明確になります。

packages/backend/test/compose.yml (2)

15-16: ビルド設定にバージョンを指定することを検討してください。

再現性を確保するために、OpenSearchのビルドにバージョンを指定することをお勧めします。これにより、異なる環境間での一貫性が向上します。

例えば、以下のようにDockerfileを使用してバージョンを指定できます:

-    build: ../../../opensearch
+    build:
+      context: ../../../opensearch
+      dockerfile: Dockerfile
+      args:
+        OPENSEARCH_VERSION: 2.x.x  # 適切なバージョンに置き換えてください

この変更により、特定のバージョンのOpenSearchを使用することが保証されます。


29-30: ポートマッピングの設定が適切です。ドキュメントの追加を検討してください。

localhostインターフェースへのマッピングは、セキュリティの観点から適切です。また、非標準のポート番号(59200)を使用することで、潜在的な競合を回避できます。

この非標準のポート設定について、プロジェクトのドキュメントに記載することをお勧めします。他の開発者がこの設定を理解し、適切に使用できるようになります。

packages/backend/src/server/api/endpoints/notes/favorites/delete.ts (1)

72-72: お気に入りのunindex処理が追加されていますが、改善の余地があります。

お気に入りの削除後にunindex処理を追加したのは良い改善です。しかし、以下の点について検討が必要です:

  1. エラーハンドリング:unindex処理が失敗した場合の対応が必要です。
  2. トランザクション管理:削除とunindex処理を1つのトランザクションで行うことで、データの整合性を保つことができます。

以下のような実装を検討してください:

try {
  await this.db.transaction(async (transactionalEntityManager) => {
    await transactionalEntityManager.delete(NoteFavorite, exist.id);
    await this.advancedSearchService.unindexFavorite(exist.id, note.id, undefined, me.id);
  });
} catch (error) {
  this.logger.error('Failed to delete and unindex favorite', error);
  throw new ApiError('Failed to delete favorite');
}

この実装により、削除とunindex処理が一つのトランザクションで行われ、エラーが発生した場合も適切に処理されます。

packages/backend/src/core/DeleteAccountService.ts (1)

76-76: 新しいメソッド呼び出しが追加されていますが、エラーハンドリングを検討してください。

advancedSearchService.unindexUserFavorites(user.id)の呼び出しが適切に追加されています。ローカルユーザーの削除プロセスに統合されており、ユーザーのお気に入りをインデックスから削除する目的に合致しています。

しかし、このメソッド呼び出しにエラーハンドリングが含まれていません。エラーが発生した場合にアカウント削除プロセス全体が中断されないよう、try-catchブロックでこの呼び出しを囲むことを検討してください。

以下のようなエラーハンドリングの追加を提案します:

+ try {
    this.advancedSearchService.unindexUserFavorites(user.id);
+ } catch (error) {
+   console.error('Failed to unindex user favorites:', error);
+   // 必要に応じて、エラーをログに記録するか、適切に処理してください
+ }
packages/frontend/src/pages/admin/other-settings.vue (1)

99-113: インデックス作成機能の改善を評価します。さらなる改善の提案があります。

この変更は、管理者により細かな制御を提供し、特定のデータタイプのインデックス作成を可能にするため、良い改善です。しかし、以下の点について検討することをお勧めします:

  1. すべてのデータタイプを一度にインデックス作成するための「すべて」オプションを追加することを検討してください。これにより、包括的なインデックス作成が必要な場合に便利です。

  2. デフォルト選択を「reaction」から、より一般的なユースケースに変更することを検討してください。例えば、「notes」や新しく追加する「すべて」オプションなどが考えられます。

以下のような変更を提案します:

 items: [{
+    value: 'all', text: i18n.ts.all,
+}, {
     value: 'notes', text: i18n.ts.note,
 }, {
     value: 'reaction', text: i18n.ts.reaction,
 }, {
     value: 'pollVote', text: i18n.ts.poll,
 }],
-default: 'reaction',
+default: 'all',

この変更により、より柔軟で直感的なユーザー体験が提供できます。

packages/backend/src/server/api/endpoints/notes/polls/vote.ts (1)

149-151: 投票作成とID生成のロジックが改善されています。

IDの生成が投票の挿入前に行われるようになり、より効率的になっています。これは良い変更です。

可読性向上のため、以下のように変数名を明確にすることを検討してください:

-const id = this.idService.gen(createdAt.getTime());
+const voteId = this.idService.gen(createdAt.getTime());
 const vote = await this.pollVotesRepository.insertOne({
-  id: id,
+  id: voteId,
   noteId: note.id,
   userId: me.id,
   choice: ps.choice,
 });
packages/frontend/src/pages/settings/privacy.vue (2)

46-50: 新しい isIndexable スイッチの実装が適切です。

新しいスイッチの実装は既存のパターンに従っており、適切に配置されています。ただし、ベータタグの扱いについて1点提案があります。

ベータタグ "yojo-art" の扱いを改善するために、以下の変更を検討してください:

-		<span class="_beta">yojo-art</span>
+		<span class="_beta">{{ i18n.ts.yojoArt }}</span>

これにより、ベータタグのテキストも他の部分と同様に国際化され、一貫性が向上します。i18n.ts ファイルに yojoArt の翻訳を追加することを忘れないでください。


46-50: 全体的な変更の要約と影響

この PR では、ユーザーのプロファイルのインデックス可能性を制御する新しい isIndexable 設定が追加されました。これは以下の変更を含みます:

  1. テンプレート部分に新しい MkSwitch コンポーネントが追加されました。
  2. スクリプト部分に isIndexable リアクティブ参照が追加されました。
  3. save() 関数に isIndexable の値が含まれるようになりました。

これらの変更により、ユーザーはより細かくプライバシー設定を制御できるようになります。実装は既存のコードパターンに従っており、一貫性があります。

この新機能の追加に伴い、以下の点を考慮することをお勧めします:

  1. この設定の影響を受ける可能性のある他のコンポーネントやAPIエンドポイントを確認し、必要に応じて更新してください。
  2. この新しい設定のユーザーへの影響と、それがどのように機能するかを説明するドキュメントを更新または作成することを検討してください。
  3. この機能のテストケースを追加し、期待通りに動作することを確認してください。

Also applies to: 98-98, 116-116

packages/backend/src/server/api/endpoints/i/update.ts (3)

37-37: インポートの追加を承認します。

IdServiceのインポートが追加されました。これは新しい機能に関連していると思われます。

可読性を向上させるため、関連するインポートをグループ化することを検討してください。例えば、他のサービスのインポートと一緒に配置することができます。


183-183: 新しいプロパティの追加を承認します。

isIndexableプロパティがparamDefオブジェクトに追加されました。これはユーザープロファイルのインデックス可能性を制御するためのものと思われます。

このプロパティの目的を明確にするために、簡単なコメントを追加することを推奨します。例:

isIndexable: { type: 'boolean' }, // ユーザープロファイルが検索エンジンによってインデックス可能かどうかを制御

Line range hint 1-696: 全体的な変更の確認と提案

新しいisIndexableプロパティの追加は一貫して実装されており、既存のコードパターンに従っています。しかし、この機能追加に伴ういくつかの考慮事項があります:

  1. ドキュメンテーションの更新:この新機能についてのドキュメントを更新し、その使用方法と影響について説明することを推奨します。

  2. セキュリティとプライバシーの影響:この設定がユーザーのプライバシーにどのような影響を与えるか、十分に検討してください。

  3. パフォーマンスへの影響:インデックス作成の変更が検索機能やデータベースのパフォーマンスにどのような影響を与えるか評価してください。

  4. 既存のユーザーへの影響:この新しい設定のデフォルト値と、既存のユーザーアカウントへの適用方法を検討してください。

これらの点について、チームで議論し、必要に応じて追加の変更や文書化を行うことを推奨します。

packages/backend/src/core/activitypub/ApRendererService.ts (1)

542-542: LGTM: indexableプロパティの追加

ユーザーのActivityPub表現にindexableプロパティを追加したのは良い改善です。これにより、ユーザープロファイルの検索エンジンなどによるインデックス可能性を制御できるようになります。

実装は簡潔で、他のブーリアンプロパティと一貫性があります。

一貫性をさらに高めるために、indexableプロパティをdiscoverableプロパティの直後に配置することを検討してください。これにより、関連するプロパティがグループ化され、コードの可読性が向上します。

 discoverable: user.isExplorable,
+indexable: user.isIndexable,
 publicKey: this.renderKey(user, keypair, '#main-key'),
 isCat: user.isCat,
-indexable: user.isIndexable,
packages/backend/src/core/entities/UserEntityService.ts (1)

569-569: 変更は適切です。ドキュメンテーションの追加を検討してください。

isIndexable プロパティの追加は適切に実装されています。このプロパティはユーザーのプロファイルが検索エンジンによってインデックス可能かどうかを制御するために使用されると思われます。

セキュリティとプライバシーに関連する重要な機能であるため、このプロパティの目的と使用方法についてコードコメントを追加することを推奨します。例えば:

// isIndexable: ユーザープロファイルが検索エンジンによってインデックス可能かどうかを示す
isIndexable: user.isIndexable,

これにより、他の開発者がこのプロパティの重要性をより理解しやすくなります。

packages/backend/src/core/activitypub/models/ApPersonService.ts (2)

411-411: 新しいプロパティ isIndexable の追加を承認します。

この変更は、ユーザーの検索エンジンインデックス可能性を制御する新機能を導入しています。デフォルトで true に設定されているのは適切です。

この新しいプロパティの目的と使用方法についてのドキュメントを追加することをお勧めします。


652-655: updates オブジェクトへの isIndexable プロパティの追加を承認します。

この変更は、先程のコード変更と一貫性があり、適切です。

コードの一貫性と保守性を向上させるために、isIndexable の値を設定する共通の関数を作成することを検討してください。例えば:

function getIsIndexable(person: any): boolean {
  return person.indexable ?? true;
}

// 使用例
isIndexable: getIsIndexable(person),

この関数を両方の場所で使用することで、将来的な変更が容易になります。

packages/backend/src/core/NoteCreateService.ts (1)

146-146: 不要な変更の可能性があります。

この行の変更は、visibility プロパティの型を string | null から string | null に変更していますが、これらは同じ型です。この変更は意図的なものではない可能性があります。

変更が意図的でない場合は、この行を元に戻すことをお勧めします。

packages/backend/test/e2e/users.ts (2)

70-70: ユーザーオブジェクトにisIndexableプロパティを追加しました。

この変更は適切です。新しいisIndexableプロパティをユーザーオブジェクトに追加することで、このプロパティに関するテストが可能になります。

このプロパティの目的を説明するコメントを追加することをお勧めします。例えば:

+    // ユーザーのプロフィールが検索エンジンにインデックスされるかどうかを示す
     isIndexable: user.isIndexable,

435-436: isIndexableプロパティのテストケースを追加しました。

この変更は適切です。新しいisIndexableプロパティのtrueとfalseの両方のケースをテストしており、包括的なテストになっています。

より具体的なテストケースを追加することを検討してください。例えば:

  1. isIndexableの値が正しくAPIレスポンスに反映されているか確認するテスト
  2. isIndexableの値を変更した後、その変更が保存され、再取得時に正しく反映されているか確認するテスト
  3. isIndexableの値によって、ユーザーの検索結果への表示/非表示が適切に制御されているか確認するテスト

これらの追加テストにより、isIndexableプロパティの機能がより完全にカバーされます。

packages/cherrypick-js/etc/cherrypick-js.api.md (1)

244-246: 新しい型宣言が適切に追加されています。

AdminFullIndexRequest 型の追加は適切に行われており、他の管理者レベルのリクエスト型と一貫性があります。

ただし、この新しいエンドポイントの目的や使用方法について、開発者向けのドキュメントを追加することをお勧めします。

+/**
+ * 管理者用の完全インデックス作成リクエスト
+ * @description このエンドポイントの目的や使用方法についての説明を追加してください
+ */
 type AdminFullIndexRequest = operations['admin___full-index']['requestBody']['content']['application/json'];
packages/cherrypick-js/src/autogen/types.ts (1)

9570-9577: リクエストボディの追加は適切です。

admin___full-index操作にリクエストボディを追加することで、APIの定義が明確になりました。indexフィールドに対する列挙型の使用は、型安全性を向上させる良い実践です。

可読性を向上させるために、indexの各値に対してJSDocコメントを追加することを検討してください。例:

/** @enum {string} */
index: 
  | 'notes'    /** ノートのインデックス */
  | 'reaction' /** リアクションのインデックス */
  | 'pollVote' /** 投票のインデックス */;
packages/backend/src/core/ReactionService.ts (1)

104-104: 依存性注入の一貫性を確認してください。

他のサービスは@Injectデコレータを使用して依存性を注入していますが、AdvancedSearchServiceでは使用していません。一貫性のため、@Injectデコレータを追加することを検討してください。

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a7b8df8 and ff261dd.

Files selected for processing (34)
  • .github/cherrypick/test-opensearch.yml (1 hunks)
  • .github/workflows/test-backend.yml (2 hunks)
  • CHANGELOG_YOJO.md (1 hunks)
  • locales/index.d.ts (2 hunks)
  • locales/ja-JP.yml (2 hunks)
  • packages/backend/migration/1726205819617-AddIsIndexable.js (1 hunks)
  • packages/backend/src/core/AdvancedSearchService.ts (16 hunks)
  • packages/backend/src/core/ClipService.ts (5 hunks)
  • packages/backend/src/core/DeleteAccountService.ts (3 hunks)
  • packages/backend/src/core/NoteCreateService.ts (2 hunks)
  • packages/backend/src/core/QueryService.ts (1 hunks)
  • packages/backend/src/core/ReactionService.ts (4 hunks)
  • packages/backend/src/core/SearchService.ts (1 hunks)
  • packages/backend/src/core/activitypub/ApRendererService.ts (1 hunks)
  • packages/backend/src/core/activitypub/misc/contexts.ts (1 hunks)
  • packages/backend/src/core/activitypub/models/ApPersonService.ts (2 hunks)
  • packages/backend/src/core/activitypub/type.ts (1 hunks)
  • packages/backend/src/core/entities/UserEntityService.ts (2 hunks)
  • packages/backend/src/models/User.ts (1 hunks)
  • packages/backend/src/server/api/endpoints/admin/full-index.ts (2 hunks)
  • packages/backend/src/server/api/endpoints/i/update.ts (3 hunks)
  • packages/backend/src/server/api/endpoints/notes/favorites/create.ts (3 hunks)
  • packages/backend/src/server/api/endpoints/notes/favorites/delete.ts (3 hunks)
  • packages/backend/src/server/api/endpoints/notes/polls/vote.ts (3 hunks)
  • packages/backend/test/compose.yml (1 hunks)
  • packages/backend/test/e2e/search-notes.ts (1 hunks)
  • packages/backend/test/e2e/users.ts (3 hunks)
  • packages/cherrypick-js/etc/cherrypick-js.api.md (2 hunks)
  • packages/cherrypick-js/src/autogen/endpoint.ts (2 hunks)
  • packages/cherrypick-js/src/autogen/entities.ts (1 hunks)
  • packages/cherrypick-js/src/autogen/types.ts (2 hunks)
  • packages/frontend/src/components/MkUserSetupDialog.Privacy.vue (2 hunks)
  • packages/frontend/src/pages/admin/other-settings.vue (1 hunks)
  • packages/frontend/src/pages/settings/privacy.vue (3 hunks)
Additional context used
Gitleaks
.github/workflows/test-backend.yml

147-148: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

packages/backend/test/compose.yml

20-20: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

Markdownlint
CHANGELOG_YOJO.md

18-18: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


19-19: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


20-20: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


21-21: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


22-22: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


23-23: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


17-17: Expected: 4; Actual: 1
Unordered list indentation

(MD007, ul-indent)


18-18: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


19-19: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


20-20: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


21-21: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


22-22: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


23-23: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


17-17: Column: 1
Hard tabs

(MD010, no-hard-tabs)


18-18: Column: 3
Hard tabs

(MD010, no-hard-tabs)


19-19: Column: 3
Hard tabs

(MD010, no-hard-tabs)


20-20: Column: 3
Hard tabs

(MD010, no-hard-tabs)


21-21: Column: 3
Hard tabs

(MD010, no-hard-tabs)


22-22: Column: 3
Hard tabs

(MD010, no-hard-tabs)


23-23: Column: 3
Hard tabs

(MD010, no-hard-tabs)

Additional comments not posted (46)
.github/cherrypick/test-opensearch.yml (2)

12-14: Redis設定が適切です。

ローカルテスト環境用のRedis設定として問題ありません。ローカルホストの使用と非標準ポートの選択は、他の設定と一貫性があり適切です。


15-15: 'id'フィールドの目的を明確にしてください。

'id: aidx'の設定が含まれていますが、この設定の目的や重要性が不明確です。

以下の点について説明をお願いします:

  1. このIDフィールドの具体的な用途は何ですか?
  2. 'aidx'という値にはどのような意味がありますか?
  3. この設定はアプリケーションのどの部分で使用されていますか?

この情報を追加することで、将来のメンテナンスや他の開発者の理解が容易になります。可能であれば、この設定の目的を説明するコメントを追加することをお勧めします。

packages/backend/migration/1726205819617-AddIsIndexable.js (3)

1-4: 著作権表示とライセンス情報が適切に記載されています。

ファイルヘッダーには、適切な著作権表示とライセンス情報が含まれています。これはオープンソースプロジェクトにとって重要な要素です。


6-8: マイグレーションクラスの命名が適切です。

クラス名 AddIsIndexable1726205819617 にタイムスタンプが含まれており、マイグレーションの順序を保証するのに役立ちます。


9-11: 新しいカラム追加の影響を考慮してください。

isIndexable カラムをデフォルト値 true で追加していますが、既存のユーザーへの影響を考慮する必要があります。

以下の点について検討してください:

  1. この変更が既存のユーザーデータにどのような影響を与えるか。
  2. デフォルト値を true にする理由と、それが適切かどうか。
  3. この変更に関連して、アプリケーションコードの更新が必要かどうか。
Verification successful

isIndexable カラムの追加に関する確認

デフォルト値 true の設定およびアプリケーションコードへの影響について問題は確認されませんでした。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# アプリケーションコード内で isIndexable フィールドの使用を確認
rg --type typescript 'isIndexable'

Length of output: 69


Script:

# 新しいシェルスクリプトを実行して `isIndexable` フィールドの使用を確認します
rg 'isIndexable'

Length of output: 2542


Script:

#!/bin/bash
# 'isIndexable' フィールドの使用を確認するために、正しいファイルタイプでrgを実行します
rg --type ts 'isIndexable'

Length of output: 1428

packages/backend/test/compose.yml (1)

22-28: リソース制限の設定が適切です。

メモリロックの制限を無制限に設定し、ファイルディスクリプタの制限を65536に設定しているのは、OpenSearchインスタンスに適しています。これらの設定により、パフォーマンスが向上し、スワッピングが防止されます。

packages/backend/src/server/api/endpoints/notes/favorites/delete.ts (2)

11-11: 新しいインポートが適切に追加されています。

AdvancedSearchServiceのインポートが正しく追加されており、プロジェクトの規約に従っています。


51-51: コンストラクタの更新が適切に行われています。

advancedSearchServiceが正しく追加され、型付けされています。既存の依存性注入のパターンに従っています。

packages/frontend/src/components/MkUserSetupDialog.Privacy.vue (3)

18-25: テンプレートの変更が適切に実装されています。

新しい「インデックス可能」設定が既存のUIパターンに沿って追加されており、i18nを使用して適切にローカライズされています。ユーザーエクスペリエンスの一貫性が保たれています。


Line range hint 1-78: 全体的な変更の評価

新しい「インデックス可能」機能の実装は全体的に良好です。以下の点が特に評価できます:

  1. 既存のコンポーネント構造に適切に統合されています。
  2. 新しい機能に対して一貫してi18nによるローカライゼーションが使用されています。
  3. テンプレートとスクリプトの両方で機能が一貫して実装されています。

ただし、isIndexableの初期値の設定については再考の余地があります。また、この新機能がユーザーのプライバシーに与える影響を考慮し、ユーザーガイドやドキュメントの更新も検討してください。

全体として、この変更はユーザーに新しい制御オプションを提供し、プライバシー設定の柔軟性を向上させています。


63-63: isIndexableの初期値について再考してください。

isIndexableの初期値がtrueに設定されていますが、これが適切かどうか確認してください。ユーザーのプライバシーを考慮すると、デフォルトでfalseに設定し、ユーザーが明示的に選択できるようにすることも検討に値します。

また、この設定がユーザーの既存のアカウント設定と同期されていることを確認してください。新規ユーザーと既存ユーザーの両方に対して、この設定が正しく機能することを確認する必要があります。

以下のスクリプトを実行して、既存のユーザー設定との整合性を確認してください:

Also applies to: 71-71

packages/backend/src/core/DeleteAccountService.ts (3)

16-16: インポート文が適切に追加されています。

AdvancedSearchServiceのインポートが正しく追加されており、他のインポート文と一貫性のある相対パスを使用しています。


31-31: コンストラクタの変更が適切に行われています。

AdvancedSearchServiceが正しくコンストラクタに注入されています。他のサービスと同じパターンでprivate修飾子が使用されており、命名規則も一貫しています。


Line range hint 1-94: 全体的な変更の評価

この変更は、アカウント削除プロセスにAdvancedSearchServiceを統合することで、機能を向上させています。主な変更点は以下の通りです:

  1. AdvancedSearchServiceのインポート
  2. コンストラクタへの新しいサービスの注入
  3. アカウント削除プロセス中のユーザーお気に入りのインデックス解除

これらの変更は既存のコードスタイルと構造に一貫しており、アカウント削除プロセスの完全性を向上させています。唯一の改善点として、新しく追加されたメソッド呼び出しにエラーハンドリングを追加することを提案しました。

全体として、この変更は適切に実装されており、アプリケーションの機能を向上させるものと評価します。

.github/workflows/test-backend.yml (3)

13-13: トリガーパスの追加は適切です。

.github/cherrypick/test*.yml ファイルをトリガーパスに追加することで、テスト設定ファイルの変更時にワークフローが実行されるようになります。これは良い実践です。

Also applies to: 20-20


118-170: 新しいジョブの構造は一貫性があり、適切です。

opensearch-e2e ジョブは既存のジョブと同様の構造を持ち、同じNode.jsバージョンを使用しています。これは保守性と互換性の観点から良い実践です。

Tools
Gitleaks

147-148: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)


165-165: テストの範囲を確認してください。

現在のテストコマンドは search-notes.ts ファイルのみを実行しているようです。これが意図的なものか、より広範囲のテストを実行する必要があるかを確認してください。

より包括的なテストカバレッジを確保するために、以下のスクリプトを実行して、他のOpenSearch関連のテストファイルがないか確認してください:

packages/backend/src/server/api/endpoints/notes/polls/vote.ts (3)

18-18: LGTM: AdvancedSearchServiceのインポートが適切に追加されています。

インポート文が正しく配置され、パスも適切であると思われます。


99-99: コンストラクタの更新が適切に行われています。

AdvancedSearchServiceが正しく依存性注入のパターンに従って追加されています。これにより、新しい機能を適切に利用できるようになります。


156-159: 投票のインデックス化が適切に実装されています。

AdvancedSearchServiceを使用して投票をインデックス化する新しいロジックが追加されており、検索機能が向上します。これは素晴らしい改善です。

インデックス化処理中にエラーが発生した場合の対応を確認してください。エラーハンドリングを追加することで、より堅牢な実装になります。以下のスクリプトを実行して、他の箇所でのエラーハンドリングの実装を確認できます:

また、インデックス化の失敗が投票プロセス全体に影響を与えないようにするため、以下のような実装を検討してください:

try {
  await this.advancedSearchService.indexVote(voteId, {
    noteId: note.id,
    userId: me.id,
  });
} catch (error) {
  this.logger.error('投票のインデックス化に失敗しました', error);
  // ここでエラーを記録するが、プロセスは続行する
}
packages/frontend/src/pages/settings/privacy.vue (1)

98-98: スクリプト部分の変更が適切に実装されています。

isIndexable プロパティの追加と save() 関数への組み込みが正しく行われています。これらの変更は既存のパターンに従っており、コンポーネントの他の部分と一貫性があります。

Also applies to: 116-116

packages/backend/src/models/User.ts (1)

197-203: 新しい isIndexable プロパティの目的と影響を明確にしてください。

新しく追加された isIndexable プロパティについて、以下の点を確認・検討してください:

  1. このプロパティの具体的な目的と使用方法を説明してください。
  2. デフォルト値が true に設定されていますが、これが適切かどうか確認してください。
  3. このプロパティの意味を明確にするために、コメントフィールドに説明を追加することを推奨します。
  4. この変更が既存のデータやクエリにどのような影響を与えるか検討してください。特に、既存のユーザーレコードに対する影響を考慮してください。
  5. この新しいプロパティを使用するための関連するビジネスロジックやAPIの変更が必要かどうか確認してください。

以下のスクリプトを実行して、isIndexable プロパティの使用状況を確認してください:

このスクリプトの結果を基に、新しいプロパティの影響範囲を評価し、必要な追加の変更を特定してください。

Verification successful

isIndexable プロパティの追加は適切に行われており、コード全体での使用も確認されました。ただし、このプロパティの目的と使用方法についてのコメントが不足しているため、他の開発者が理解しやすいようにコメントを追加することを推奨します。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: `isIndexable` プロパティの使用状況を確認する

# Test: `isIndexable` プロパティが他のファイルで使用されているか検索する
echo "Searching for usages of isIndexable property:"
rg --type typescript 'isIndexable'

# Test: `User` モデルを使用している箇所を検索する
echo "\nSearching for usages of User model:"
rg --type typescript 'MiUser'

Length of output: 320


Script:

#!/bin/bash
# Description: `isIndexable` プロパティの使用状況を確認する

# Test: `isIndexable` プロパティが他のファイルで使用されているか検索する
echo "Searching for usages of isIndexable property:"
rg --type ts --type tsx 'isIndexable'

# Test: `User` モデルを使用している箇所を検索する
echo "\nSearching for usages of User model:"
rg --type ts --type tsx 'MiUser'

Length of output: 312


Script:

#!/bin/bash
# Description: Ripgrep のサポートするファイルタイプを一覧表示し、TypeScriptファイルの検索方法を確認する

# List all supported file types
echo "Listing all supported file types in ripgrep:"
rg --type-list

# Alternatively, search TypeScript files by extension without using --type
echo "\nSearching for usages of isIndexable property in .ts and .tsx files:"
rg --glob '*.ts' --glob '*.tsx' 'isIndexable'

echo "\nSearching for usages of MiUser in .ts and .tsx files:"
rg --glob '*.ts' --glob '*.tsx' 'MiUser'

Length of output: 123430

CHANGELOG_YOJO.md (1)

7-8: 重要な注意事項が追加されています。

インデックス構造の変更に関する重要な情報が追加されています。ユーザーに再インデックスの必要性を明確に伝えています。

packages/backend/src/core/activitypub/type.ts (1)

195-195: LGTM: 新しいプロパティの追加が適切に行われています。

indexable プロパティの追加は適切に行われており、オプショナルな boolean 型として定義されています。これはアクターのインデックス可能性を指定するのに適しています。

ただし、以下の改善を提案します:

  • このプロパティの目的と使用方法を説明するコメントを追加することを検討してください。例えば:
/** アクターがインデックス可能かどうかを示します。trueの場合、検索エンジンなどでインデックス化できることを意味します。 */
indexable?: boolean;

このようなドキュメンテーションは、将来のメンテナンスや他の開発者の理解を助けるのに役立ちます。

packages/backend/src/core/activitypub/misc/contexts.ts (1)

546-546: 変更は適切に実装されています。使用目的の明確化をお願いします。

indexable プロパティが extension_context_definition オブジェクトに正しく追加されています。この実装は既存の構造と命名規則に一致しています。

この新しいプロパティの目的と使用方法について、詳細な説明を追加していただけますか?また、この変更がシステムの他の部分にどのような影響を与えるかを確認するために、以下のスクリプトを実行してください:

Verification successful

変更が正しく適用されていることを確認しました。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 'indexable' プロパティの使用状況を確認します

# Test: 'indexable' プロパティが使用されている箇所を検索します
rg --type typescript --type javascript 'indexable'

# Test: 'toot:indexable' の使用箇所を検索します
rg --type typescript --type javascript 'toot:indexable'

Length of output: 176


Script:

#!/bin/bash
# Description: 'indexable' プロパティの使用状況を確認します

# Test: 'indexable' プロパティが使用されている箇所を検索します
rg --type ts --type js 'indexable'

# Test: 'toot:indexable' の使用箇所を検索します
rg --type ts --type js 'toot:indexable'

Length of output: 2501

packages/backend/src/server/api/endpoints/i/update.ts (1)

357-357: ユーザー更新ロジックの変更を承認します。

isIndexableプロパティがupdatesオブジェクトに追加されました。これは、入力に応じてユーザーのインデックス可能性ステータスを更新するためのものです。

この新しいプロパティの潜在的な誤用を防ぐため、追加のエラーハンドリングやバリデーションの実装を検討してください。例えば、特定の条件下でのみこの設定を許可するなどです。以下のスクリプトで、他の類似のプロパティの処理方法を確認できます:

Verification successful

ユーザー更新ロジックの変更を確認しました。

isIndexableプロパティの追加は、他のブール値プロパティと一貫した方法で処理されています。特別なエラーハンドリングは必要ありません。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 他のブール値プロパティの処理方法を確認
rg "typeof ps\.\w+ === 'boolean'" -A 3 packages/backend/src/server/api/endpoints/i/update.ts

Length of output: 1776

packages/backend/src/core/NoteCreateService.ts (1)

755-756: 検索インデックスの追加が良好です。

MeiliSearchとOpenSearchへのノートのインデックス追加は、検索機能を向上させる良い改善です。

packages/backend/test/e2e/users.ts (2)

12-12: DEFAULT_POLICIESのインポートを復活させました。

この変更は適切です。DEFAULT_POLICIESは、新しく追加されたisIndexableプロパティのデフォルト設定を含んでいる可能性が高いため、このインポートは必要です。


Line range hint 1-1000: 全体的なレビューサマリー

  1. DEFAULT_POLICIESのインポートの復活
  2. ユーザーオブジェクトへのisIndexableプロパティの追加
  3. isIndexableプロパティのテストケースの追加

これらの変更は、新しいisIndexable機能を実装するために必要で一貫性のあるものです。テストカバレッジを向上させるための提案をいくつか行いましたが、全体的に変更は適切に行われています。

packages/cherrypick-js/src/autogen/endpoint.ts (1)

684-684: 変更を承認します。潜在的な互換性の問題に注意してください。

この変更は正しく実装されていますが、以下の点に注意が必要です:

  1. この変更は、パラメータなしでこのエンドポイントを使用している既存のコードを破壊する可能性があります。
  2. AdminFullIndexRequest 型がプロジェクト内の適切な場所で定義されていることを確認してください。
  3. API ドキュメントとクライアント側のコードを更新することをお勧めします。

AdminFullIndexRequest 型の定義を確認するために、以下のスクリプトを実行してください:

Verification successful

AdminFullIndexRequest 型の存在が確認されました。

  • packages/cherrypick-js/src/autogen/entities.ts に定義されています。
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# AdminFullIndexRequest 型の定義を検索
rg --type typescript "type AdminFullIndexRequest = " -A 10

Length of output: 95


Script:

#!/bin/bash
# AdminFullIndexRequest 型の定義を検索(--type オプションを削除)

rg "type AdminFullIndexRequest =" -A 10

Length of output: 2990

packages/cherrypick-js/src/autogen/entities.ts (1)

101-101: 新しい型 AdminFullIndexRequest が正しく追加されています。

この新しい型の追加は、管理者向けの全文インデックス作成操作が API に導入されたことを示唆しています。型の宣言自体に問題は見られません。

この新しい型の使用状況を確認するために、以下のスクリプトを実行してください:

Verification successful

AdminFullIndexRequest 型の使用が確認されました。

以下のファイルで AdminFullIndexRequest 型が使用されています:

  • packages/cherrypick-js/src/autogen/entities.ts
  • packages/cherrypick-js/src/autogen/endpoint.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 説明: `AdminFullIndexRequest` 型の使用箇所を検索します。

# テスト: 型の使用箇所を検索します。期待される結果: 型が適切に使用されている箇所が表示されます。
rg --type typescript "AdminFullIndexRequest"

Length of output: 79


Script:

#!/bin/bash
# 説明: `AdminFullIndexRequest` 型の使用箇所を `.ts` および `.tsx` ファイル内で検索します。

# テスト: 型の使用箇所を検索します。期待される結果: 型が適切に使用されている箇所が表示されます。
rg "AdminFullIndexRequest" --glob "*.ts" --glob "*.tsx"

Length of output: 409

locales/ja-JP.yml (3)

880-880: 新しいエントリが適切に追加されています。

makeIndexableの翻訳が簡潔かつ適切に行われています。ノート検索のインデックス作成を許可するという意味が正確に伝わります。


881-883: 説明文が適切に追加されています。

makeIndexableDescriptionの翻訳が明確で情報量が豊富です。インデックス作成機能をオフにした場合の影響と例外について適切に説明されています。読みやすさを考慮して改行が適切に使用されています。


Line range hint 1-3184: 全体的に良好な変更が行われていますが、小さな修正が必要です。

新機能の翻訳が適切に追加され、既存のコンテンツも改善されています。唯一の問題点は、_reIndexOpenSearchセクションのキー名に軽微なタイプミスがあることです。このタイプミスを修正すれば、ファイル全体の品質が向上します。

packages/cherrypick-js/etc/cherrypick-js.api.md (1)

1297-1297: entities名前空間への適切な追加

AdminFullIndexRequest 型が entities 名前空間に正しく追加されており、アルファベット順も維持されています。これはコードの一貫性と可読性を向上させます。

locales/index.d.ts (2)

3534-3543: 新しい検索関連の設定が追加されました。

makeIndexablemakeIndexableDescriptionプロパティがLocaleインターフェースに追加されました。これらは、ユーザーのノートを検索可能にするかどうかを制御する新しい設定に関連しているようです。プライバシーに配慮した重要な機能追加だと考えられます。

実装は既存のコードスタイルと一貫性があり、適切に行われています。


Line range hint 1-11943: ファイル全体の確認完了

ファイルの残りの部分を確認しましたが、他に大きな変更や問題は見つかりませんでした。新しく追加されたmakeIndexablemakeIndexableDescriptionプロパティは、既存の構造にうまく適合しており、ファイル全体の一貫性は保たれています。

ローカライゼーション文字列の追加は適切に行われており、CherryPickアプリケーションの機能拡張をサポートしています。

packages/cherrypick-js/src/autogen/types.ts (1)

19942-19942: isIndexableプロパティの追加は適切です。

新しいisIndexableオプションプロパティの追加は、既存の構造と一貫性があり、適切に実装されています。

この変更の目的と使用方法についてもう少し情報を提供していただけますか?以下のスクリプトを実行して、この新しいプロパティの使用状況を確認できます:

Verification successful

isIndexableプロパティの追加を確認しました。

isIndexableプロパティがコードベース内で適切に使用されており、他の関連部分との整合性も保たれています。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 新しい isIndexable プロパティの使用状況を確認する

# Test: isIndexable プロパティの使用を検索する
rg --type typescript 'isIndexable'

Length of output: 69


Script:

#!/bin/bash
# Description: 新しい isIndexable プロパティの使用状況を確認する

# Test: isIndexable プロパティの使用を検索する
rg --type ts 'isIndexable'

Length of output: 1428

packages/backend/src/server/api/endpoints/admin/full-index.ts (2)

20-26: 'index' パラメータの定義が正しく設定されています

'index' パラメータが適切に定義され、必須項目として設定されています。


36-43: 条件分岐の実装が適切です

'ps.index' の値に応じて、正しい再インデックスメソッドが呼び出されています。

packages/backend/src/core/ClipService.ts (3)

23-23: 変更内容は問題ありません

AdvancedSearchServiceのインポートが正しく追加されています。


186-186: unindexFavorite関数へのundefinedの渡し方を確認してください

unindexFavorite関数の第一引数にundefinedを渡しています。この関数がundefinedを適切に処理できるか、または引数が必須でないか確認してください。

Verification successful

unindexFavorite関数の第一引数にundefinedを渡すことは適切です。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 説明: unindexFavorite関数の定義を確認し、第一引数がundefinedを許容するか確認します。

# テスト: unindexFavorite関数の定義を検索
# 期待: 第一引数がオプショナルである、またはundefinedを処理できる

rg 'unindexFavorite\(' --type ts -A 5

Length of output: 1473


54-54: 依存関係の注入が適切に行われていることを確認してください

コンストラクタにAdvancedSearchServiceが追加されました。ClipServiceをインスタンス化する全ての箇所で、この新しい依存関係が正しく渡されていることを確認してください。

packages/backend/src/core/ReactionService.ts (1)

33-33: AdvancedSearchServiceのインポートが正しく追加されています。

packages/backend/src/server/api/endpoints/notes/favorites/create.ts (2)

62-62: AdvancedSearchServiceの依存性注入を確認してください。

AdvancedSearchServiceが正しく依存性注入されるよう、DIコンテナでの登録を確認してください。

検証のために、以下のスクリプトを実行してください。

Verification successful

AdvancedSearchService の依存性注入が正しく設定されています。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: AdvancedSearchServiceがDIコンテナに登録されていることを確認します。

# Test: AdvancedSearchServiceのプロバイダ登録を検索します。期待値: AdvancedSearchServiceがプロバイダとして登録されている。

rg --type typescript 'provide.*AdvancedSearchService'

Length of output: 90


Script:

#!/bin/bash
# Description: AdvancedSearchServiceがDIコンテナに登録されていることを確認します。

# Test: AdvancedSearchServiceのプロバイダ登録を検索します。期待値: AdvancedSearchServiceがプロバイダとして登録されている。

rg --type ts 'provide.*AdvancedSearchService'

Length of output: 202


84-86: IDの手動生成による一貫性を確認してください。

idService.gen()を使用してIDを手動生成しています。この方法でIDの一意性や一貫性に問題がないか確認してください。他の部分でIDが自動生成されている場合、一貫性を保つために統一することを検討してください。

検証のために、以下のスクリプトを実行してください。

.github/cherrypick/test-opensearch.yml Outdated Show resolved Hide resolved
Comment on lines 17 to 23
opensearch:
host: 127.0.0.1
port: 59200
user: 'admin'
pass: 'eF53xwF4NYjrcXXwZ2CHgpwFL'
ssl: false
index: 'instancename' #なんでもいい
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

OpenSearch設定にセキュリティ上の懸念があります。改善が必要です。

ローカルテスト環境用のOpenSearch設定として機能しますが、いくつかの問題点があります。

以下の改善を強く推奨します:

  1. クレデンシャルのハードコーディング:

    • 環境変数や安全な秘密管理システムを使用してください。
    user: ${OPENSEARCH_USER}
    pass: ${OPENSEARCH_PASSWORD}
  2. SSL設定:

    • ローカルテストでもSSLを有効にすることを検討してください。本番環境との一貫性が保てます。
    ssl: true
  3. インデックス名:

    • 「なんでもいい」というコメントは適切ではありません。具体的で一貫したインデックス名を使用してください。
    index: 'test_cherrypick_index'  # テスト環境用のインデックス名

これらの変更により、セキュリティが向上し、設定の一貫性と明確性が確保されます。

packages/backend/migration/1726205819617-AddIsIndexable.js Outdated Show resolved Hide resolved
packages/backend/migration/1726205819617-AddIsIndexable.js Outdated Show resolved Hide resolved
packages/backend/test/compose.yml Outdated Show resolved Hide resolved
packages/backend/src/core/AdvancedSearchService.ts Outdated Show resolved Hide resolved
packages/backend/src/core/AdvancedSearchService.ts Outdated Show resolved Hide resolved
Comment on lines 485 to 490
if (note.hasPoll) {
this.pollsRepository.findOneBy({ noteId: note.id }).then( (poll) => {
this.indexNote(note, poll ? poll.choices : undefined);
});
}
this.indexNote(note, undefined);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

fullIndexNoteメソッドでのindexNoteの二重呼び出しに注意

note.hasPolltrue の場合でも、その後に this.indexNote(note, undefined); が呼び出されています。同じノートを二度インデックスすることになり、不要な処理となる可能性があります。

if (note.hasPoll) {
  this.pollsRepository.findOneBy({ noteId: note.id }).then((poll) => {
    this.indexNote(note, poll ? poll.choices : undefined);
  });
-}
-this.indexNote(note, undefined);
+} else {
+  this.indexNote(note, undefined);
}
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (note.hasPoll) {
this.pollsRepository.findOneBy({ noteId: note.id }).then( (poll) => {
this.indexNote(note, poll ? poll.choices : undefined);
});
}
this.indexNote(note, undefined);
if (note.hasPoll) {
this.pollsRepository.findOneBy({ noteId: note.id }).then( (poll) => {
this.indexNote(note, poll ? poll.choices : undefined);
});
} else {
this.indexNote(note, undefined);
}

Comment on lines 624 to 647
public async unindexFavorite(id?: string, noteId?: string, clipId?: string, userId?: string) {
if (id) {
this.unindexByQuery(this.favoriteIndex, {
bool: {
must: [
{ term: { userId: { value: userId } } },
{ term: { noteId: { value: noteId } } },
],
must_not: [
{ exists: { field: 'clipId' } },
],
},
});
} else {
this.unindexByQuery(this.favoriteIndex, {
bool: {
must: [
{ term: { noteId: { value: noteId } } },
{ term: { clipId: { value: clipId } } },
{ exists: { field: 'clipId' } },
],
},
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

unindexFavoriteメソッドでのidパラメータの使用方法を見直してください

id が指定されている場合でも、クエリを使用して削除を行っています。id を直接使用して削除する方が効率的です。

if (id) {
-  this.unindexByQuery(this.favoriteIndex, {
-    bool: {
-      must: [
-        { term: { userId: { value: userId } } },
-        { term: { noteId: { value: noteId } } },
-      ],
-      must_not: [
-        { exists: { field: 'clipId' } },
-      ],
-    },
-  });
+  this.unindexById(this.favoriteIndex, id);
} else {
  // クリップの削除処理
}
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public async unindexFavorite(id?: string, noteId?: string, clipId?: string, userId?: string) {
if (id) {
this.unindexByQuery(this.favoriteIndex, {
bool: {
must: [
{ term: { userId: { value: userId } } },
{ term: { noteId: { value: noteId } } },
],
must_not: [
{ exists: { field: 'clipId' } },
],
},
});
} else {
this.unindexByQuery(this.favoriteIndex, {
bool: {
must: [
{ term: { noteId: { value: noteId } } },
{ term: { clipId: { value: clipId } } },
{ exists: { field: 'clipId' } },
],
},
});
}
public async unindexFavorite(id?: string, noteId?: string, clipId?: string, userId?: string) {
if (id) {
this.unindexById(this.favoriteIndex, id);
} else {
this.unindexByQuery(this.favoriteIndex, {
bool: {
must: [
{ term: { noteId: { value: noteId } } },
{ term: { clipId: { value: clipId } } },
{ exists: { field: 'clipId' } },
],
},
});
}

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Outside diff range and nitpick comments (1)
.github/workflows/test-backend.yml (1)

167-170: Codecovトークンの扱いを改善してください。

現在、CodecovトークンがGitHub Secretsを通じて参照されていますが、これは良い実践です。しかし、さらなるセキュリティ向上のため、以下の点を検討してください:

  1. ${{ secrets.CODECOV_TOKEN }} の使用を継続してください。
  2. 可能であれば、このトークンに対して最小限の権限を設定してください。
  3. トークンを定期的にローテーションする仕組みを検討してください。

これらの実践により、セキュリティがさらに強化されます。

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between ff261dd and ac9174e.

Files selected for processing (2)
  • .github/workflows/test-backend.yml (2 hunks)
  • packages/backend/test/e2e/search-notes.ts (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • packages/backend/test/e2e/search-notes.ts
Additional context used
Gitleaks
.github/workflows/test-backend.yml

147-148: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

Additional comments not posted (2)
.github/workflows/test-backend.yml (2)

13-13: トリガーパスの追加が適切です。

.github/cherrypick/test*.yml ファイルをトリガーパスに追加したのは良い変更です。これにより、テスト設定ファイルが変更された際にワークフローが実行されるため、テスト環境の一貫性が保たれます。

Also applies to: 20-20


118-170: 新しい opensearch-e2e ジョブの追加を承認します。

全体的な構造が既存の e2e ジョブと一貫しており、OpenSearchを含むエンドツーエンドテストを実行する良い方法です。特に、OpenSearch用の特定のテスト設定ファイルを使用している点(161行目)は適切な実践です。

Tools
Gitleaks

147-148: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

.github/workflows/test-backend.yml Outdated Show resolved Hide resolved
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (4)
packages/backend/src/core/AdvancedSearchService.ts (4)

Line range hint 143-170: 新しいインデックスとリポジトリの追加が適切に行われています。

リアクション、投票、お気に入りの検索機能拡張のための変更が適切に実装されています。これにより、より包括的な検索機能が提供されることが期待できます。

可読性向上のため、新しく追加されたインデックスのプロパティにコメントを追加することを検討してください。例えば:

+  /** リノートのインデックス */
   private renoteIndex: string;
+  /** リアクションのインデックス */
   private reactionIndex: string;
+  /** 投票のインデックス */
   private pollVoteIndex: string;
+  /** お気に入りとクリップのインデックス */
   private favoriteIndex: string;

330-379: 新しいインデックス作成メソッドが適切に実装されています。

リアクション、投票、お気に入りのインデックス作成メソッドが追加され、共通のインデックス作成ロジックを使用している点が良いです。これにより、コードの再利用性が向上しています。

エラーハンドリングを改善するため、indexメソッドでのエラーをキャッチし、呼び出し元に伝播させることを検討してください。例えば:

 @bindThis
-private async index(index: string, id: string, body: any ) {
+private async index(index: string, id: string, body: any): Promise<void> {
   if (!this.opensearch) return;
-  await this.opensearch.index({
-    index: index,
-    id: id,
-    body: body,
-  }).catch((error) => {
-    this.logger.error(error);
-  });
+  try {
+    await this.opensearch.index({
+      index: index,
+      id: id,
+      body: body,
+    });
+  } catch (error) {
+    this.logger.error(error);
+    throw new Error(`Failed to index document: ${error.message}`);
+  }
 }

この変更により、インデックス作成の失敗を呼び出し元で適切に処理できるようになります。


Line range hint 835-1000: 検索機能の改善が適切に実装されています。

searchメソッドにフィルタリングロジックが追加され、新しいfilterメソッドによってビジビリティやユーザー固有のフィルタリングが実装されています。これにより、より細かな検索結果の制御が可能になっています。

パフォーマンス改善のため、以下の点を検討してください:

  1. filterメソッド内でのデータベースクエリの最適化:

    • ユーザー情報のキャッシュを活用し、データベースアクセスを減らすことができます。
  2. 非同期処理の並列化:

    • Promise.all()を使用して、複数の非同期操作を並列で実行することで、全体的な処理時間を短縮できる可能性があります。
  3. インデックスの活用:

    • 頻繁に検索される項目に対してインデックスを作成し、クエリのパフォーマンスを向上させることができます。

これらの最適化により、大規模なデータセットに対しても効率的な検索が可能になると考えられます。


Line range hint 1-1000: 全体的に検索機能が大幅に改善されています。

このファイルの変更により、ノート、リアクション、投票、お気に入りなど、さまざまなタイプのデータに対する検索機能が強化されています。新しいインデックスとメソッドの追加により、より柔軟で包括的な検索が可能になっています。

今後の改善のために、以下の点を検討することをお勧めします:

  1. パフォーマンス最適化:

    • 大規模データセットに対するクエリのパフォーマンスを継続的にモニタリングし、必要に応じてインデックスを追加または調整してください。
    • 非同期処理の並列化をさらに活用し、全体的な応答時間を改善してください。
  2. エラーハンドリングの強化:

    • 各メソッドでのエラーハンドリングを統一し、エラーログの詳細度を向上させてください。
    • 重要な操作に対してはリトライメカニズムの実装を検討してください。
  3. コードの分割:

    • ファイルが大きくなっているため、関連する機能ごとにクラスを分割することを検討してください。例えば、IndexingServiceSearchServiceのように分けることで、保守性が向上する可能性があります。
  4. テストカバレッジの向上:

    • 新しく追加された機能に対する単体テストと統合テストを追加し、コードの信頼性を確保してください。

これらの改善により、コードの品質、保守性、およびパフォーマンスがさらに向上すると考えられます。

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between ac9174e and dae380e.

Files selected for processing (7)
  • CHANGELOG_YOJO.md (1 hunks)
  • packages/backend/src/core/AdvancedSearchService.ts (14 hunks)
  • packages/backend/src/core/ClipService.ts (5 hunks)
  • packages/backend/src/core/NoteCreateService.ts (2 hunks)
  • packages/backend/src/server/api/endpoints/notes/favorites/create.ts (3 hunks)
  • packages/backend/src/server/api/endpoints/notes/favorites/delete.ts (3 hunks)
  • packages/backend/test/e2e/search-notes.ts (1 hunks)
Files skipped from review as they are similar to previous changes (5)
  • packages/backend/src/core/ClipService.ts
  • packages/backend/src/core/NoteCreateService.ts
  • packages/backend/src/server/api/endpoints/notes/favorites/create.ts
  • packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
  • packages/backend/test/e2e/search-notes.ts
Additional context used
Markdownlint
CHANGELOG_YOJO.md

18-18: Expected: 1; Actual: 4
Inconsistent indentation for list items at the same level

(MD005, list-indent)


19-19: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


20-20: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


21-21: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


22-22: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


23-23: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


17-17: Expected: 4; Actual: 1
Unordered list indentation

(MD007, ul-indent)


19-19: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


20-20: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


21-21: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


22-22: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


23-23: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


17-17: Column: 1
Hard tabs

(MD010, no-hard-tabs)


19-19: Column: 3
Hard tabs

(MD010, no-hard-tabs)


20-20: Column: 3
Hard tabs

(MD010, no-hard-tabs)


21-21: Column: 3
Hard tabs

(MD010, no-hard-tabs)


22-22: Column: 3
Hard tabs

(MD010, no-hard-tabs)


23-23: Column: 3
Hard tabs

(MD010, no-hard-tabs)

Additional comments not posted (1)
CHANGELOG_YOJO.md (1)

7-23: 新機能の追加についての説明が明確です。

インデックス構造の変更と Mastodon の indexable 機能の追加について、十分な情報が提供されています。ユーザーにとって重要な以下の点が明確に説明されています:

  1. インデックスの再構築が必要であること。
  2. リアクションと投票のインデックス化に関する変更。
  3. Mastodon の indexable 機能の詳細と、それがユーザーの検索可視性にどのように影響するか。

これらの説明は、ユーザーや管理者が新しい変更を理解し、必要なアクションを取るのに役立ちます。

Tools
Markdownlint

18-18: Expected: 1; Actual: 4
Inconsistent indentation for list items at the same level

(MD005, list-indent)


19-19: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


20-20: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


21-21: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


22-22: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


23-23: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


17-17: Expected: 4; Actual: 1
Unordered list indentation

(MD007, ul-indent)


19-19: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


20-20: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


21-21: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


22-22: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


23-23: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


17-17: Column: 1
Hard tabs

(MD010, no-hard-tabs)


19-19: Column: 3
Hard tabs

(MD010, no-hard-tabs)


20-20: Column: 3
Hard tabs

(MD010, no-hard-tabs)


21-21: Column: 3
Hard tabs

(MD010, no-hard-tabs)


22-22: Column: 3
Hard tabs

(MD010, no-hard-tabs)


23-23: Column: 3
Hard tabs

(MD010, no-hard-tabs)

Comment on lines 7 to 23
インデックス構造が変わったため破棄して再インデックスが必要です。
リアクション、投票が途中からインデックスにされるので再インデックスをおすすめします。

- Enhance: 連合一覧のソートにリバーシのバージョンを追加
- Enhance: リモートのクリップをお気に入りに登録できるように
- Enhance: リモートのPlayを遊べるように
- Enhance: リモートのPlayをお気に入りに登録できるように
- Feat: mastodonのindexableに対応
- 検索で表示される条件を制限できるようになります
- 設定→プライバシーより設定できます
- 設定されている場合対応しているサーバーでは、以下のことをしたユーザーのみ検索できます
- リアクション
- リノート
- クリップ
- お気に入り
- 返信
- 投票
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

フォーマットの一貫性と読みやすさを改善してください。

新しいエントリーの内容は良いですが、フォーマットに一貫性がありません。以下の修正を提案します:

  1. インデントを統一する。
  2. 箇条書きの記号を統一する(- を使用)。
  3. Mastodonの indexable 機能の説明を改善する。

以下の修正を提案します:

 ## x.x.x
 Cherrypick 4.11.1
 
 ### Release Date
 
 ### General
-インデックス構造が変わったため破棄して再インデックスが必要です。
-リアクション、投票が途中からインデックスにされるので再インデックスをおすすめします。
+- インデックス構造が変わったため破棄して再インデックスが必要です。
+- リアクション、投票が途中からインデックスにされるので再インデックスをおすすめします。
 
 - Enhance: 連合一覧のソートにリバーシのバージョンを追加
 - Enhance: リモートのクリップをお気に入りに登録できるように
 - Enhance: リモートのPlayを遊べるように
 - Enhance: リモートのPlayをお気に入りに登録できるように
-Feat: mastodonのindexableに対応
-  - 検索で表示される条件を制限できるようになります
-  - 設定→プライバシーより設定できます
-	- 設定されている場合対応しているサーバーでは、以下のことをしたユーザーのみ検索できます
-    - リアクション
-  	- リノート 
-  	- クリップ
-  	- お気に入り
-  	- 返信
-  	- 投票
+- Feat: Mastodonのindexableに対応
+  - 検索で表示される条件を制限できるようになります
+  - 設定→プライバシーより設定できます
+  - 設定されている場合、対応しているサーバーでは以下のアクションを行ったユーザーのみ検索できます:
+    - リアクション
+    - リノート
+    - クリップ
+    - お気に入り
+    - 返信
+    - 投票

これらの変更により、ドキュメントの一貫性と読みやすさが向上します。

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
インデックス構造が変わったため破棄して再インデックスが必要です。
リアクション、投票が途中からインデックスにされるので再インデックスをおすすめします。
- Enhance: 連合一覧のソートにリバーシのバージョンを追加
- Enhance: リモートのクリップをお気に入りに登録できるように
- Enhance: リモートのPlayを遊べるように
- Enhance: リモートのPlayをお気に入りに登録できるように
- Feat: mastodonのindexableに対応
- 検索で表示される条件を制限できるようになります
- 設定→プライバシーより設定できます
- 設定されている場合対応しているサーバーでは、以下のことをしたユーザーのみ検索できます
- リアクション
- リノート
- クリップ
- お気に入り
- 返信
- 投票
## x.x.x
Cherrypick 4.11.1
### Release Date
### General
- インデックス構造が変わったため破棄して再インデックスが必要です。
- リアクション、投票が途中からインデックスにされるので再インデックスをおすすめします。
- Enhance: 連合一覧のソートにリバーシのバージョンを追加
- Enhance: リモートのクリップをお気に入りに登録できるように
- Enhance: リモートのPlayを遊べるように
- Enhance: リモートのPlayをお気に入りに登録できるように
- Feat: Mastodonのindexableに対応
- 検索で表示される条件を制限できるようになります
- 設定→プライバシーより設定できます
- 設定されている場合、対応しているサーバーでは以下のアクションを行ったユーザーのみ検索できます:
- リアクション
- リノート
- クリップ
- お気に入り
- 返信
- 投票
Tools
Markdownlint

18-18: Expected: 1; Actual: 4
Inconsistent indentation for list items at the same level

(MD005, list-indent)


19-19: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


20-20: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


21-21: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


22-22: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


23-23: Expected: 1; Actual: 3
Inconsistent indentation for list items at the same level

(MD005, list-indent)


17-17: Expected: 4; Actual: 1
Unordered list indentation

(MD007, ul-indent)


19-19: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


20-20: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


21-21: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


22-22: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


23-23: Expected: 4; Actual: 3
Unordered list indentation

(MD007, ul-indent)


17-17: Column: 1
Hard tabs

(MD010, no-hard-tabs)


19-19: Column: 3
Hard tabs

(MD010, no-hard-tabs)


20-20: Column: 3
Hard tabs

(MD010, no-hard-tabs)


21-21: Column: 3
Hard tabs

(MD010, no-hard-tabs)


22-22: Column: 3
Hard tabs

(MD010, no-hard-tabs)


23-23: Column: 3
Hard tabs

(MD010, no-hard-tabs)

Comment on lines 293 to 327
public async indexNote(note: MiNote, choices?: string[]): Promise<void> {
if (!this.opensearch) return;
if (note.text == null && note.cw == null) {
await this.index(this.renoteIndex, note.id, {
renoteId: note.renoteId,
userId: note.userId,
userHost: note.userHost,
createdAt: this.idService.parse(note.id).date.getTime(),
tags: note.tags,
fileIds: note.fileIds,
visibility: note.visibility,
visibleUserIds: note.visibleUserIds,
isReply: IsReply,
isQuote: IsQuote,
referenceUserId: IsReply ? note.replyUserId : IsQuote ? note.renoteUserId : null,
sensitiveFileCount: sensitiveCount,
nonSensitiveFileCount: nonSensitiveCount,
};
await this.opensearch.index({
index: this.opensearchNoteIndex as string,
id: note.id,
body: body,
}).catch((error) => {
this.logger.error(error);
});
return;
}
if (await this.redisClient.get('indexDeleted') !== null) {
return;
}
const IsQuote = isRenote(note) && isQuote(note);
const sensitiveCount = await this.driveService.getSensitiveFileCount(note.fileIds);
const nonSensitiveCount = note.fileIds.length - sensitiveCount;

const body = {
text: note.text,
cw: note.cw,
userId: note.userId,
userHost: note.userHost,
createdAt: this.idService.parse(note.id).date.getTime(),
tags: note.tags,
fileIds: note.fileIds,
visibility: note.visibility,
visibleUserIds: note.visibleUserIds,
replyId: note.replyId,
renoteId: note.renoteId,
pollChoices: choices,
referenceUserId: note.replyId ? note.replyUserId : IsQuote ? note.renoteUserId : null,
sensitiveFileCount: sensitiveCount,
nonSensitiveFileCount: nonSensitiveCount,
};
this.index(this.opensearchNoteIndex as string, note.id, body);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

indexNoteunindexNoteメソッドの改善が適切に行われています。

リノートの処理が改善され、関連するエントリーの削除が他のインデックスにも適用されるようになりました。これにより、データの一貫性が向上しています。

ただし、fullIndexNoteメソッドに潜在的な問題があります:

fullIndexNoteメソッド内で、投票を含むノートの処理に非同期の問題がある可能性があります。以下のように修正することを検討してください:

-if (note.hasPoll) {
-  this.pollsRepository.findOneBy({ noteId: note.id }).then((poll) => {
-    this.indexNote(note, poll ? poll.choices : undefined);
-  });
-} else {
-  this.indexNote(note, undefined);
-}
+if (note.hasPoll) {
+  const poll = await this.pollsRepository.findOneBy({ noteId: note.id });
+  await this.indexNote(note, poll ? poll.choices : undefined);
+} else {
+  await this.indexNote(note, undefined);
+}

この変更により、投票を含むノートのインデックス作成が確実に完了してから次のノートの処理に移ることができます。

Also applies to: 516-559

@penginn-net penginn-net changed the base branch from develop to indexable September 24, 2024 10:58
@penginn-net penginn-net merged commit 594fafe into indexable Sep 24, 2024
27 of 28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant