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

feat: legal 関連の処理を追加 #652

Merged
merged 1 commit into from
Oct 5, 2024
Merged

feat: legal 関連の処理を追加 #652

merged 1 commit into from
Oct 5, 2024

Conversation

tatsutakein
Copy link
Member

@tatsutakein tatsutakein commented Oct 5, 2024

Issue

概要

legal 関連の処理を追加します。

レビュー観点

レビューレベル

  • Lv0: まったく見ないで Approve する
  • Lv1: ぱっとみて違和感がないかチェックして Approve する
  • Lv2: 仕様レベルまで理解して、仕様通りに動くかある程度検証して Approve する
  • Lv3: 実際に環境で動作確認したうえで Approve する

レビュー優先度

  • すぐに見てもらいたい ( hotfix など ) 🚀
  • 今日中に見てもらいたい 🚗
  • 今日〜明日中で見てもらいたい 🚶
  • 数日以内で見てもらいたい 🐢

参考リンク

スクリーンショット

Before After

Summary by CodeRabbit

  • 新機能
    • 整数値を扱うためのメソッドが追加され、ユーザーが設定した整数値を保存および取得できるようになりました。
    • 法的ルールと合意に関する新しいリポジトリとユースケースが追加され、法的情報の管理が容易になりました。
  • ドキュメント
    • 新しいファイルが追加され、法的ルールの取得や合意処理が簡単に行えるようになりました。

@tatsutakein tatsutakein requested a review from a team as a code owner October 5, 2024 07:50
Copy link

coderabbitai bot commented Oct 5, 2024

Walkthrough

このプルリクエストでは、PreferencesDataStoreクラスに整数値を扱うためのメソッドが追加され、LegalRepositoryクラスとその関連機能が新たに導入されました。加えて、データストアや法律に関連するユースケースを管理するための新しいファイルが作成され、これによりコードベースのモジュール性が向上しています。全体として、法律関連の処理を追加するための機能が強化されました。

Changes

ファイル 変更概要
app/mobile/lib/datastore/preferences_data_store.dart メソッド追加: getInt(String key), setInt(String key, int value)
core/data/lib/legal.dart ファイルエクスポート: legal_repository.dart
core/data/lib/src/legal_repository.dart クラス追加: LegalRepository, メソッド追加: fetchRule(), setAgreeVersion(), プロパティ追加: agreedVersion
core/data/lib/src/legal_repository.g.dart プロバイダー追加: legalRepositoryProvider, タイプエイリアス追加: LegalRepositoryRef
core/datastore/lib/agreed_version_data_store.dart ファイルエクスポート: src/agreed_version_data_store.dart
core/datastore/lib/src/agreed_version_data_store.dart クラス追加: AgreedVersionDataStore, メソッド追加: get(), set(int agreedVersion), reset(), プロパティ追加: Stream<int?> stream
core/datastore/lib/src/agreed_version_data_store.g.dart プロバイダー追加: agreedVersionDataStoreProvider, タイプエイリアス追加: AgreedVersionDataStoreRef
core/datastore/lib/src/data_store.dart メソッド追加: getInt(String key), setInt(String key, int value)
core/domain/lib/legal.dart ファイルエクスポート: agree_use_case.dart, fetch_rule_use_case.dart
core/domain/lib/src/use_case/legal/agree_use_case.dart メソッド追加: agreeUseCase(AgreeUseCaseRef ref, {required RuleVersion agreeRuleVersion})
core/domain/lib/src/use_case/legal/agree_use_case.g.dart クラス追加: AgreeUseCaseFamily, AgreeUseCaseProvider, タイプエイリアス追加: AgreeUseCaseRef
core/domain/lib/src/use_case/legal/fetch_rule_use_case.dart メソッド追加: fetchRuleUseCase(FetchRuleUseCaseRef ref)
core/domain/lib/src/use_case/legal/fetch_rule_use_case.g.dart プロバイダー追加: fetchRuleUseCaseProvider, タイプエイリアス追加: FetchRuleUseCaseRef
core/model/lib/rule.dart ファイルエクスポート: src/rule.dart
core/model/lib/src/rule.dart クラス追加: Rule, 拡張タイプ追加: RuleVersion
core/model/lib/src/rule.freezed.dart ミックスイン追加: _$Rule, クラス追加: _$RuleImpl

