dev day #100 - WE ARE FUCKING DONE, hotfixes incoming but we did it in 100 days, lets fucking go guys, anyone reading this...i love you

This commit is contained in:
Tomas Dvorak
2025-11-22 21:30:10 +01:00
parent f5b6f83974
commit aa036b6550
47 changed files with 3607 additions and 2177 deletions
+54 -20
View File
@@ -13,7 +13,7 @@ import (
"fotbal-club/pkg/email"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/clause"
)
// SweepstakesService encapsulates business logic for sweepstakes
@@ -83,18 +83,30 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
}
// Determine number of winners
nWinners := 0
for _, p := range prizes { nWinners += max(0, p.Quantity) }
for _, p := range prizes {
nWinners += max(0, p.Quantity)
}
if nWinners == 0 {
if cur.TotalPrizes > 0 { nWinners = cur.TotalPrizes }
if cur.TotalPrizes > 0 {
nWinners = cur.TotalPrizes
}
}
// Cap winners to a safe maximum
if nWinners > 100 { nWinners = 100 }
if nWinners > len(entries) { nWinners = len(entries) }
if nWinners > 100 {
nWinners = 100
}
if nWinners > len(entries) {
nWinners = len(entries)
}
// Build seed
effSeed := strings.TrimSpace(seed)
if effSeed == "" { effSeed = strings.TrimSpace(cur.DrawSeed) }
if effSeed == "" { effSeed = fmt.Sprintf("%d-%d", cur.ID, time.Now().UnixNano()) }
if effSeed == "" {
effSeed = strings.TrimSpace(cur.DrawSeed)
}
if effSeed == "" {
effSeed = fmt.Sprintf("%d-%d", cur.ID, time.Now().UnixNano())
}
// Deterministic RNG from SHA-256
h := sha256.Sum256([]byte(effSeed))
base := binary.LittleEndian.Uint64(h[:8])
@@ -125,18 +137,27 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
for j := 0; j < q && pos < len(idx); j++ {
cand := entries[idx[pos]]
pos++
if picked[cand.UserID] { j--; continue }
if picked[cand.UserID] {
j--
continue
}
picked[cand.UserID] = true
assign(cand.UserID, cand.ID, &prizes[i])
if len(winners) >= nWinners { break }
if len(winners) >= nWinners {
break
}
}
if len(winners) >= nWinners {
break
}
if len(winners) >= nWinners { break }
}
// If still need more (when TotalPrizes used)
for len(winners) < nWinners && pos < len(idx) {
cand := entries[idx[pos]]
pos++
if picked[cand.UserID] { continue }
if picked[cand.UserID] {
continue
}
picked[cand.UserID] = true
assign(cand.UserID, cand.ID, nil)
}
@@ -151,9 +172,9 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
vis := cur.EndAt.Add(72 * time.Hour)
if err := tx.Model(&models.Sweepstake{}).Where("id = ?", cur.ID).Updates(map[string]interface{}{
"winners_selected_at": now,
"visibility_until": vis,
"draw_seed": effSeed,
"status": "finalized",
"visibility_until": vis,
"draw_seed": effSeed,
"status": "finalized",
}).Error; err != nil {
return err
}
@@ -163,15 +184,21 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
for _, w := range winners {
var user models.User
_ = tx.First(&user, w.UserID).Error
if strings.TrimSpace(user.Email) == "" { continue }
if strings.TrimSpace(user.Email) == "" {
continue
}
// Localize end date to Czech format in Europe/Prague timezone
loc, _ := time.LoadLocation("Europe/Prague")
endsLocal := cur.EndAt.In(loc)
endsAtCz := endsLocal.Format("02. 01. 2006 15:04")
_ = s.Email.SendEmail(&email.EmailData{
Subject: "Vyhráli jste v soutěži!",
To: []string{strings.TrimSpace(user.Email)},
Template: "sweepstake_winner_user",
Data: map[string]interface{}{
"Title": cur.Title,
"Title": cur.Title,
"PrizeName": w.PrizeName,
"EndsAt": cur.EndAt.Format(time.RFC1123),
"EndsAt": endsAtCz,
},
})
}
@@ -179,14 +206,16 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
var set models.Settings
_ = tx.First(&set).Error
adminTo := strings.TrimSpace(set.ContactEmail)
if adminTo == "" { adminTo = strings.TrimSpace(set.SMTPFrom) }
if adminTo == "" {
adminTo = strings.TrimSpace(set.SMTPFrom)
}
if adminTo != "" {
_ = s.Email.SendEmail(&email.EmailData{
Subject: "Soutěž vybraní výherci",
To: []string{adminTo},
Template: "sweepstake_winner_admin",
Data: map[string]interface{}{
"Title": cur.Title,
"Title": cur.Title,
"WinnersCount": len(winners),
},
})
@@ -196,4 +225,9 @@ func (s *SweepstakesService) FinalizeSweepstake(sw *models.Sweepstake, seed stri
})
}
func max(a, b int) int { if a > b { return a } ; return b }
func max(a, b int) int {
if a > b {
return a
}
return b
}