123 lines
2.6 KiB
Go
123 lines
2.6 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"golias/models"
|
|
)
|
|
|
|
func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error) {
|
|
creator, ok := ctx.Value(models.CtxUsernameKey).(string)
|
|
if !ok {
|
|
err := errors.New("failed to extract user from ctx")
|
|
return nil, err
|
|
}
|
|
room := req.CreateRoom(creator)
|
|
if err := saveRoom(room); err != nil {
|
|
return nil, err
|
|
}
|
|
return room, nil
|
|
}
|
|
|
|
func saveRoom(room *models.Room) error {
|
|
data, err := json.Marshal(room)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
memcache.Set(models.CacheRoomPrefix+room.ID, data)
|
|
return nil
|
|
}
|
|
|
|
func getRoomByID(roomID string) (*models.Room, error) {
|
|
roomBytes, err := memcache.Get(models.CacheRoomPrefix + roomID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp := &models.Room{}
|
|
if err := json.Unmarshal(roomBytes, &resp); err != nil {
|
|
return nil, err
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
// context
|
|
func getRoomIDFromCtx(ctx context.Context) string {
|
|
id, _ := ctx.Value(models.CtxRoomIDKey).(string)
|
|
return id
|
|
}
|
|
|
|
func getStateByCtx(ctx context.Context) (*models.UserState, error) {
|
|
username, ok := ctx.Value(models.CtxUsernameKey).(string)
|
|
if !ok {
|
|
log.Debug("no username in ctx")
|
|
return &models.UserState{}, errors.New("no username in ctx")
|
|
}
|
|
us, err := loadState(username)
|
|
if err != nil {
|
|
return &models.UserState{}, err
|
|
}
|
|
return us, nil
|
|
}
|
|
|
|
// cache
|
|
|
|
func saveState(username string, state *models.UserState) error {
|
|
key := models.CacheStatePrefix + username
|
|
data, err := json.Marshal(state)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
memcache.Set(key, data)
|
|
return nil
|
|
}
|
|
|
|
func loadState(username string) (*models.UserState, error) {
|
|
key := models.CacheStatePrefix + username
|
|
data, err := memcache.Get(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp := &models.UserState{}
|
|
if err := json.Unmarshal(data, &resp); err != nil {
|
|
return nil, err
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func getAllNames() []string {
|
|
names := []string{}
|
|
// will not scale
|
|
wholeMemStore := memcache.GetAll()
|
|
session := &models.Session{}
|
|
// filter by key size only sessions
|
|
for k, v := range wholeMemStore {
|
|
// xid is 20 in len
|
|
if len(k) != 20 {
|
|
continue
|
|
}
|
|
if err := json.Unmarshal(v, &session); err != nil {
|
|
log.Error("failed to unmarshal", "error", err)
|
|
continue
|
|
}
|
|
names = append(names, session.Username)
|
|
}
|
|
return names
|
|
}
|
|
|
|
func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) {
|
|
state, err := getStateByCtx(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
room, err := getRoomByID(state.RoomID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp := &models.FullInfo{
|
|
State: state,
|
|
Room: room,
|
|
}
|
|
return resp, nil
|
|
}
|