Assessment against linked issues

目的 対応 説明
legal 関連の処理を追加 (#651)
legal 関連の処理を追加 (#651)

Possibly related PRs

Suggested labels

@core/data, @core/datastore, @core/domain, @core/model, @feature/auth

🐇 変化の喜び、跳ねる心
法律の道を、進む勇気
新しいルール、明るい未来
データの海を、共に渡る
みんなで築く、約束の庭 🌱


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.

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.

@tatsutakeinjp-bot
Copy link
Contributor

Commands

Command Description
/catalog この Pull Request の Catalog を Firebase Hosting にデプロイ
/gen コード生成コマンドを実行

@github-actions github-actions bot added @core/data core data package @core/datastore core datastore package @core/domain core domain package @core/model core model package @app/mobile mobile app package labels Oct 5, 2024
@tatsutakein tatsutakein merged commit 4e2bc08 into main Oct 5, 2024
16 checks passed
@tatsutakein tatsutakein deleted the feature/GH-651 branch October 5, 2024 07:56
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: 4

🧹 Outside diff range and nitpick comments (7)
core/domain/lib/src/use_case/legal/fetch_rule_use_case.dart (2)

7-7: ドキュメンテーションの改善が必要です。

現在のコメント「同意日時を取得する」は、関数の目的を正確に表現していません。この関数は規則(Rule)全体を取得しているようです。

以下のように、コメントを更新することをお勧めします:

-/// 同意日時を取得する
+/// 法的規則を取得する

これにより、関数の目的がより明確になります。


8-10: 実装は適切ですが、エラーハンドリングの追加を検討してください。

Riverpodを使用したユースケースの実装として適切です。リポジトリに適切に処理を委譲しており、関数名と戻り値の型も目的に合っています。

ただし、エラーハンドリングを追加することで、より堅牢な実装になる可能性があります。以下のような実装を検討してください:

@riverpod
Future<Rule> fetchRuleUseCase(FetchRuleUseCaseRef ref) async {
  try {
    return await ref.watch(legalRepositoryProvider).fetchRule();
  } catch (e) {
    // エラーをログに記録したり、適切に処理したりします
    throw Exception('規則の取得に失敗しました: $e');
  }
}

これにより、エラーが発生した場合に適切に処理できます。

core/model/lib/src/rule.dart (2)

5-6: ドキュメンテーションコメントの追加を検討してください

RuleVersionの拡張型は適切に定義されていますが、その目的や使用方法を説明する簡単なドキュメンテーションコメントを追加することをお勧めします。これにより、他の開発者がこの型の意図をより理解しやすくなります。

例:

/// 利用規約のバージョンを表す型。
/// 
/// この型は整数値をラップし、利用規約のバージョンを
/// 他の整数値と区別するために使用されます。
extension type RuleVersion(int value) implements int {}

8-17: ドキュメンテーションコメントの拡充を推奨

Ruleクラスの基本的な構造は適切です。しかし、ドキュメンテーションコメントをより詳細にすることで、クラスの目的と使用方法をより明確にできます。以下のような拡充を検討してください:

/// 利用規約を表すクラス。
///
/// このクラスは、利用規約のバージョンと内容を不変のデータとして保持します。
/// Freezedパッケージを使用して、イミュータブルなオブジェクトとして実装されています。
///
/// [version] 利用規約のバージョン
/// [content] 利用規約の本文
///
/// {@category Model}
@freezed
class Rule with _$Rule {
  const factory Rule({
    required RuleVersion version,
    required String content,
  }) = _Rule;
}

これにより、クラスの目的、各フィールドの意味、そしてFreezeパッケージの使用理由が明確になります。

core/datastore/lib/src/data_store.dart (1)

12-14: 整数値処理の追加は適切で、インターフェースを強化しています。

新しく追加された getIntsetInt メソッドは、DataStore インターフェースの機能を拡張し、整数値の処理を可能にしています。これらの追加は既存の構造と一貫性があり、インターフェースの使いやすさを向上させています。

将来的な考慮事項:

  1. 他のデータ型(例:booldoubleDateTimeなど)に対しても同様のメソッドが必要になる可能性があります。
  2. 複数の値を一度に取得または設定するバッチ操作メソッドの追加を検討することもできるかもしれません。

これらの拡張が必要かどうかを判断するために、法的処理に関する具体的な要件を確認することをお勧めします。

core/domain/lib/src/use_case/legal/agree_use_case.dart (1)

8-13: 関数の宣言は適切ですが、Rawラッパーについて説明が必要です。

関数の名前、パラメータ、戻り値の型は適切に定義されています。しかし、Raw<FutureResult<void>>の使用理由について、コメントで説明を追加することをお勧めします。これにより、コードの意図がより明確になり、将来のメンテナンスが容易になります。

以下のようなコメントを追加することを検討してください:

/// 同意する
///
/// [Raw]ラッパーを使用して、Riverpodの自動依存関係追跡を回避し、
/// 必要な場合にのみ再評価されるようにします。
@riverpod
Raw<FutureResult<void>> agreeUseCase(
  AgreeUseCaseRef ref, {
  required RuleVersion agreeRuleVersion,
}) async {
  // ... 既存のコード ...
}
core/data/lib/src/legal_repository.dart (1)

15-16: クラスのドキュメンテーションコメントを充実させてください

LegalRepository クラスに対して、クラスの役割や使用方法を明確にするためのドキュメンテーションコメントを追加すると、コードの可読性と保守性が向上します。

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 85e6b46 and 1a9e025.

📒 Files selected for processing (16)
  • app/mobile/lib/datastore/preferences_data_store.dart (1 hunks)
  • core/data/lib/legal.dart (1 hunks)
  • core/data/lib/src/legal_repository.dart (1 hunks)
  • core/data/lib/src/legal_repository.g.dart (1 hunks)
  • core/datastore/lib/agreed_version_data_store.dart (1 hunks)
  • core/datastore/lib/src/agreed_version_data_store.dart (1 hunks)
  • core/datastore/lib/src/agreed_version_data_store.g.dart (1 hunks)
  • core/datastore/lib/src/data_store.dart (1 hunks)
  • core/domain/lib/legal.dart (1 hunks)
  • core/domain/lib/src/use_case/legal/agree_use_case.dart (1 hunks)
  • core/domain/lib/src/use_case/legal/agree_use_case.g.dart (1 hunks)
  • core/domain/lib/src/use_case/legal/fetch_rule_use_case.dart (1 hunks)
  • core/domain/lib/src/use_case/legal/fetch_rule_use_case.g.dart (1 hunks)
  • core/model/lib/rule.dart (1 hunks)
  • core/model/lib/src/rule.dart (1 hunks)
  • core/model/lib/src/rule.freezed.dart (1 hunks)
✅ Files skipped from review due to trivial changes (7)
  • core/data/lib/legal.dart
  • core/data/lib/src/legal_repository.g.dart
  • core/datastore/lib/agreed_version_data_store.dart
  • core/datastore/lib/src/agreed_version_data_store.g.dart
  • core/domain/lib/legal.dart
  • core/domain/lib/src/use_case/legal/fetch_rule_use_case.g.dart
  • core/model/lib/rule.dart
🔇 Additional comments (15)
core/domain/lib/src/use_case/legal/fetch_rule_use_case.dart (1)

1-5: インポートと部分宣言が適切です。

インポートと部分宣言は、このユースケースに適しており、Riverpodのコード生成を正しく使用しています。

core/model/lib/src/rule.dart (2)

1-3: LGTM: Freezedパッケージの適切な使用

Freezedパッケージのインポートとpart宣言が正しく行われています。コード生成のための適切なセットアップが確認できます。


1-17: 実装は適切ですが、一貫性の確認を推奨

全体として、このRuleモデルの実装は適切で、PRの目的である法的処理の追加に合致しています。Freezedパッケージの使用や拡張型の活用は、型安全性と不変性を確保するための良い実践です。

コードの構造はクリーンで、Dartの規約に従っています。ただし、以下の点を確認することをお勧めします:

  1. このモデルが他の関連するモデルや処理と一貫性を保っているか。
  2. RuleVersionの使用が、アプリケーション全体で一貫して行われているか。
  3. この実装が、将来の拡張性(例:追加のフィールドや関連する法的処理)を考慮しているか。

これらの点を確認することで、より堅牢で保守性の高い実装になると思われます。

以下のスクリプトを実行して、RuleVersionの使用の一貫性を確認してください:

✅ Verification successful

RuleVersionの使用は一貫しています

シェルスクリプトの実行結果に基づき、RuleVersionの使用に一貫性が保たれていることが確認されました。versionフィールドに直接整数が使用されていないため、潜在的な不整合は存在しません。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of RuleVersion across the codebase

# Test: Search for RuleVersion usage
echo "Checking RuleVersion usage:"
rg --type dart "RuleVersion"

# Test: Check for potential inconsistencies (e.g., direct int usage for versions)
echo "Checking for potential inconsistencies:"
rg --type dart "version:\s+\d+"

Length of output: 3055

core/datastore/lib/src/data_store.dart (2)

12-12: getInt メソッドの追加は適切です。

このメソッドは既存の getString メソッドと一貫性があり、整数値を取得するための適切な機能を提供しています。オプショナルな戻り値型 (int?) の使用も、キーが存在しない場合や整数値以外の値が格納されている可能性を考慮しており、適切です。


14-14: setInt メソッドの追加は適切です。

このメソッドは既存の setString メソッドと一貫性があり、整数値を保存するための適切な機能を提供しています。Future<bool> を戻り値型として使用していることも、操作の成功または失敗を示すために適切です。

core/domain/lib/src/use_case/legal/agree_use_case.dart (1)

1-6: インポートと部分宣言が適切です。

インポートされているパッケージと部分宣言は、この機能の実装に適していると思われます。Riverpodを使用したコード生成の準備も整っています。

app/mobile/lib/datastore/preferences_data_store.dart (3)

12-13: 実装が適切です。

getIntメソッドの追加は適切に行われています。既存のgetStringメソッドと一貫性のある実装になっており、DataStoreインターフェースを正しく拡張しています。


15-16: 実装が適切です。

setIntメソッドの追加も適切に行われています。既存のsetStringメソッドと同様のパターンで実装されており、DataStoreインターフェースを正しく拡張しています。


12-16: PRの目的と実際の変更内容の関連性について確認が必要です。

PRの目的には法的処理の追加が記載されていますが、実際の変更はPreferencesDataStoreクラスに整数値を扱う機能を追加するものです。これらの変更が法的処理にどのように関連しているのか、または前提条件となっているのかが不明確です。

法的処理との関連性や、この変更が必要な理由について、追加の説明をいただけますでしょうか?

core/data/lib/src/legal_repository.dart (3)

24-27: fetchRule() メソッドのハードコードされた値について確認してください

fetchRule() メソッドでは、RuleVersion(1)content: 'content' がハードコードされています。これは仮実装でしょうか?もしそうであれば、実際の利用規約データを取得する実装に更新する必要があります。


30-32: agreedVersion ゲッターのnull安全性と拡張メソッドの使用を確認してください

agreedVersion プロパティで、_agreedVersionDataStore.get()?.let(RuleVersion.new); としていますが、let 拡張メソッドの適用が正しいか確認してください。get() メソッドの戻り値が null の場合に備え、null安全な処理を確保してください。


8-8: legal_repository.g.dart の生成ファイルを確認してください

part 'legal_repository.g.dart'; とありますが、対応する生成ファイルが存在し、ビルドが正しく行われることを確認してください。ビルドランナーの設定や実行が必要な場合があります。

core/domain/lib/src/use_case/legal/agree_use_case.g.dart (2)

1-174: 自動生成コードの確認

このファイルは自動生成されたコードであり、問題ありません。


85-157: 新しいプロバイダーの使用箇所を確認してください

AgreeUseCaseProviderがコードベース内で正しく使用されているか確認してください。

以下のスクリプトを実行して、AgreeUseCaseProviderの使用箇所を検証してください:

✅ Verification successful

AgreeUseCaseProviderの使用箇所を確認しましたが、問題は見つかりませんでした。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 説明:AgreeUseCaseProviderの使用箇所を検索

# テスト:AgreeUseCaseProviderを使用している箇所を検索します。期待値:新しいプロバイダーが適切に使用されていること。
rg --type dart 'AgreeUseCaseProvider' -A 5

Length of output: 5316

core/model/lib/src/rule.freezed.dart (1)

1-157: 自動生成されたコードです - レビュー不要

このファイルはFreezedパッケージによって自動生成されたため、手動での修正やレビューは不要です。

Comment on lines +14 to +19
return await ref.watch(legalRepositoryProvider).setAgreeVersion(
version: agreeRuleVersion,
)
? const Ok(null)
: Exception('Failed to agree.').toErr();
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

実装は適切ですが、エラーメッセージをより具体的にできます。

関数の実装は全体的に適切で、良い実践に従っています。しかし、エラーメッセージをより具体的にすることで、デバッグや問題解決が容易になる可能性があります。

エラーメッセージを以下のように改善することを検討してください:

- : Exception('Failed to agree.').toErr();
+ : Exception('Failed to agree to rule version: $agreeRuleVersion').toErr();

この変更により、どのルールバージョンで同意に失敗したかが明確になり、問題の特定と解決が容易になります。

📝 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
return await ref.watch(legalRepositoryProvider).setAgreeVersion(
version: agreeRuleVersion,
)
? const Ok(null)
: Exception('Failed to agree.').toErr();
}
return await ref.watch(legalRepositoryProvider).setAgreeVersion(
version: agreeRuleVersion,
)
? const Ok(null)
: Exception('Failed to agree to rule version: $agreeRuleVersion').toErr();
}

