crypto_alert_bot/internal/service/alerter/cache.go
2026-02-25 23:52:21 +03:00

71 lines
1.5 KiB
Go

package alerter
import (
"sync"
"gitea.computernetthings.ru/yash/crypto_alert_bot/internal/entities"
)
type alertsCache struct {
mu sync.RWMutex
byID map[entities.AlertID]*entities.Alert
byInstrument map[entities.InstrumentID]map[entities.AlertID]*entities.Alert
}
func newCache() *alertsCache {
return &alertsCache{
byID: make(map[entities.AlertID]*entities.Alert),
byInstrument: make(map[entities.InstrumentID]map[entities.AlertID]*entities.Alert),
}
}
func (c *alertsCache) Add(a *entities.Alert) {
c.mu.Lock()
defer c.mu.Unlock()
c.byID[a.ID] = a
if _, ok := c.byInstrument[a.Instrument.ID]; !ok {
c.byInstrument[a.Instrument.ID] = make(map[entities.AlertID]*entities.Alert)
}
c.byInstrument[a.Instrument.ID][a.ID] = a
}
func (c *alertsCache) Remove(id entities.AlertID) {
c.mu.Lock()
defer c.mu.Unlock()
a, ok := c.byID[id]
if !ok {
return
}
delete(c.byID, id)
delete(c.byInstrument[a.Instrument.ID], id)
}
func (c *alertsCache) AlertsByInstrument(id entities.InstrumentID) []*entities.Alert {
c.mu.RLock()
defer c.mu.RUnlock()
alerts := c.byInstrument[id]
result := make([]*entities.Alert, 0, len(alerts))
for _, a := range alerts {
result = append(result, a)
}
return result
}
func (c *alertsCache) Instruments() []entities.Instrument {
c.mu.RLock()
defer c.mu.RUnlock()
instruments := make([]entities.Instrument, 0, len(c.byInstrument))
for _, alerts := range c.byInstrument {
for _, a := range alerts {
instruments = append(instruments, a.Instrument)
break
}
}
return instruments
}