71 lines
1.5 KiB
Go
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
|
|
}
|