62 lines
2.1 KiB
Go
62 lines
2.1 KiB
Go
package welfare_activity
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"bindbox-game/internal/pkg/logger"
|
|
"bindbox-game/internal/repository/mysql"
|
|
usersvc "bindbox-game/internal/service/user"
|
|
)
|
|
|
|
const (
|
|
TypeDaily = "daily"
|
|
TypeWeekly = "weekly"
|
|
TypeMonthly = "monthly"
|
|
|
|
StatusActive = "active"
|
|
StatusFinished = "finished"
|
|
)
|
|
|
|
type Service interface {
|
|
CreateActivity(ctx context.Context, req SaveActivityRequest) (*Activity, error)
|
|
UpdateActivity(ctx context.Context, id int64, req SaveActivityRequest) error
|
|
CopyActivity(ctx context.Context, id int64, req SaveActivityRequest) (int64, error)
|
|
ListActivities(ctx context.Context, req ListActivitiesRequest) (*ListActivitiesResponse, error)
|
|
GetActivity(ctx context.Context, id int64, userID int64) (*ActivityDetail, error)
|
|
GetActivityAdmin(ctx context.Context, id int64) (*ActivityDetail, error)
|
|
DeleteActivity(ctx context.Context, id int64) error
|
|
SavePrizes(ctx context.Context, activityID int64, prizes []PrizeInput) error
|
|
ListParticipants(ctx context.Context, activityID int64, page int, pageSize int) (*ParticipantResponse, error)
|
|
Join(ctx context.Context, activityID int64, userID int64) error
|
|
ListWinners(ctx context.Context, activityID int64, page int, pageSize int) (*WinnerListResponse, error)
|
|
ListJoinableActivitiesForUser(ctx context.Context, userID int64) ([]JoinableActivityItem, error)
|
|
Draw(ctx context.Context, activityID int64) error
|
|
DrawDueActivities(ctx context.Context) error
|
|
GetCost(ctx context.Context, activityID int64) (*CostSummary, error)
|
|
GetCostSummary(ctx context.Context, startTime *time.Time, endTime *time.Time) (*CostSummary, error)
|
|
}
|
|
|
|
type service struct {
|
|
logger logger.CustomLogger
|
|
repo mysql.Repo
|
|
userSvc usersvc.Service
|
|
}
|
|
|
|
func New(log logger.CustomLogger, repo mysql.Repo) Service {
|
|
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
|
|
}
|