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

[Consumer]削除済みのカタログアイテムを参照した場合に適切にハンドリングする #1780

Open
2 tasks
KentaHizume opened this issue Sep 25, 2024 · 4 comments
Assignees
Labels
target: Dressca サンプルアプリケーションDresscaに関係がある
Milestone

Comments

@KentaHizume
Copy link
Contributor

KentaHizume commented Sep 25, 2024

概要

Dressca-Adminは、カタログアイテムのマスタ情報(CatalogItemsテーブル)に対するCRUD機能を持つ。
下記のようなシナリオにおいて、Consumerから削除済みのカタログアイテムを参照した場合の挙動を定め、
適切なハンドリングを実装する必要がある。

詳細 / 機能詳細(オプション)

下記のコメントで検討していた内容をissue化。
#1453 (comment)

たとえば、現在は下記のようなシナリオを実行した場合、
注文を行った際にハンドリングしていない例外が発生して500エラーが返され、
買い物かご内に削除済みの商品が残ったままになってしまい、
ユーザー側で解決不可能な状態が発生してしまう。

  1. (Consumer)買い物かごにアイテム(ID=1)を入れる
  2. (Admin)アイテム(ID=1)を削除
  3. (Consumer)注文を行う

対象ユースケース

CatalogItemsテーブルを参照するユースケースは下記の6つ。
下記の6つのケースについて、バックエンドとフロントエンドであるべき挙動を定め、実装する必要がある。

ユースケース バック フロント
カタログ情報取得
買い物かご情報取得
買い物かごにアイテムを追加
買い物かごからアイテムを削除
買い物かご内のアイテムの数量を更新
注文

完了条件

  • 上述の対象ユースケースについて、それぞれあるべき挙動が定められていること
  • あるべき挙動が実装されていること
@KentaHizume KentaHizume added target: Dressca サンプルアプリケーションDresscaに関係がある サンプルAP labels Sep 25, 2024
@KentaHizume KentaHizume added this to the v1.0 milestone Sep 25, 2024
@KentaHizume KentaHizume self-assigned this Sep 25, 2024
@KentaHizume
Copy link
Contributor Author

KentaHizume commented Sep 25, 2024

現在の挙動調査

ユースケース バック フロント メモ 対応要否
カタログ情報取得 削除済みのものは取得しない 何もしない 特に問題なし。ただし論理削除フラグを立てる場合、フラグを見るように改修が必要 左記の通り
買い物かご情報取得 削除済みのものは情報が取得できない 不正な表示になる エラーは出ないが、問題のある状態、画像参照 買い物かごに削除済みのアイテムが入っている状態が継続するのがまずい 対応要
買い物かごにアイテムを追加 CatalogItemNotExistingInRepositoryException 400エラー 追加失敗のToast表示、画面遷移なし 削除済みのものは追加できないべきで妥当 対応不要
買い物かごからアイテムを削除 CatalogItemNotExistingInRepositoryException 400エラー 削除失敗のToast表示、画面遷移なし 買い物かごに削除済みのアイテムが入っている状態が継続するのがまずい 対応要
買い物かご内のアイテムの数量を更新 CatalogItemNotExistingInRepositoryException 400エラー 数量変更失敗のToast表示、画面遷移なし 買い物かごに削除済みのアイテムが入っている状態が継続するのがまずい 対応要
注文 未ハンドリング例外、500エラー エラーページ遷移 対応要

買い物かご情報取得

  • 削除済みのアイテムがかごに入っていると、アイテムの情報が取れずにアイテム名や画像が不正な状態になる
    image

@KentaHizume
Copy link
Contributor Author

KentaHizume commented Sep 25, 2024

【解決】
直接関係ないが、買い物かごへのアイテム追加メソッドについて、actionNameが誤っている?
⇒作成されたリソースのlocationを入れるべきなので、Getで正しい
https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-8.0&preserve-view=true&tabs=visual-studio#update-the-posttodoitem-create-method

GetTodoItem アクションを参照して Location ヘッダーの URI を作成します。 C# の nameof キーワードを使って、CreatedAtAction 呼び出しでアクション名をハードコーディングすることを回避しています。

        var actionName = ActionNameHelper.GetAsyncActionName(nameof(this.GetBasketItemsAsync));
    public async Task<IActionResult> PostBasketItemAsync(PostBasketItemsRequest postBasketItem)
    {
        postBasketItem.CatalogItemId.ThrowIfNull();
        postBasketItem.AddedQuantity.ThrowIfNull();

        var buyerId = this.HttpContext.GetBuyerId();

        await this.service.AddItemToBasketAsync(buyerId, postBasketItem.CatalogItemId.Value, postBasketItem.AddedQuantity.Value);

        var actionName = ActionNameHelper.GetAsyncActionName(nameof(this.GetBasketItemsAsync));
        return this.CreatedAtAction(actionName, null);
    }

@KentaHizume
Copy link
Contributor Author

数量が0のカタログアイテムを買い物かごから削除するメソッド
basket.RemoveEmptyItems();
が存在するので、
削除済みのカタログアイテムが指定されたら、
そのアイテムの数量を0に変更するということも考えられる。

削除済みアイテムが複数かごに入っているパターンでは、
1つ1つCatalogItemIdを指定して削除するよりもこのほうがベター?

SetBasketItemsQuantitiesAsyncとAddItemToBasketAsyncで使われている

basket.AddItem(catalogItemId, catalogItem.Price, addedQuantity);
basket.RemoveEmptyItems();
await this.basketRepository.UpdateAsync(basket, cancellationToken);
scope.Complete();

@KentaHizume
Copy link
Contributor Author

GetBasketItemsAsyncをGETでAPIコールしたときに、
中で削除済みのアイテムをBasketItemsをDELETEするとGETから副作用が出てしまうが、これが許容されるのか不明。

@KentaHizume KentaHizume modified the milestones: v1.0.0, v1.1.0 Nov 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
target: Dressca サンプルアプリケーションDresscaに関係がある
Projects
None yet
Development

No branches or pull requests

2 participants