Fix: save action on give-clue
This commit is contained in:
		| @@ -24,6 +24,7 @@ func (cm *CronManager) Start() { | |||||||
| 	go func() { | 	go func() { | ||||||
| 		for range ticker.C { | 		for range ticker.C { | ||||||
| 			cm.CleanupRooms() | 			cm.CleanupRooms() | ||||||
|  | 			cm.CleanupActions() | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| } | } | ||||||
| @@ -99,3 +100,31 @@ func (cm *CronManager) CleanupRooms() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (cm *CronManager) CleanupActions() { | ||||||
|  | 	ctx, tx, err := cm.repo.InitTx(context.Background()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		cm.log.Error("failed to init transaction for actions cleanup", "err", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer func() { | ||||||
|  | 		if r := recover(); r != nil { | ||||||
|  | 			if err := tx.Rollback(); err != nil { | ||||||
|  | 				cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) | ||||||
|  | 			} | ||||||
|  | 			panic(r) | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	if err := cm.repo.ActionsDeleteOrphaned(ctx); err != nil { | ||||||
|  | 		cm.log.Error("failed to delete orphaned actions", "err", err) | ||||||
|  | 		if err := tx.Rollback(); err != nil { | ||||||
|  | 			cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := tx.Commit(); err != nil { | ||||||
|  | 		cm.log.Error("failed to commit transaction for actions cleanup", "err", err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -329,6 +329,7 @@ func HandleGiveClue(w http.ResponseWriter, r *http.Request) { | |||||||
| 	} | 	} | ||||||
| 	// === | 	// === | ||||||
| 	action := models.Action{ | 	action := models.Action{ | ||||||
|  | 		RoomID:     fi.Room.ID, | ||||||
| 		Actor:      fi.State.Username, | 		Actor:      fi.State.Username, | ||||||
| 		ActorColor: string(fi.State.Team), | 		ActorColor: string(fi.State.Team), | ||||||
| 		WordColor:  string(fi.State.Team), | 		WordColor:  string(fi.State.Team), | ||||||
| @@ -337,6 +338,10 @@ func HandleGiveClue(w http.ResponseWriter, r *http.Request) { | |||||||
| 		Number:     num, | 		Number:     num, | ||||||
| 	} | 	} | ||||||
| 	fi.Room.ActionHistory = append(fi.Room.ActionHistory, action) | 	fi.Room.ActionHistory = append(fi.Room.ActionHistory, action) | ||||||
|  | 	if err := repo.CreateAction(r.Context(), &action); err != nil { | ||||||
|  | 		abortWithError(w, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
| 	fi.Room.MimeDone = true | 	fi.Room.MimeDone = true | ||||||
| 	fi.Room.ThisTurnLimit = uint8(guessLimitU64) + 1 | 	fi.Room.ThisTurnLimit = uint8(guessLimitU64) + 1 | ||||||
| 	if guessLimitU64 == 0 { | 	if guessLimitU64 == 0 { | ||||||
|   | |||||||
| @@ -9,9 +9,10 @@ import ( | |||||||
|  |  | ||||||
| type ActionsRepo interface { | type ActionsRepo interface { | ||||||
| 	ListActions(ctx context.Context, roomID string) ([]models.Action, error) | 	ListActions(ctx context.Context, roomID string) ([]models.Action, error) | ||||||
| 	CreateAction(ctx context.Context, roomID string, action *models.Action) error | 	CreateAction(ctx context.Context, action *models.Action) error | ||||||
| 	GetLastClue(ctx context.Context, roomID string) (*models.Action, error) | 	GetLastClue(ctx context.Context, roomID string) (*models.Action, error) | ||||||
| 	DeleteActionsByRoomID(ctx context.Context, roomID string) error | 	DeleteActionsByRoomID(ctx context.Context, roomID string) error | ||||||
|  | 	ActionsDeleteOrphaned(ctx context.Context) error | ||||||
| } | } | ||||||
|  |  | ||||||
| func (p *RepoProvider) ListActions(ctx context.Context, roomID string) ([]models.Action, error) { | func (p *RepoProvider) ListActions(ctx context.Context, roomID string) ([]models.Action, error) { | ||||||
| @@ -23,9 +24,9 @@ func (p *RepoProvider) ListActions(ctx context.Context, roomID string) ([]models | |||||||
| 	return actions, nil | 	return actions, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (p *RepoProvider) CreateAction(ctx context.Context, roomID string, a *models.Action) error { | func (p *RepoProvider) CreateAction(ctx context.Context, a *models.Action) error { | ||||||
| 	db := getDB(ctx, p.DB) | 	db := getDB(ctx, p.DB) | ||||||
| 	_, err := db.ExecContext(ctx, `INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, a.Actor, a.ActorColor, a.Action, a.Word, a.WordColor, a.Number, a.CreatedAt.UnixNano()) | 	_, err := db.ExecContext(ctx, `INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, a.RoomID, a.Actor, a.ActorColor, a.Action, a.Word, a.WordColor, a.Number, a.CreatedAt.UnixNano()) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -43,3 +44,9 @@ func (p *RepoProvider) DeleteActionsByRoomID(ctx context.Context, roomID string) | |||||||
| 	_, err := db.ExecContext(ctx, `DELETE FROM actions WHERE room_id = ?`, roomID) | 	_, err := db.ExecContext(ctx, `DELETE FROM actions WHERE room_id = ?`, roomID) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (p *RepoProvider) ActionsDeleteOrphaned(ctx context.Context) error { | ||||||
|  | 	db := getDB(ctx, p.DB) | ||||||
|  | 	_, err := db.ExecContext(ctx, `DELETE FROM actions WHERE room_id NOT IN (SELECT id FROM rooms)`) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder