Cart / CartItem — カート
これは何か
サークルが「申し込もうとしているが、まだ確定はしていない」商品を一時的に保管する場所です。
ネットショッピングのカートと同じ概念です。商品をカートに入れただけでは申し込みは確定しません。チェックアウト(送信)して初めて正式な申し込みになります。
チェックアウト後はカートの内容が削除され、代わりに Order(注文)が生まれます。
Cart はカートそのもの(1サークルに1つ存在)、CartItem はカートの中の各商品行です。
誰が使うか
- サークル:商品をカートに入れ、内容を確認して、チェックアウトする
- 運営スタッフ:進捗確認のために閲覧できるが、代わりに変更はしない
できなければならないこと
- サークルが申し込み受付期間中にカートへ商品を追加できる
- サークルがカート内の数量を変更できる(チェックアウト前)
- サークルがカートから商品を削除できる(チェックアウト前)
- サークルがカートの中身を確認できる
- サークルがチェックアウトを実行できる(数量ルールを満たしている場合)
できてはいけないこと
- 同じ商品を重複してカートに追加すること。同じ商品を追加しようとした場合は数量を増やす操作に置き換える。
- 数量を0以下にすること。数量を減らしたい最小値は1。0にしたい場合は削除操作を使う。
- 1サークルあたりの上限(maxPerProject)を超える数量を入力すること。
- 申し込み受付期間外に新しい商品を追加しようとすること。
- 他のサークルのカートを見たり変更したりすること。
- チェックアウト済みのカートを操作しようとすること。チェックアウト後にカートは存在しない。
- 運営スタッフがサークルのカートを代理で変更すること。運営が特定の商品を強制的に割り当てたい場合は、カートではなく注文に直接追加する(OrderItemの強制割り当て)。
チェックアウト時の確認事項
チェックアウトのボタンを押した際、以下をすべてサーバー側で確認する。1つでも満たさない場合はチェックアウトを拒否してサークルにエラーを返す。
- 申し込み受付期間内であること
- カート内のすべての商品の数量が、下限以上・上限以下であること
- チェックアウトしたことでイベント全体の上限(maxTotal)を超えないこと
3番目のチェックは、複数のサークルが同時にチェックアウトしようとすると競合が起きる可能性がある。この競合を防ぐためにサーバー側で排他的に処理する。