Comment on lines +35 to +39
Future<bool> setAgreeVersion({
required RuleVersion version,
}) async {
return _agreedVersionDataStore.set(version);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

setAgreeVersion メソッドの戻り値の型を確認してください

setAgreeVersion メソッドは Future<bool> を返していますが、_agreedVersionDataStore.set(version);bool を返すか確認してください。もし set メソッドが void を返す場合、メソッドの戻り値の型を Future<void> に変更する必要があります。

Comment on lines +24 to +39
Future<Rule> fetchRule() async => Rule(
version: RuleVersion(1),
content: 'content',
);

/// 利用規約に同意したバージョンを取得する
RuleVersion? get agreedVersion {
return _agreedVersionDataStore.get()?.let(RuleVersion.new);
}

/// 同意する利用規約のバージョンを設定する
Future<bool> setAgreeVersion({
required RuleVersion version,
}) async {
return _agreedVersionDataStore.set(version);
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

データストア操作のエラーハンドリングを追加してください

fetchRulesetAgreeVersion メソッドで、データストアとの通信中にエラーが発生した場合の処理が実装されていません。例外処理を追加し、エラーが発生した際に適切な対処ができるようにしてください。

Comment on lines +17 to +22
AgreedVersionDataStore({
required this.dataStore,
}) : _streamController = StreamController<int?>() {
final initAgreedVersion = get();
_streamController.add(initAgreedVersion);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

StreamControllerのリソースを適切に解放してください

AgreedVersionDataStoreクラスで使用している_streamControllerは、使用後に明示的にclose()する必要があります。そうしないと、メモリリークを引き起こす可能性があります。クラスにdisposeメソッドを追加し、リソースを解放するようにしてください。

提案されたコードの追加:

void dispose() {
  _streamController.close();
}

また、AgreedVersionDataStoreを使用する箇所で、適切なタイミングでdispose()メソッドを呼び出すようにしてください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
@app/mobile mobile app package @core/data core data package @core/datastore core datastore package @core/domain core domain package @core/model core model package
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature]: legal 関連の処理を追加
1 participant