refactor(esi_sso.go): parallelize esi token processing and deduplicate tokens to improve performance

This commit is contained in:
2025-08-09 20:11:34 +02:00
parent e1e961ebea
commit a584bc9c55

View File

@@ -618,22 +618,40 @@ func (s *ESISSO) PostRouteForAll(destID int64, viaIDs []int64) error {
if s.db == nil { return errors.New("db not initialised") }
var tokens []ESIToken
if err := s.db.Find(&tokens).Error; err != nil { return err }
var firstErr error
for i := range tokens {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
tok, err := s.ensureAccessTokenFor(ctx, &tokens[i])
cancel()
if err != nil { if firstErr == nil { firstErr = err }; continue }
// Determine sequence: clear with first element (via if any, else dest)
if len(viaIDs) > 0 {
if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil && firstErr == nil { firstErr = err }
for _, id := range viaIDs[1:] {
if err := s.postWaypointWithToken(tok, id, false, false); err != nil && firstErr == nil { firstErr = err }
}
if err := s.postWaypointWithToken(tok, destID, false, false); err != nil && firstErr == nil { firstErr = err }
} else {
if err := s.postWaypointWithToken(tok, destID, true, false); err != nil && firstErr == nil { firstErr = err }
}
// Deduplicate by CharacterID
uniq := make(map[int64]ESIToken, len(tokens))
for _, t := range tokens {
uniq[t.CharacterID] = t
}
uniqueTokens := make([]ESIToken, 0, len(uniq))
for _, t := range uniq { uniqueTokens = append(uniqueTokens, t) }
var mu sync.Mutex
var firstErr error
var wg sync.WaitGroup
// Run per-character in parallel
for i := range uniqueTokens {
wg.Add(1)
go func(t ESIToken) {
defer wg.Done()
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
tok, err := s.ensureAccessTokenFor(ctx, &t)
cancel()
if err != nil {
mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return
}
// Post sequence for this character
if len(viaIDs) > 0 {
if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
for _, id := range viaIDs[1:] {
if err := s.postWaypointWithToken(tok, id, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
}
if err := s.postWaypointWithToken(tok, destID, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
} else {
if err := s.postWaypointWithToken(tok, destID, true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
}
}(uniqueTokens[i])
}
wg.Wait()
return firstErr
}