package rooms import ( "context" "encoding/json" "fmt" "log" "github.com/redis/go-redis/v9" ) type Person struct { PersonId int64 Name string PasswordHash string } type Room struct { Name string // will be unique ID AdminIds []int64 PasswordHash string Paricipants []Person // TODO hands, for each type of hand? // i guess participants order fixed for now? // and i'll still need 'current' for each hand level } // well, it seems that i'd better do marshalling into bytes then // see https://github.com/redis/go-redis/issues/2512 func (r *Room) MarshalBinary() (data []byte, err error) { return json.Marshal(r) } func (r *Room) UnmarshalBinary(data []byte) error { return json.Unmarshal(data, r) } // let's check whether it will be possible to save nested structs var ctx = context.Background() type RoomManager interface { Get(roomName string) (Room, bool, error) Save(room Room) error } const roomRedisPrefix = "room" func roomNameToRedisId(roomName string) string { return fmt.Sprintf("%s:%s", roomRedisPrefix, roomName) } type RedisRM struct { Rdb *redis.Client } func (redisRM RedisRM) Get(roomName string) (Room, bool, error) { var readRoom Room err := redisRM.Rdb.Get(ctx, roomNameToRedisId(roomName)).Scan(&readRoom) if err == redis.Nil { return Room{}, false, nil } if err != nil { log.Printf("error reading room with id %s : %s", roomName, err) return Room{}, false, err } return readRoom, true, nil } func (redisRM RedisRM) Save(room Room) error { err := redisRM.Rdb.Set(ctx, roomNameToRedisId(room.Name), room, 0).Err() // maybe even set expiration? return err }