diff --git a/internal/webserver/handler_messages.go b/internal/webserver/handler_messages.go index 7689386..efc0b65 100644 --- a/internal/webserver/handler_messages.go +++ b/internal/webserver/handler_messages.go @@ -98,7 +98,20 @@ func (app *Application) message_detail(w http.ResponseWriter, r *http.Request) { panic_if(json.Unmarshal(data_, &data)) panic_if(app.API.SendDMReaction(room_id, data.MessageID, data.Reacc)) - dm_message := global_data.Messages[data.MessageID] + dm_message, is_ok := global_data.Messages[data.MessageID] + if !is_ok { + // TODO: this seems kind of silly to use global data in the first place; it's unlikely + // to have the relevant tweet in it, since it just gets the one latest tweet from the + // convo. This handler should be pulled out and just fetch the tweet directly-- + // performance probably doesn't matter, but it's spaghetti code otherwise + trove_with_dm_message, err := app.Profile.GetChatMessage(data.MessageID) + panic_if(err) + global_data.MergeWith(trove_with_dm_message) + dm_message, is_ok = global_data.Messages[data.MessageID] + if !is_ok { + panic(global_data) + } + } dm_message.Reactions[app.ActiveUser.ID] = scraper.DMReaction{ ID: 0, // Hopefully will be OK temporarily DMMessageID: dm_message.ID, diff --git a/pkg/persistence/dm_queries.go b/pkg/persistence/dm_queries.go index f3e2c19..830500c 100644 --- a/pkg/persistence/dm_queries.go +++ b/pkg/persistence/dm_queries.go @@ -169,27 +169,27 @@ func (p Profile) SaveChatMessage(m DMMessage) error { return nil } -// Get a single chat message, filling its attachment contents. -// -// This function is only used in tests. -func (p Profile) GetChatMessage(id DMMessageID) (ret DMMessage, err error) { - err = p.DB.Get(&ret, ` +// Get a single chat message, filling its attachment contents. Returns a TweetTrove because a +// message can have a tweet attachment, etc. +func (p Profile) GetChatMessage(id DMMessageID) (TweetTrove, error) { + trove := NewTweetTrove() + var msg DMMessage + err := p.DB.Get(&msg, ` select `+CHAT_MESSAGES_ALL_SQL_FIELDS+` from chat_messages where id = ? `, id, ) if err != nil { - return ret, fmt.Errorf("Error getting chat message %d:\n %w", id, err) + return trove, fmt.Errorf("Error getting chat message %d:\n %w", id, err) } - ret.Reactions = make(map[UserID]DMReaction) + msg.Reactions = make(map[UserID]DMReaction) // This is a bit circuitous, but it doesn't matter because this function is only used in tests - trove := NewTweetTrove() - trove.Messages[ret.ID] = ret + trove.Messages[msg.ID] = msg p.fill_dm_contents(&trove) - return trove.Messages[ret.ID], nil + return trove, nil } type DMChatView struct { diff --git a/pkg/persistence/dm_queries_test.go b/pkg/persistence/dm_queries_test.go index 6c16918..ca511d5 100644 --- a/pkg/persistence/dm_queries_test.go +++ b/pkg/persistence/dm_queries_test.go @@ -110,8 +110,10 @@ func TestSaveAndLoadChatMessage(t *testing.T) { require.NoError(err) // Reload it - new_message, err := profile.GetChatMessage(message.ID) + trove_with_new_message, err := profile.GetChatMessage(message.ID) require.NoError(err) + new_message, is_ok := trove_with_new_message.Messages[message.ID] + require.True(is_ok) if diff := deep.Equal(message, new_message); diff != nil { t.Error(diff) @@ -145,8 +147,10 @@ func TestAddReactionToChatMessage(t *testing.T) { require.NoError(profile.SaveChatMessage(message)) // Reload it - new_message, err := profile.GetChatMessage(message.ID) + trove_with_new_message, err := profile.GetChatMessage(message.ID) require.NoError(err) + new_message, is_ok := trove_with_new_message.Messages[message.ID] + require.True(is_ok) if diff := deep.Equal(message, new_message); diff != nil { t.Error(diff)