fix(activity): 限制未开始福利活动曝光与参与
未开始的福利活动不再返回给前端活动列表,并统一后端参与时间校验,避免用户在开始前查看或参与活动。
This commit is contained in:
parent
cb5061f1da
commit
b3fcec569a
@ -123,12 +123,16 @@ func (s *service) ListActivities(ctx context.Context, req ListActivitiesRequest)
|
|||||||
if req.PageSize > 100 {
|
if req.PageSize > 100 {
|
||||||
req.PageSize = 100
|
req.PageSize = 100
|
||||||
}
|
}
|
||||||
|
now := time.Now()
|
||||||
db := s.repo.GetDbR().WithContext(ctx).Model(&Activity{}).Where("deleted_at IS NULL")
|
db := s.repo.GetDbR().WithContext(ctx).Model(&Activity{}).Where("deleted_at IS NULL")
|
||||||
if req.Type != "" {
|
if req.Type != "" {
|
||||||
db = db.Where("type = ?", req.Type)
|
db = db.Where("type = ?", req.Type)
|
||||||
}
|
}
|
||||||
if req.Status != "" {
|
if req.Status != "" {
|
||||||
db = db.Where("status = ?", req.Status)
|
db = db.Where("status = ?", req.Status)
|
||||||
|
if req.Status == StatusActive {
|
||||||
|
db = db.Where("start_time <= ? AND end_time >= ? AND draw_time >= ?", now, now, now)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if strings.TrimSpace(req.Title) != "" {
|
if strings.TrimSpace(req.Title) != "" {
|
||||||
db = db.Where("title LIKE ?", "%"+strings.TrimSpace(req.Title)+"%")
|
db = db.Where("title LIKE ?", "%"+strings.TrimSpace(req.Title)+"%")
|
||||||
@ -157,6 +161,9 @@ func (s *service) GetActivity(ctx context.Context, id int64, userID int64) (*Act
|
|||||||
if err := s.repo.GetDbR().WithContext(ctx).Where("id = ? AND deleted_at IS NULL", id).First(&item).Error; err != nil {
|
if err := s.repo.GetDbR().WithContext(ctx).Where("id = ? AND deleted_at IS NULL", id).First(&item).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if userID <= 0 && item.Status == StatusActive && time.Now().Before(item.StartTime) {
|
||||||
|
return nil, errors.New("活动未开始")
|
||||||
|
}
|
||||||
detail := &ActivityDetail{Activity: item}
|
detail := &ActivityDetail{Activity: item}
|
||||||
s.repo.GetDbR().WithContext(ctx).Where("activity_id = ?", id).Order("sort ASC, id ASC").Find(&detail.Prizes)
|
s.repo.GetDbR().WithContext(ctx).Where("activity_id = ?", id).Order("sort ASC, id ASC").Find(&detail.Prizes)
|
||||||
s.fillPrizeMeta(ctx, detail.Prizes)
|
s.fillPrizeMeta(ctx, detail.Prizes)
|
||||||
@ -172,7 +179,7 @@ func (s *service) GetActivity(ctx context.Context, id int64, userID int64) (*Act
|
|||||||
if userID > 0 {
|
if userID > 0 {
|
||||||
start, end, period := periodRange(item.Type, time.Now())
|
start, end, period := periodRange(item.Type, time.Now())
|
||||||
detail.CurrentPaid, _ = s.sumPaidAmount(ctx, userID, start, end)
|
detail.CurrentPaid, _ = s.sumPaidAmount(ctx, userID, start, end)
|
||||||
detail.CanJoin = detail.CurrentPaid >= item.ThresholdAmount && item.Status == StatusActive && time.Now().Before(item.DrawTime) && time.Now().Before(item.EndTime)
|
detail.CanJoin = isJoinWindowOpen(item, time.Now()) && detail.CurrentPaid >= item.ThresholdAmount
|
||||||
var count int64
|
var count int64
|
||||||
s.repo.GetDbR().WithContext(ctx).Model(&Participant{}).Where("activity_id = ? AND user_id = ? AND period_key = ?", id, userID, period).Count(&count)
|
s.repo.GetDbR().WithContext(ctx).Model(&Participant{}).Where("activity_id = ? AND user_id = ? AND period_key = ?", id, userID, period).Count(&count)
|
||||||
detail.Joined = count > 0
|
detail.Joined = count > 0
|
||||||
|
|||||||
@ -16,10 +16,10 @@ func (s *service) Join(ctx context.Context, activityID int64, userID int64) erro
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
if activity.Status != StatusActive {
|
if !isJoinWindowOpen(activity, now) {
|
||||||
return errors.New("活动未开放参与")
|
if now.Before(activity.StartTime) {
|
||||||
}
|
return errors.New("活动未开始")
|
||||||
if now.Before(activity.StartTime) || now.After(activity.EndTime) || now.After(activity.DrawTime) {
|
}
|
||||||
return errors.New("当前不在活动参与时间内")
|
return errors.New("当前不在活动参与时间内")
|
||||||
}
|
}
|
||||||
start, end, period := periodRange(activity.Type, now)
|
start, end, period := periodRange(activity.Type, now)
|
||||||
|
|||||||
@ -45,3 +45,16 @@ type service struct {
|
|||||||
func New(log logger.CustomLogger, repo mysql.Repo) Service {
|
func New(log logger.CustomLogger, repo mysql.Repo) Service {
|
||||||
return &service{logger: log, repo: repo, userSvc: usersvc.New(log, repo)}
|
return &service{logger: log, repo: repo, userSvc: usersvc.New(log, repo)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isJoinWindowOpen(activity Activity, now time.Time) bool {
|
||||||
|
if activity.Status != StatusActive {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if now.Before(activity.StartTime) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if now.After(activity.EndTime) || now.After(activity.DrawTime) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user