package threshold_activity import ( "context" "time" "bindbox-game/internal/pkg/logger" "bindbox-game/internal/repository/mysql" usersvc "bindbox-game/internal/service/user" ) 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 }