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

✨ ID を元にスケジュールを取得するユースケースを追加 #121

Merged
merged 5 commits into from
Dec 5, 2023

Conversation

tatsutakein
Copy link
Member

@tatsutakein tatsutakein commented Dec 5, 2023

Issue

  • close #ISSUE_NUMBER 🦕

概要

ID を元にスケジュールを取得するユースケースを追加します。

レビュー観点

特になし

レビューレベル

  • 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 December 5, 2023 11:49
Copy link

coderabbitai bot commented Dec 5, 2023

Walkthrough

新しいPlace関連のクラスとインターフェースが追加され、既存のユースケースとリポジトリに統合されました。これにより、場所のデータを取得し、参加者のスケジュールに関連付ける機能が拡張されています。また、ネットワーク層には偽のデータソースとSupabaseクライアントを使用する実装が導入されています。

Changes

ファイル 変更概要
.../DefaultPlaceRepository.kt
.../PlaceRepository.kt
.../DataModule.kt
新しいPlaceRepositoryインターフェースとそのデフォルト実装が追加され、DIモジュールにバインドされました。
.../FetchParticipantScheduleByIdUseCase.kt
.../GetParticipantScheduleListUseCase.kt
.../GetRecentScheduleUseCase.kt
PlaceRepositoryがユースケースに統合され、場所のデータ取得が追加されました。
.../ParticipantSchedule.kt ParticipantScheduleデータクラスが更新され、venueIdmeetIdPlaceオブジェクトに置き換えられました。
.../Place.kt
.../PlaceId.kt
新しいPlaceクラスとPlaceId型エイリアスが追加されました。
.../FakeRemoteDataSourceModule.kt
.../RemoteDataSourceModule.kt
PlaceRemoteDataSourceとその偽の実装がネットワークモジュールに追加されました。
.../FakePlaceRemoteDataSource.kt
.../PlaceRemoteDataSource.kt
.../SupabasePlaceRemoteDataSource.kt
場所のデータを取得するための新しいリモートデータソースインターフェースとその実装が追加されました。
.../NetworkPlace.kt 新しいNetworkPlaceデータクラスと偽のデータを生成する関数が追加されました。
.../SupabaseScheduleRemoteDataSource.kt
.../NetworkSchedule.kt
スケジュールデータのデコード方法が変更され、説明テキストの改行処理が更新されました。

🐇💻
コードの森を駆け巡り
新たな場所を繋ぎ合わせ
データの流れを紡ぎ出す
うさぎの仕事は終わらず 🌟


Tips

Chat with CodeRabbit Bot (@coderabbitai)

  • If you reply to a review comment from CodeRabbit, the bot will automatically respond.
  • To engage with CodeRabbit bot directly around the specific lines of code in the PR, mention @coderabbitai in your review comment
  • Note: Review comments are made on code diffs or files, not on the PR overview.
  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Note: For conversation with the bot, please use the review comments on code diffs or files.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • 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/coderabbit-overrides.v2.json

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.

Review Status

