From 9f9620b4c839ebefe6d7fc48e2d051f342a2729a Mon Sep 17 00:00:00 2001 From: Puneeth Reddy <45575072+therealpuneeth20@users.noreply.github.com> Date: Fri, 26 Apr 2019 12:20:36 -0700 Subject: [PATCH] MM-15186: Migrate "WebHook.GetOutgoingByTeam" to Sync by defa (#10707) --- app/webhook.go | 27 +++++++++------------------ cmd/mattermost/commands/webhook.go | 7 ++++++- store/sqlstore/webhook_store.go | 26 ++++++++++++-------------- store/store.go | 2 +- store/storetest/mocks/WebhookStore.go | 19 ++++++++++++++----- store/storetest/webhook_store.go | 12 ++++++------ 6 files changed, 48 insertions(+), 45 deletions(-) diff --git a/app/webhook.go b/app/webhook.go index d1545e9f44..35a5a48699 100644 --- a/app/webhook.go +++ b/app/webhook.go @@ -33,13 +33,11 @@ func (a *App) handleWebhookEvents(post *model.Post, team *model.Team, channel *m return nil } - hchan := a.Srv.Store.Webhook().GetOutgoingByTeam(team.Id, -1, -1) - result := <-hchan - if result.Err != nil { - return result.Err + hooks, err := a.Srv.Store.Webhook().GetOutgoingByTeam(team.Id, -1, -1) + if err != nil { + return err } - hooks := result.Data.([]*model.OutgoingWebhook) if len(hooks) == 0 { return nil } @@ -417,10 +415,9 @@ func (a *App) CreateOutgoingWebhook(hook *model.OutgoingWebhook) (*model.Outgoin return nil, model.NewAppError("CreateOutgoingWebhook", "api.webhook.create_outgoing.triggers.app_error", nil, "", http.StatusBadRequest) } - if result := <-a.Srv.Store.Webhook().GetOutgoingByTeam(hook.TeamId, -1, -1); result.Err != nil { - return nil, result.Err + if allHooks, err := a.Srv.Store.Webhook().GetOutgoingByTeam(hook.TeamId, -1, -1); err != nil { + return nil, err } else { - allHooks := result.Data.([]*model.OutgoingWebhook) for _, existingOutHook := range allHooks { urlIntersect := utils.StringArrayIntersection(existingOutHook.CallbackURLs, hook.CallbackURLs) @@ -462,13 +459,11 @@ func (a *App) UpdateOutgoingWebhook(oldHook, updatedHook *model.OutgoingWebhook) return nil, model.NewAppError("UpdateOutgoingWebhook", "api.webhook.create_outgoing.triggers.app_error", nil, "", http.StatusInternalServerError) } - var result store.StoreResult - if result = <-a.Srv.Store.Webhook().GetOutgoingByTeam(oldHook.TeamId, -1, -1); result.Err != nil { - return nil, result.Err + allHooks, err := a.Srv.Store.Webhook().GetOutgoingByTeam(oldHook.TeamId, -1, -1) + if err != nil { + return nil, err } - allHooks := result.Data.([]*model.OutgoingWebhook) - for _, existingOutHook := range allHooks { urlIntersect := utils.StringArrayIntersection(existingOutHook.CallbackURLs, updatedHook.CallbackURLs) triggerIntersect := utils.StringArrayIntersection(existingOutHook.TriggerWords, updatedHook.TriggerWords) @@ -520,11 +515,7 @@ func (a *App) GetOutgoingWebhooksForTeamPage(teamId string, page, perPage int) ( return nil, model.NewAppError("GetOutgoingWebhooksForTeamPage", "api.outgoing_webhook.disabled.app_error", nil, "", http.StatusNotImplemented) } - if result := <-a.Srv.Store.Webhook().GetOutgoingByTeam(teamId, page*perPage, perPage); result.Err != nil { - return nil, result.Err - } else { - return result.Data.([]*model.OutgoingWebhook), nil - } + return a.Srv.Store.Webhook().GetOutgoingByTeam(teamId, page*perPage, perPage) } func (a *App) DeleteOutgoingWebhook(hookId string) *model.AppError { diff --git a/cmd/mattermost/commands/webhook.go b/cmd/mattermost/commands/webhook.go index 92034219f0..e89868f2ce 100644 --- a/cmd/mattermost/commands/webhook.go +++ b/cmd/mattermost/commands/webhook.go @@ -108,7 +108,12 @@ func listWebhookCmdF(command *cobra.Command, args []string) error { incomingResult <- store.StoreResult{Data: incomingHooks, Err: err} close(incomingResult) }() - outgoingResult := app.Srv.Store.Webhook().GetOutgoingByTeam(team.Id, 0, 100000000) + outgoingResult := make(chan store.StoreResult, 1) + go func() { + outgoingHooks, err := app.Srv.Store.Webhook().GetOutgoingByTeam(team.Id, 0, 100000000) + outgoingResult <- store.StoreResult{Data: outgoingHooks, Err: err} + close(outgoingResult) + }() if result := <-incomingResult; result.Err == nil { CommandPrettyPrintln(fmt.Sprintf("Incoming webhooks for %s (%s):", team.DisplayName, team.Name)) diff --git a/store/sqlstore/webhook_store.go b/store/sqlstore/webhook_store.go index fd5a164ade..b42a842f43 100644 --- a/store/sqlstore/webhook_store.go +++ b/store/sqlstore/webhook_store.go @@ -262,23 +262,21 @@ func (s SqlWebhookStore) GetOutgoingByChannel(channelId string, offset, limit in }) } -func (s SqlWebhookStore) GetOutgoingByTeam(teamId string, offset, limit int) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - var webhooks []*model.OutgoingWebhook +func (s SqlWebhookStore) GetOutgoingByTeam(teamId string, offset, limit int) ([]*model.OutgoingWebhook, *model.AppError) { + var webhooks []*model.OutgoingWebhook - query := "" - if limit < 0 || offset < 0 { - query = "SELECT * FROM OutgoingWebhooks WHERE TeamId = :TeamId AND DeleteAt = 0" - } else { - query = "SELECT * FROM OutgoingWebhooks WHERE TeamId = :TeamId AND DeleteAt = 0 LIMIT :Limit OFFSET :Offset" - } + query := "" + if limit < 0 || offset < 0 { + query = "SELECT * FROM OutgoingWebhooks WHERE TeamId = :TeamId AND DeleteAt = 0" + } else { + query = "SELECT * FROM OutgoingWebhooks WHERE TeamId = :TeamId AND DeleteAt = 0 LIMIT :Limit OFFSET :Offset" + } - if _, err := s.GetReplica().Select(&webhooks, query, map[string]interface{}{"TeamId": teamId, "Offset": offset, "Limit": limit}); err != nil { - result.Err = model.NewAppError("SqlWebhookStore.GetOutgoingByTeam", "store.sql_webhooks.get_outgoing_by_team.app_error", nil, "teamId="+teamId+", err="+err.Error(), http.StatusInternalServerError) - } + if _, err := s.GetReplica().Select(&webhooks, query, map[string]interface{}{"TeamId": teamId, "Offset": offset, "Limit": limit}); err != nil { + return nil, model.NewAppError("SqlWebhookStore.GetOutgoingByTeam", "store.sql_webhooks.get_outgoing_by_team.app_error", nil, "teamId="+teamId+", err="+err.Error(), http.StatusInternalServerError) + } - result.Data = webhooks - }) + return webhooks, nil } func (s SqlWebhookStore) DeleteOutgoing(webhookId string, time int64) *model.AppError { diff --git a/store/store.go b/store/store.go index 989182976c..15097d3e97 100644 --- a/store/store.go +++ b/store/store.go @@ -391,7 +391,7 @@ type WebhookStore interface { GetOutgoing(id string) (*model.OutgoingWebhook, *model.AppError) GetOutgoingList(offset, limit int) ([]*model.OutgoingWebhook, *model.AppError) GetOutgoingByChannel(channelId string, offset, limit int) StoreChannel - GetOutgoingByTeam(teamId string, offset, limit int) StoreChannel + GetOutgoingByTeam(teamId string, offset, limit int) ([]*model.OutgoingWebhook, *model.AppError) DeleteOutgoing(webhookId string, time int64) *model.AppError PermanentDeleteOutgoingByChannel(channelId string) *model.AppError PermanentDeleteOutgoingByUser(userId string) StoreChannel diff --git a/store/storetest/mocks/WebhookStore.go b/store/storetest/mocks/WebhookStore.go index 7258446593..8c1d52d584 100644 --- a/store/storetest/mocks/WebhookStore.go +++ b/store/storetest/mocks/WebhookStore.go @@ -231,19 +231,28 @@ func (_m *WebhookStore) GetOutgoingByChannel(channelId string, offset int, limit } // GetOutgoingByTeam provides a mock function with given fields: teamId, offset, limit -func (_m *WebhookStore) GetOutgoingByTeam(teamId string, offset int, limit int) store.StoreChannel { +func (_m *WebhookStore) GetOutgoingByTeam(teamId string, offset int, limit int) ([]*model.OutgoingWebhook, *model.AppError) { ret := _m.Called(teamId, offset, limit) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string, int, int) store.StoreChannel); ok { + var r0 []*model.OutgoingWebhook + if rf, ok := ret.Get(0).(func(string, int, int) []*model.OutgoingWebhook); ok { r0 = rf(teamId, offset, limit) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).([]*model.OutgoingWebhook) } } - return r0 + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string, int, int) *model.AppError); ok { + r1 = rf(teamId, offset, limit) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // GetOutgoingList provides a mock function with given fields: offset, limit diff --git a/store/storetest/webhook_store.go b/store/storetest/webhook_store.go index ebb08f4258..8e0d1c4947 100644 --- a/store/storetest/webhook_store.go +++ b/store/storetest/webhook_store.go @@ -397,18 +397,18 @@ func testWebhookStoreGetOutgoingByTeam(t *testing.T, ss store.Store) { o1, _ = ss.Webhook().SaveOutgoing(o1) - if r1 := <-ss.Webhook().GetOutgoingByTeam(o1.TeamId, 0, 100); r1.Err != nil { - t.Fatal(r1.Err) + if r1, err := ss.Webhook().GetOutgoingByTeam(o1.TeamId, 0, 100); err != nil { + t.Fatal(err) } else { - if r1.Data.([]*model.OutgoingWebhook)[0].CreateAt != o1.CreateAt { + if r1[0].CreateAt != o1.CreateAt { t.Fatal("invalid returned webhook") } } - if result := <-ss.Webhook().GetOutgoingByTeam("123", -1, -1); result.Err != nil { - t.Fatal(result.Err) + if result, err := ss.Webhook().GetOutgoingByTeam("123", -1, -1); err != nil { + t.Fatal(err) } else { - if len(result.Data.([]*model.OutgoingWebhook)) != 0 { + if len(result) != 0 { t.Fatal("no webhooks should have returned") } }