Enha: model update

This commit is contained in:
Grail Finder
2025-07-02 11:18:28 +03:00
parent 76bae3693a
commit b66f9c4c06
6 changed files with 153 additions and 60 deletions

View File

@ -20,42 +20,43 @@ func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error)
}
room := req.CreateRoom(creator)
room.RoomLink = cfg.BaseURL + "/room-join?id=" + room.ID
if err := saveRoom(room); err != nil {
if err := repo.CreateRoom(ctx, room); err != nil {
return nil, err
}
return room, nil
}
func saveRoom(room *models.Room) error {
key := models.CacheRoomPrefix + room.ID
data, err := json.Marshal(room)
if err != nil {
return err
}
memcache.Set(key, data)
// do I need last action here? since room save is kind of an action on itself
// time.Now().Add(time.Hour).Sub(room.LastActionTS)
anHour := int64(216000) // 60 * 60 * 60
memcache.Expire(key, anHour)
return nil
}
// // DEPRECATED
// func saveRoom(room *models.Room) error {
// key := models.CacheRoomPrefix + room.ID
// data, err := json.Marshal(room)
// if err != nil {
// return err
// }
// memcache.Set(key, data)
// // do I need last action here? since room save is kind of an action on itself
// // time.Now().Add(time.Hour).Sub(room.LastActionTS)
// anHour := int64(216000) // 60 * 60 * 60
// memcache.Expire(key, anHour)
// 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
}
// 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
// }
func removeRoom(roomID string) {
key := models.CacheRoomPrefix + roomID
memcache.RemoveKey(key)
}
// func removeRoom(roomID string) {
// key := models.CacheRoomPrefix + roomID
// memcache.RemoveKey(key)
// }
// context
@ -76,17 +77,17 @@ func getStateByCtx(ctx context.Context) (*models.UserState, error) {
// repo.CreateRoom()
// }
func saveFullInfo(fi *models.FullInfo) error {
// INFO: no transactions; so case is possible where first object is updated but the second is not
if err := saveState(fi.State.Username, fi.State); err != nil {
return err
}
log.Debug("saved user state", "state", fi.State)
if err := saveRoom(fi.Room); err != nil {
return err
}
return nil
}
// func saveFullInfo(fi *models.FullInfo) error {
// // INFO: no transactions; so case is possible where first object is updated but the second is not
// if err := saveState(fi.State.Username, fi.State); err != nil {
// return err
// }
// log.Debug("saved user state", "state", fi.State)
// if err := saveRoom(fi.Room); err != nil {
// return err
// }
// return nil
// }
func notifyBotIfNeeded(room *models.Room) {
if botName := room.WhichBotToMove(); botName != "" {

View File

@ -14,9 +14,9 @@ import (
)
var (
log *slog.Logger
cfg *config.Config
memcache cache.Cache
log *slog.Logger
cfg *config.Config
// memcache cache.Cache
Notifier *broker.Broker
repo repos.AllRepos
)
@ -26,7 +26,7 @@ func init() {
Level: slog.LevelDebug,
AddSource: true,
}))
memcache = cache.MemCache
// memcache = cache.MemCache
cfg = config.LoadConfigOrDefault("")
Notifier = broker.Notifier
cache.MemCache.StartBackupRoutine(15 * time.Second) // Reduced backup interval
@ -91,17 +91,25 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
creatorLeft = true
}
exitedRoom := fi.ExitRoom()
if err := saveRoom(exitedRoom); err != nil {
abortWithError(w, err.Error())
return
}
// if err := saveRoom(exitedRoom); err != nil {
// abortWithError(w, err.Error())
// return
// }
if creatorLeft {
removeRoom(exitedRoom.ID)
if err := repo.DeleteRoomByID(r.Context(), exitedRoom.ID); err != nil {
log.Error("failed to remove room", "error", err)
}
// removeRoom(exitedRoom.ID)
// TODO: notify users if creator left
// and throw them away
notify(models.NotifyRoomListUpdate, "")
}
if err := saveState(fi.State.Username, fi.State); err != nil {
// scary to update the whole room
if err := repo.UpdateRoom(r.Context(), exitedRoom); err != nil {
abortWithError(w, err.Error())
return
}
if err := repo.PlayerExitRoom(fi.State.Username); err != nil {
abortWithError(w, err.Error())
return
}