Actionable comments generated: 5

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between d457ec0 and 631cba0.
Files selected for processing (17)
  • core/data/src/commonMain/kotlin/club/nito/core/data/DefaultPlaceRepository.kt (1 hunks)
  • core/data/src/commonMain/kotlin/club/nito/core/data/PlaceRepository.kt (1 hunks)
  • core/data/src/commonMain/kotlin/club/nito/core/data/di/DataModule.kt (2 hunks)
  • core/domain/src/commonMain/kotlin/club/nito/core/domain/FetchParticipantScheduleByIdUseCase.kt (5 hunks)
  • core/domain/src/commonMain/kotlin/club/nito/core/domain/GetParticipantScheduleListUseCase.kt (5 hunks)
  • core/domain/src/commonMain/kotlin/club/nito/core/domain/GetRecentScheduleUseCase.kt (4 hunks)
  • core/domain/src/commonMain/kotlin/club/nito/core/domain/model/ParticipantSchedule.kt (1 hunks)
  • core/model/src/commonMain/kotlin/club/nito/core/model/place/Place.kt (1 hunks)
  • core/model/src/commonMain/kotlin/club/nito/core/model/place/PlaceId.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/di/FakeRemoteDataSourceModule.kt (2 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/di/RemoteDataSourceModule.kt (2 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/place/FakePlaceRemoteDataSource.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/place/PlaceRemoteDataSource.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/place/SupabasePlaceRemoteDataSource.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/place/model/NetworkPlace.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/schedule/SupabaseScheduleRemoteDataSource.kt (1 hunks)
  • core/network/src/commonMain/kotlin/club/nito/core/network/schedule/model/NetworkSchedule.kt (1 hunks)
Additional comments: 19
core/data/src/commonMain/kotlin/club/nito/core/data/DefaultPlaceRepository.kt (1)
  • 1-13: この変更は、PlaceRepository インターフェースを実装し、fetchPlaceList メソッドをオーバーライドしています。このメソッドは PlaceId の可変長引数を受け取り、リストに変換して remoteDataSource.fetchPlaceList に渡しています。ロジック、正確さ、パフォーマンスに関する明らかな問題は見受けられません。エラーハンドリングについては、PRの概要に具体的な要件が記載されておらず、上流のコードで適切に管理されていると仮定する指示があるため、このレビューでは考慮していません。コードはシンプルで保守性が高く、KISSの原則に従っています。
core/data/src/commonMain/kotlin/club/nito/core/data/di/DataModule.kt (2)
  • 6-6: 新しいインポート文 DefaultPlaceRepository が追加されました。これは、PlaceRepository の新しいバインディングをサポートするために必要です。

  • 23-23: Koinモジュールに DefaultPlaceRepositoryPlaceRepository にバインドする新しい定義が追加されました。これにより、依存性注入を通じて PlaceRepository のインスタンスが必要な場合に DefaultPlaceRepository のインスタンスが提供されるようになります。

core/domain/src/commonMain/kotlin/club/nito/core/domain/GetParticipantScheduleListUseCase.kt (1)
  • 1-15: PRの目的とコードの変更内容に齟齬があるかもしれません。PRの目的ではIDに基づいてスケジュールを取得するユースケースの追加について述べていますが、コードの変更内容は新しいPlaceエンティティの統合に関連しています。この点について確認が必要です。
core/domain/src/commonMain/kotlin/club/nito/core/domain/GetRecentScheduleUseCase.kt (4)
  • 1-15: PRの目的と変更の要約に矛盾があります。PRの目的はIDに基づいてスケジュールを取得するユースケースを追加することですが、要約では新しいPlaceエンティティの統合に焦点を当てています。この点を確認してください。

  • 1-15: > Note: This review was outside the patches, so it was mapped to the patch with the greatest overlap. Original lines [3-30]

変更は適切に行われており、PlaceRepositoryのインポートとコンストラクタへの追加が確認できます。

  • 49-60: placeRepository.fetchPlaceListの呼び出しは、ParticipantScheduleの以前のvenueIdmeetIdフィールドを置き換えるものと思われます。これは要約に記載されている変更と一致しています。

  • 63-76: transformToParticipantSchedule関数がplacesリストを使用してIDによるvenuemeetを見つけるように更新されています。これは要約に記載されている変更と一致しています。

core/domain/src/commonMain/kotlin/club/nito/core/domain/model/ParticipantSchedule.kt (1)
  • 8-16: 変更されたParticipantScheduleクラスは、venueIdmeetIdPlace型のvenuemeetに置き換えられていることを反映しています。この変更は、PRの目的と提供された要約と一致しています。コードベースの他の部分、特にParticipantScheduleインスタンスの作成と使用方法について、この変更が一貫していることを確認する必要があります。
core/model/src/commonMain/kotlin/club/nito/core/model/place/Place.kt (1)
  • 1-17: > 💡 NOTE

Codebase verification is a beta feature.

Place クラスの追加はPRの目的に沿っており、PlaceId 型エイリアスの定義も確認されました。問題は見つかりませんでした。

core/model/src/commonMain/kotlin/club/nito/core/model/place/PlaceId.kt (1)
  • 1-6: この変更は、String型のエイリアスとしてPlaceIdを定義しており、場所IDを表すために使用されます。これにより、コードの可読性が向上し、場所IDがどのように使用されるかが明確になります。
core/network/src/commonMain/kotlin/club/nito/core/network/di/FakeRemoteDataSourceModule.kt (2)
  • 4-11: 新しいインターフェースPlaceRemoteDataSourceとその偽装実装FakePlaceRemoteDataSourceが追加されたことを確認してください。これは、場所に関連する情報を取得するための新しいデータソースがネットワーク層に導入されたことを示しています。

  • 25-29: Koinモジュール設定にFakePlaceRemoteDataSourceが追加されたことを確認してください。これにより、テスト用の偽のデータソースが依存性注入に組み込まれ、使用できるようになります。

core/network/src/commonMain/kotlin/club/nito/core/network/di/RemoteDataSourceModule.kt (2)
  • 8-9: 新しいPlaceRemoteDataSourceSupabasePlaceRemoteDataSourceのインポートが追加されています。これはプルリクエストの目的と要約に合致しています。

  • 48-48: SupabasePlaceRemoteDataSourceに対する新しいバインディングがsingleOfbindを使用して追加されています。これもプルリクエストの目的と要約に沿っています。

core/network/src/commonMain/kotlin/club/nito/core/network/place/FakePlaceRemoteDataSource.kt (1)
  • 8-14: このハンクは、テスト目的のためのモック実装として適切に設計されており、特に問題は見受けられません。FakePlaceRemoteDataSourceはシングルトンオブジェクトとして実装されており、PlaceRemoteDataSourceインターフェースを適切に実装しています。fetchPlaceList関数は、createFakeNetworkPlace関数を使用してNetworkPlaceオブジェクトを生成し、それをPlaceオブジェクトに変換しています。エラーハンドリングはありませんが、これはテスト用の偽のデータソースであるため、意図的なものと考えられます。
core/network/src/commonMain/kotlin/club/nito/core/network/place/SupabasePlaceRemoteDataSource.kt (1)
  • 15-31: このコードの変更は、新しい機能「IDを使用してスケジュールを取得する」に関連していると思われます。fetchPlaceListメソッドは、指定されたIDリストに基づいて場所のデータを取得し、削除されていないレコードのみをフィルタリングしています。このロジックは明確で、特に問題は見受けられません。
core/network/src/commonMain/kotlin/club/nito/core/network/schedule/SupabaseScheduleRemoteDataSource.kt (1)
  • 49-53: 変更されたメソッド decodeAs は、以前の decodeSingle メソッドと同様の機能を提供することを確認してください。また、この変更が NetworkSchedule オブジェクトのデコード方法に影響を与えないことを検証してください。
core/network/src/commonMain/kotlin/club/nito/core/network/schedule/model/NetworkSchedule.kt (1)
  • 20-23: 変更されたコードは、NetworkSchedule クラスの description フィールドでエスケープされた改行文字を実際の改行文字に置き換えるためのものです。この変更は、説明テキストの表示を修正するためのものと思われます。この変更により、アプリケーション内での説明の表示や処理が影響を受ける可能性があります。コードレビューの観点からは、この変更は適切であり、特に問題は見受けられません。

/**
* 場所に関するリポジトリ
*/
public sealed interface PlaceRepository {
Copy link

Choose a reason for hiding this comment

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

PlaceRepositoryがsealed interfaceとして定義されていますが、これはリポジトリパターンには一般的ではありません。sealed interfaceは、限定された実装セットを持つ場合に使用されることが多いです。リポジトリは様々なデータソースによって実装されることが期待されているため、ここではsealedを削除することを検討してください。

/**
* 場所リモートデータソース
*/
public sealed interface PlaceRemoteDataSource {
Copy link

Choose a reason for hiding this comment

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

PlaceRemoteDataSourceがsealed interfaceとして定義されていますが、これは一般的なデータソースインターフェースの使用法とは異なります。sealed interfaceは、限定された実装セットを持つ場合に使用されることが多いです。データソースのように、潜在的に多くの実装が考えられる場合には、sealedを使用することは推奨されません。この設計意図を再検討することをお勧めします。

Comment on lines +31 to +43
internal fun createFakeNetworkPlace(
id: String = "bbe00d24-d840-460d-a127-f23f9e472cc6",
name: String = "レイクタウン",
description: String = "レイクタウンは、埼玉県越谷市にある複合商業施設である。2008年(平成20年)3月14日に開業した。運営は三井不動産商業マネジメントが行っている。",
mapUrl: String = "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3239.919508821314!2d139.790403315258!3d35.89174898014363!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6018f3b0b0b0b0b1%3A0x1b0b0b0b0b0b0b0b!2z44CSMzUwLTAwMjQg5p2x5Lqs6YO95riv5Yy65Y2X6YCa5L2c5a2Q5bGx77yR5LiB55uu77yR77yR4oiS77yR!5e0!3m2!1sja!2sjp!4v1629788517009!5m2!1sja!2sjp",
imageUrl: String = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Laketown_outside.jpg/1200px-Laketown_outside.jpg",
) = NetworkPlace(
id = id,
name = name,
description = description,
mapUrl = mapUrl,
imageUrl = imageUrl,
)
Copy link

Choose a reason for hiding this comment

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

createFakeNetworkPlace関数は、テスト目的で偽の場所データを作成するために使用されますが、descriptionのエスケープされた改行文字を実際の改行文字に置き換えるロジックが含まれていません。これはtoPlaceメソッドの動作と一貫性がありません。テストデータが実際のデータと同じように処理されるように、この置換ロジックを追加することをお勧めします。

) = NetworkPlace(
    id = id,
    name = name,
-   description = description,
+   description = description.replace("\\n", "\n"),
    mapUrl = mapUrl,
    imageUrl = imageUrl,
)

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.

Suggested change
internal fun createFakeNetworkPlace(
id: String = "bbe00d24-d840-460d-a127-f23f9e472cc6",
name: String = "レイクタウン",
description: String = "レイクタウンは、埼玉県越谷市にある複合商業施設である。2008年(平成20年)3月14日に開業した。運営は三井不動産商業マネジメントが行っている。",
mapUrl: String = "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3239.919508821314!2d139.790403315258!3d35.89174898014363!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6018f3b0b0b0b0b1%3A0x1b0b0b0b0b0b0b0b!2z44CSMzUwLTAwMjQg5p2x5Lqs6YO95riv5Yy65Y2X6YCa5L2c5a2Q5bGx77yR5LiB55uu77yR77yR4oiS77yR!5e0!3m2!1sja!2sjp!4v1629788517009!5m2!1sja!2sjp",
imageUrl: String = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Laketown_outside.jpg/1200px-Laketown_outside.jpg",
) = NetworkPlace(
id = id,
name = name,
description = description,
mapUrl = mapUrl,
imageUrl = imageUrl,
)
internal fun createFakeNetworkPlace(
id: String = "bbe00d24-d840-460d-a127-f23f9e472cc6",
name: String = "レイクタウン",
description: String = "レイクタウンは、埼玉県越谷市にある複合商業施設である。2008年(平成20年)3月14日に開業した。運営は三井不動産商業マネジメントが行っている。",
mapUrl: String = "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3239.919508821314!2d139.790403315258!3d35.89174898014363!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6018f3b0b0b0b0b1%3A0x1b0b0b0b0b0b0b0b!2z44CSMzUwLTAwMjQg5p2x5Lqs6YO95riv5Yy65Y2X6YCa5L2c5a2Q5bGx77yR5LiB55uu77yR77yR4oiS77yR!5e0!3m2!1sja!2sjp!4v1629788517009!5m2!1sja!2sjp",
imageUrl: String = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Laketown_outside.jpg/1200px-Laketown_outside.jpg",
) = NetworkPlace(
id = id,
name = name,
description = description.replace("\\n", "\n"),
mapUrl = mapUrl,
imageUrl = imageUrl,
)

Comment on lines +65 to +66
venue = places.first { it.id == schedule.venueId },
meet = places.first { it.id == schedule.meetId },
Copy link

Choose a reason for hiding this comment

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

コードには、schedule.venueIdschedule.meetId に対応する場所が places リストに必ず含まれているという前提がありますが、これらの ID がリストにない場合に例外が発生する可能性があります。first メソッドは、条件に一致する要素がない場合に例外を投げるため、安全なアクセスを保証するためにエラーハンドリングを追加することをお勧めします。

val venue = places.firstOrNull { it.id == schedule.venueId } ?: throw SomeException("Venue not found")
val meet = places.firstOrNull { it.id == schedule.meetId } ?: throw SomeException("Meet not found")

Comment on lines +74 to +75
venue = places.first { it.id == schedule.venueId },
meet = places.first { it.id == schedule.meetId },
Copy link

Choose a reason for hiding this comment

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

firstメソッドの使用は、placesリストが大きい場合に非効率的になる可能性があります。firstは一致するものを見つけるまでリストを繰り返し処理するため、特にリストが大きい場合にはパフォーマンスに影響を与える可能性があります。associateByなどを使用して、IDをキーとするマップを事前に作成し、そのマップから直接参照することで効率を向上させることができます。

// 事前にIDをキーとするマップを作成
val placesById = places.associateBy { it.id }
// マップから直接参照
val venue = placesById[schedule.venueId]
val meet = placesById[schedule.meetId]

@tatsutakein tatsutakein merged commit 8338340 into main Dec 5, 2023
4 checks passed
@tatsutakein tatsutakein deleted the rt/add-fetch-participant-schedule-by-id-usecase branch December 5, 2023 11:56
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