Slide 27
Slide 27 text
confidential
©Showcase Gig
27
ユースケース層: CreateOrder
ユースケース層の実装
● Entity / VOを生成して
● 永続化する
それだけを行う。
「この場合注文できていいんだっ
け?」というロジックはすべてドメ
インモデルの中に含まれているの
で、Usecase層は何もしなくてよ
い。
// Create 注文を受け付ける
func (o *CreateUseCase
) Create(ctx context.Context, input CreateInput
) (orderId
types.OrderID, err error) {
// DBトランザクション内で処理する
err = o.dbClients.WritableClient.
RunInWriteTx
(略) (err error) {
// ~~~~ 略 ~~~~
// 取得した商品情報から注文商品情報を組み立てる
orderItems
, err := vo.NewOrderItems
(orderRequestItems
, items)
if err != nil {
// 注文商品情報が不正
return
}
// 注文ステータス作成
initialState
, err := vo.NewOrderState
(input.InitialOrderState)
if err != nil {
// 注文ステータスが不正
return
}
// 店舗情報取得
restaurant
, err := o.masterRepository.
GetRestaurant
(ctx, queryable,
types.RestaurantID
(input.RestaurantId))
if err != nil {
// 店舗が不正
return
}
// 注文エンティティ生成
orderId = types.OrderID(numberingService.
Generate())
orderEntity
, err := entity.NewOrder(
orderId
,
restaurant
,
orderItems
,
orderedAt,
initialState
,
)
if err != nil {
// 注文作成に失敗
return
}
// 注文を永続化
err = o.orderRepository.
Persist(ctx, queryable, orderEntity)
if err != nil {
// ~~~~ 略 ~~~~
}
return
})
return orderId, nil
}