func sendReactionEvent(event string, channelId string, reaction *model.Reaction, postHadReactions bool) { // send out that a reaction has been added/removed go func() { message := model.NewWebSocketEvent(event, "", channelId, "", nil) message.Add("reaction", reaction.ToJson()) app.Publish(message) }() // send out that a post was updated if post.HasReactions has changed go func() { var post *model.Post if result := <-app.Srv.Store.Post().Get(reaction.PostId); result.Err != nil { l4g.Warn(utils.T("api.reaction.send_reaction_event.post.app_error")) return } else { post = result.Data.(*model.PostList).Posts[reaction.PostId] } if post.HasReactions != postHadReactions { message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_POST_EDITED, "", channelId, "", nil) message.Add("post", post.ToJson()) app.Publish(message) } }() }
func (s SqlReactionStore) Save(reaction *model.Reaction) StoreChannel { storeChannel := make(StoreChannel) go func() { result := StoreResult{} reaction.PreSave() if result.Err = reaction.IsValid(); result.Err != nil { storeChannel <- result close(storeChannel) return } if transaction, err := s.GetMaster().Begin(); err != nil { result.Err = model.NewLocAppError("SqlReactionStore.Save", "store.sql_reaction.save.begin.app_error", nil, err.Error()) } else { err := saveReactionAndUpdatePost(transaction, reaction) if err != nil { transaction.Rollback() // We don't consider duplicated save calls as an error if !IsUniqueConstraintError(err.Error(), []string{"reactions_pkey", "PRIMARY"}) { result.Err = model.NewLocAppError("SqlPreferenceStore.Save", "store.sql_reaction.save.save.app_error", nil, err.Error()) } } else { if err := transaction.Commit(); err != nil { // don't need to rollback here since the transaction is already closed result.Err = model.NewLocAppError("SqlPreferenceStore.Save", "store.sql_preference.save.commit.app_error", nil, err.Error()) } } if result.Err == nil { result.Data = reaction } } storeChannel <- result close(storeChannel) }() return storeChannel }