alert service
This commit is contained in:
parent
0e73841b3e
commit
608561ab38
8 changed files with 283 additions and 8 deletions
71
internal/service/alerter/cache.go
Normal file
71
internal/service/alerter/cache.go
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue