From df93adce9adfc498706416fcf75f402f79b0b681 Mon Sep 17 00:00:00 2001
From: zhulongcheng <zhulongcheng.me@gmail.com>
Date: Wed, 16 Jan 2019 23:48:17 +0800
Subject: [PATCH] feat(http): construct telegraf handler by TelegrafBackend

---
 http/api_handler.go   | 11 +++--------
 http/telegraf.go      | 46 ++++++++++++++++++++++++++++++-------------
 http/telegraf_test.go | 30 +++++++++++++++++++---------
 3 files changed, 56 insertions(+), 31 deletions(-)

diff --git a/http/api_handler.go b/http/api_handler.go
index 9259cfa9e0..f4235a7d3d 100644
--- a/http/api_handler.go
+++ b/http/api_handler.go
@@ -120,14 +120,9 @@ func NewAPIHandler(b *APIBackend) *APIHandler {
 	taskBackend := NewTaskBackend(b)
 	h.TaskHandler = NewTaskHandler(taskBackend)
 
-	h.TelegrafHandler = NewTelegrafHandler(
-		b.Logger.With(zap.String("handler", "telegraf")),
-		b.UserResourceMappingService,
-		b.LabelService,
-		authorizer.NewTelegrafConfigService(b.TelegrafService, b.UserResourceMappingService),
-		b.UserService,
-		b.OrganizationService,
-	)
+	telegrafBackend := NewTelegrafBackend(b)
+	telegrafBackend.TelegrafService = authorizer.NewTelegrafConfigService(b.TelegrafService, b.UserResourceMappingService)
+	h.TelegrafHandler = NewTelegrafHandler(telegrafBackend)
 
 	h.WriteHandler = NewWriteHandler(b.PointsWriter)
 	h.WriteHandler.OrganizationService = b.OrganizationService
diff --git a/http/telegraf.go b/http/telegraf.go
index 416fd8efa2..65d9141a08 100644
--- a/http/telegraf.go
+++ b/http/telegraf.go
@@ -14,6 +14,31 @@ import (
 	"go.uber.org/zap"
 )
 
+// TelegrafBackend is all services and associated parameters required to construct
+// the TelegrafHandler.
+type TelegrafBackend struct {
+	Logger *zap.Logger
+
+	TelegrafService            platform.TelegrafConfigStore
+	UserResourceMappingService platform.UserResourceMappingService
+	LabelService               platform.LabelService
+	UserService                platform.UserService
+	OrganizationService        platform.OrganizationService
+}
+
+// NewTelegrafBackend returns a new instance of TelegrafBackend.
+func NewTelegrafBackend(b *APIBackend) *TelegrafBackend {
+	return &TelegrafBackend{
+		Logger: b.Logger.With(zap.String("handler", "telegraf")),
+
+		TelegrafService:            b.TelegrafService,
+		UserResourceMappingService: b.UserResourceMappingService,
+		LabelService:               b.LabelService,
+		UserService:                b.UserService,
+		OrganizationService:        b.OrganizationService,
+	}
+}
+
 // TelegrafHandler is the handler for the telegraf service
 type TelegrafHandler struct {
 	*httprouter.Router
@@ -38,23 +63,16 @@ const (
 )
 
 // NewTelegrafHandler returns a new instance of TelegrafHandler.
-func NewTelegrafHandler(
-	logger *zap.Logger,
-	mappingService platform.UserResourceMappingService,
-	labelService platform.LabelService,
-	telegrafSvc platform.TelegrafConfigStore,
-	userService platform.UserService,
-	orgService platform.OrganizationService,
-) *TelegrafHandler {
+func NewTelegrafHandler(b *TelegrafBackend) *TelegrafHandler {
 	h := &TelegrafHandler{
 		Router: NewRouter(),
+		Logger: b.Logger,
 
-		UserResourceMappingService: mappingService,
-		LabelService:               labelService,
-		TelegrafService:            telegrafSvc,
-		Logger:                     logger,
-		UserService:                userService,
-		OrganizationService:        orgService,
+		TelegrafService:            b.TelegrafService,
+		UserResourceMappingService: b.UserResourceMappingService,
+		LabelService:               b.LabelService,
+		UserService:                b.UserService,
+		OrganizationService:        b.OrganizationService,
 	}
 	h.HandlerFunc("POST", telegrafsPath, h.handlePostTelegraf)
 	h.HandlerFunc("GET", telegrafsPath, h.handleGetTelegrafs)
diff --git a/http/telegraf_test.go b/http/telegraf_test.go
index 1b7d52fc73..81841de1e4 100644
--- a/http/telegraf_test.go
+++ b/http/telegraf_test.go
@@ -10,13 +10,27 @@ import (
 	"strings"
 	"testing"
 
+	"go.uber.org/zap"
+
 	platform "github.com/influxdata/influxdb"
 	"github.com/influxdata/influxdb/mock"
 	"github.com/influxdata/influxdb/telegraf/plugins/inputs"
 	"github.com/influxdata/influxdb/telegraf/plugins/outputs"
-	"go.uber.org/zap/zaptest"
 )
 
+// NewMockTelegrafBackend returns a TelegrafBackend with mock services.
+func NewMockTelegrafBackend() *TelegrafBackend {
+	return &TelegrafBackend{
+		Logger: zap.NewNop().With(zap.String("handler", "telegraf")),
+
+		TelegrafService:            &mock.TelegrafConfigStore{},
+		UserResourceMappingService: mock.NewUserResourceMappingService(),
+		LabelService:               mock.NewLabelService(),
+		UserService:                mock.NewUserService(),
+		OrganizationService:        mock.NewOrganizationService(),
+	}
+}
+
 func TestTelegrafHandler_handleGetTelegrafs(t *testing.T) {
 	type wants struct {
 		statusCode  int
@@ -155,7 +169,9 @@ func TestTelegrafHandler_handleGetTelegrafs(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			w := httptest.NewRecorder()
-			h := NewTelegrafHandler(zaptest.NewLogger(t), mock.NewUserResourceMappingService(), mock.NewLabelService(), tt.svc, mock.NewUserService(), &mock.OrganizationService{})
+			telegrafBackend := NewMockTelegrafBackend()
+			telegrafBackend.TelegrafService = tt.svc
+			h := NewTelegrafHandler(telegrafBackend)
 			h.ServeHTTP(w, tt.r)
 
 			res := w.Result()
@@ -674,15 +690,11 @@ func TestTelegrafHandler_handleGetTelegraf(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			logger := zaptest.NewLogger(t)
-			mapping := mock.NewUserResourceMappingService()
-			labels := mock.NewLabelService()
-			users := mock.NewUserService()
-			orgs := &mock.OrganizationService{}
-
 			tt.r.Header.Set("Accept", tt.acceptHeader)
 			w := httptest.NewRecorder()
-			h := NewTelegrafHandler(logger, mapping, labels, tt.svc, users, orgs)
+			telegrafBackend := NewMockTelegrafBackend()
+			telegrafBackend.TelegrafService = tt.svc
+			h := NewTelegrafHandler(telegrafBackend)
 
 			h.ServeHTTP(w, tt.r)