package service import ( "context" "fmt" "github.com/AFASystems/presence/internal/pkg/common/appcontext" "github.com/AFASystems/presence/internal/pkg/model" "github.com/redis/go-redis/v9" ) type RedisHashable interface { RedisHashable() (map[string]any, error) model.BeaconEvent | model.HTTPLocation } func persistBeaconValkey[T RedisHashable](id string, msg T, client *redis.Client, ctx context.Context) error { key := fmt.Sprintf("beacon:%s", id) hashM, err := msg.RedisHashable() if err != nil { fmt.Println("Error in converting location into hashmap for Redis insert: ", err) return err } if err := client.HSet(ctx, key, hashM).Err(); err != nil { fmt.Println("Error in persisting set in Redis key: ", key) return err } if err := client.SAdd(ctx, "beacons", key).Err(); err != nil { fmt.Println("Error in adding beacon to the beacons list for get all operation: ", err) return err } return nil } func LocationToBeaconService(msg model.HTTPLocation, appState *appcontext.AppState, client *redis.Client, ctx context.Context) error { id := msg.ID beacon, ok := appState.GetBeacon(id) if !ok { appState.UpdateBeacon(id, model.Beacon{ID: id, Location: msg.Location, Distance: msg.Distance, LastSeen: msg.LastSeen, PreviousConfidentLocation: msg.PreviousConfidentLocation}) } else { beacon.ID = id beacon.Location = msg.Location beacon.Distance = msg.Distance beacon.LastSeen = msg.LastSeen beacon.PreviousConfidentLocation = msg.PreviousConfidentLocation appState.UpdateBeacon(id, beacon) } if err := persistBeaconValkey(id, msg, client, ctx); err != nil { return err } return nil } func EventToBeaconService(msg model.BeaconEvent, appState *appcontext.AppState, client *redis.Client, ctx context.Context) error { id := msg.ID beacon, ok := appState.GetBeacon(id) if !ok { appState.UpdateBeacon(id, model.Beacon{ID: id, BeaconType: msg.Type, HSBattery: int64(msg.Battery), Event: msg.Event}) } else { beacon.ID = id beacon.BeaconType = msg.Type beacon.HSBattery = int64(msg.Battery) beacon.Event = msg.Event appState.UpdateBeacon(id, beacon) } if err := persistBeaconValkey(id, msg, client, ctx); err != nil { return err } return nil }