/
campaign.go
115 lines (96 loc) · 2.97 KB
/
campaign.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package biz
import (
"context"
"github.com/ChungKiet/cake-interview/api/server"
"github.com/ChungKiet/cake-interview/internal/constant"
"github.com/go-kratos/kratos/v2/log"
"time"
)
type CampaignUseCase struct {
voucherRepo VoucherRepo
voucherCampaignRepo VoucherCampaignRepo
campaignRepo CampaignRepo
log *log.Helper
}
func NewCampaignUseCase(voucherRepo VoucherRepo, voucherCampaignRepo VoucherCampaignRepo, campaignRepo CampaignRepo) *CampaignUseCase {
return &CampaignUseCase{
voucherRepo: voucherRepo,
voucherCampaignRepo: voucherCampaignRepo,
campaignRepo: campaignRepo,
log: log.NewHelper(log.DefaultLogger),
}
}
func (uc *CampaignUseCase) CreateCampaign(ctx context.Context, req *server.CreateCampaignRequest) (int64, error) {
if req.Name == constant.EMPTY_STRING {
return -1, constant.ErrVoucherCampaignNameInvalid
}
now := time.Now().UTC()
nowUnix := now.Unix()
if req.StartDay < nowUnix {
return -1, constant.ErrVoucherCampaignStartDayInvalid
}
if req.EndDay < now.Unix() {
return -1, constant.ErrVoucherCampaignEndDayInvalid
}
if req.EndDay <= req.StartDay {
return -1, constant.ErrVoucherCampaignLiveTimeInvalid
}
if req.TotalSlot <= constant.ZERO_LENGTH {
return -1, constant.ErrVoucherCampaignTotalSlotInvalid
}
if len(req.Vouchers) == constant.ZERO_LENGTH {
return -1, constant.ErrCampaignMustHavVouchers
}
var campaignId int64
errTx := uc.voucherCampaignRepo.WithTx(ctx, func(ctx context.Context) error {
reqVoucherIds := mappingVoucherRequestDataToVoucherIDs(req.Vouchers)
vouchers, err := uc.voucherRepo.GetVoucherByIDs(ctx, reqVoucherIds)
if err != nil {
return err
}
if len(vouchers) < len(req.Vouchers) {
var voucherIds []int
for _, item := range vouchers {
voucherIds = append(voucherIds, item.ID)
}
uc.log.Error("[CreateCampaign] GetVoucherByIDs failed", "request_ids", reqVoucherIds, "result_voucher_id", voucherIds)
return constant.ErrVoucherNotFound
}
// create campaign
campaignId, err = uc.campaignRepo.CreateCampaign(ctx, &CreateCampaignRequest{
Name: req.Name,
StartDay: req.StartDay,
EndDay: req.EndDay,
TotalSlot: req.TotalSlot,
})
if err != nil {
return err
}
// assume that voucher valid time is campaign valid time
for _, item := range vouchers {
err = uc.voucherCampaignRepo.CreateVoucherCampaign(ctx, &CreateVoucherCampaignRequest{
CampaignID: campaignId,
VoucherID: int64(item.ID),
StartDay: req.StartDay,
ValidTo: req.EndDay,
})
if err != nil {
return err
}
}
return nil
// create voucher campagin
})
if errTx != nil {
uc.log.Error("[CreateCampaign] Create campaign failed", "err", errTx.Error())
return -1, errTx
}
return campaignId, nil
}
func mappingVoucherRequestDataToVoucherIDs(vouchers []*server.CreateCampaignRequest_Data) []int {
var res []int
for _, item := range vouchers {
res = append(res, int(item.VoucherId))
}
return res
}