gormを使用したrepositoryの設計がわからない

クリーンアーキテクチャにおける中間テーブルの扱い方を理解したい.

キャンペーン作成後にクーポンを作成し、作成されたクーポンをキャンペーンに紐付ける(中間テーブルを使用する)方法がわかりません。
クリーンアーキテクチャにおいて、キャンペーンとクーポンの2つのdomainがあり、gormのmany2manyを使用し中間テーブルを使用して2つのIdを紐付けたい場合、できるだけ依存関係をなくすためにはどのような実装が考えられますか?具体的に、どのdomainやusecaseやrepositoryにどのような責務を持たせ、どの層にどのような依存関係を定義することで依存関係を最小限にすることができるかを教えていただけますか

パターン1

adapter/gateway/mysql/coupon.go

go

1func (c coupon) Save(ctx context.Context, coupon *domain.Coupon, campaignId string) (*domain.Coupon, error) {2 db := ctx.DB()3 // クーポンデータを保存する4 if err := db.Create(coupon).Error; err != nil {5 return nil, err 6 }7 //campaigIdとcouponIdを中間テーブルに保存する8 var campaign domain.Campaign 9 if err := db.Where("id = ?", campaignId).Preload("Coupons").Find(&campaign).Error; err != nil {10 return nil, err 11 }12 campaign.Coupons = append(campaign.Coupons, *coupon)13 if err := db.Save(&campaign).Error; err != nil {14 return nil, err 15 }16 return coupon, nil17}

今のコードだとcouponのrepoにvar campaign domain.Campaignが存在することはクリーンアーキテクチャにおいて避けたほうがいいのか悪いのかがわからない.

パターン2

adapter/gateway/mysql/coupon.go

go

1func (c coupon) Save(ctx context.Context, coupon *domain.Coupon, campaignId string) (*domain.Coupon, error) {2 db := ctx.DB()3 // クーポンデータを保存する4 if err := db.Create(coupon).Error; err != nil {5 return nil, err 6 }7 //campaign_couponsテーブルにクーポンIDとキャンペーンIDを保存する8 sql := "INSERT INTO campaign_coupons (campaign_id, coupon_id) VALUES (?, ?)"9 err := db.Exec(sql, campaignId, coupon.Id).Error 10 if err != nil {11 return nil, err 12 }13 return coupon, nil14}

sql文を使用しているのでgormの恩恵を受けれていないのでは??...

試したこと

  • sqlにしてvar campaign domain.Campaignをなくす
  • couponCamoaignのusecaseとrepositoryを作成

コメントを投稿

0 コメント