From eb76309366a1fd4ef155150dc297204de4edc613 Mon Sep 17 00:00:00 2001 From: Allan Jones Date: Tue, 12 Sep 2017 13:42:14 +0100 Subject: [PATCH 1/3] Partial (?) fix for mainline issue 26 - routing maniphest tasks with multiple projects --- app/controllers/feed.go | 5 ++--- app/resolvers/maniphest.go | 40 +++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/app/controllers/feed.go b/app/controllers/feed.go index 98b9513..5da5058 100644 --- a/app/controllers/feed.go +++ b/app/controllers/feed.go @@ -83,12 +83,11 @@ func (f *FeedController) postReceive(c *gin.Context) { } break case constants.PhidTypeTask: - channelName, err := f.Tasks.Resolve(res.PHID) + channelNames, err := f.Tasks.Resolve(res.PHID) if err != nil { f.Logger.Error(err) } - - if channelName != "" { + for _,channelName := range channelNames { f.Connector.Post(channelName, storyText, icon, false) } break diff --git a/app/resolvers/maniphest.go b/app/resolvers/maniphest.go index fb02724..c893eaa 100644 --- a/app/resolvers/maniphest.go +++ b/app/resolvers/maniphest.go @@ -4,20 +4,22 @@ import ( "github.com/etcinit/gonduit/requests" "github.com/etcinit/phabulous/app/factories" "github.com/jacobstr/confer" + "github.com/Sirupsen/logrus" ) // TaskResolver resolves Maniphest tasks to Slack channels. type TaskResolver struct { Config *confer.Config `inject:""` Factory *factories.GonduitFactory `inject:""` + Logger *logrus.Logger `inject:""` } // Resolve resolves the channel the message about a task should be posted on. -func (c *TaskResolver) Resolve(phid string) (string, error) { +func (c *TaskResolver) Resolve(phid string) ([]string, error) { conduit, err := c.Factory.Make() - + var retVal []string if err != nil { - return "", err + return retVal, err } tasks, err := conduit.ManiphestQuery( @@ -27,29 +29,27 @@ func (c *TaskResolver) Resolve(phid string) (string, error) { ) if err != nil { - return "", err + return retVal, err } task := tasks.Get(phid) if len(task.ProjectPHIDs) < 1 { - return "", nil - } - - projectsPtr, err := conduit.ProjectQuery(requests.ProjectQueryRequest{ - PHIDs: []string{task.ProjectPHIDs[0]}, - }) - - if err != nil { - return "", err + return retVal, nil } - - projects := *projectsPtr channelMap := c.Config.GetStringMapString("channels.projects") - if channelName, ok := channelMap[projects.Data[task.ProjectPHIDs[0]].ID]; ok == true { - return channelName, nil - } - - return "", nil + for _, projectPHID := range task.ProjectPHIDs { + projects, err := conduit.ProjectQuery(requests.ProjectQueryRequest{ + PHIDs: []string{projectPHID}, + }) + if err != nil { + return retVal, err + } + if channelName, ok := channelMap[projects.Data[projectPHID].ID]; ok == true { + retVal = append(retVal, channelName) + } + } + + return retVal, nil } From 9873087d0cda77e207c22e8e08d965bf8812dd8f Mon Sep 17 00:00:00 2001 From: Allan Jones Date: Fri, 15 Sep 2017 16:08:30 +0100 Subject: [PATCH 2/3] updated to default to the empty defined channel if no matches found --- app/resolvers/maniphest.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/resolvers/maniphest.go b/app/resolvers/maniphest.go index c893eaa..7ffb4c4 100644 --- a/app/resolvers/maniphest.go +++ b/app/resolvers/maniphest.go @@ -38,7 +38,7 @@ func (c *TaskResolver) Resolve(phid string) ([]string, error) { return retVal, nil } channelMap := c.Config.GetStringMapString("channels.projects") - + matches := 0 for _, projectPHID := range task.ProjectPHIDs { projects, err := conduit.ProjectQuery(requests.ProjectQueryRequest{ PHIDs: []string{projectPHID}, @@ -48,8 +48,11 @@ func (c *TaskResolver) Resolve(phid string) ([]string, error) { } if channelName, ok := channelMap[projects.Data[projectPHID].ID]; ok == true { retVal = append(retVal, channelName) + matches += 1 } } - - return retVal, nil + if (matches == 0) { + retVal = append(retVal, "") + } + return retVal, nil } From f61b95eea2d1d1066b5fb1a4df5d28bd53c99d0c Mon Sep 17 00:00:00 2001 From: Allan Jones Date: Mon, 18 Sep 2017 17:20:12 +0100 Subject: [PATCH 3/3] further fix for default channel to be used if no matches found --- app/controllers/feed.go | 3 +++ app/resolvers/maniphest.go | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/feed.go b/app/controllers/feed.go index 5da5058..f977c19 100644 --- a/app/controllers/feed.go +++ b/app/controllers/feed.go @@ -87,8 +87,11 @@ func (f *FeedController) postReceive(c *gin.Context) { if err != nil { f.Logger.Error(err) } + f.Logger.Debug(channelNames) for _,channelName := range channelNames { + f.Logger.Debug(channelName) f.Connector.Post(channelName, storyText, icon, false) + f.Logger.Debug("posted") } break case constants.PhidTypeDifferentialRevision: diff --git a/app/resolvers/maniphest.go b/app/resolvers/maniphest.go index 7ffb4c4..6f285d4 100644 --- a/app/resolvers/maniphest.go +++ b/app/resolvers/maniphest.go @@ -4,14 +4,12 @@ import ( "github.com/etcinit/gonduit/requests" "github.com/etcinit/phabulous/app/factories" "github.com/jacobstr/confer" - "github.com/Sirupsen/logrus" ) // TaskResolver resolves Maniphest tasks to Slack channels. type TaskResolver struct { Config *confer.Config `inject:""` Factory *factories.GonduitFactory `inject:""` - Logger *logrus.Logger `inject:""` } // Resolve resolves the channel the message about a task should be posted on. @@ -38,6 +36,7 @@ func (c *TaskResolver) Resolve(phid string) ([]string, error) { return retVal, nil } channelMap := c.Config.GetStringMapString("channels.projects") + defaultChannel := c.Config.GetString("channels.feed") matches := 0 for _, projectPHID := range task.ProjectPHIDs { projects, err := conduit.ProjectQuery(requests.ProjectQueryRequest{ @@ -52,7 +51,7 @@ func (c *TaskResolver) Resolve(phid string) ([]string, error) { } } if (matches == 0) { - retVal = append(retVal, "") + retVal = append(retVal, defaultChannel) } return retVal, nil }