internal/worker: put NewServer args into a struct

It was hard to read the args to NewServer, and now that we have two
redis clients, it was error-prone to provide them (order matters).
Using a struct effectively lets the caller name the args.

Change-Id: I0e2e39e09402031fd21a754961a2685c377c75fc
Reviewed-on: https://team-review.git.corp.google.com/c/golang/discovery/+/768540
Reviewed-by: Julie Qiu <julieqiu@google.com>
CI-Result: Cloud Build <devtools-proctor-result-processor@system.gserviceaccount.com>
diff --git a/cmd/worker/main.go b/cmd/worker/main.go
index 4dc121e..72c6d21 100644
--- a/cmd/worker/main.go
+++ b/cmd/worker/main.go
@@ -90,9 +90,18 @@
 	reportingClient := reportingClient(ctx, cfg)
 	redisHAClient := getHARedis(ctx, cfg)
 	redisCacheClient := getCacheRedis(ctx, cfg)
-	server, err := worker.NewServer(cfg, db, indexClient, proxyClient, sourceClient,
-		redisHAClient, redisCacheClient, fetchQueue, reportingClient,
-		config.TaskIDChangeIntervalWorker, *staticPath)
+	server, err := worker.NewServer(cfg, worker.ServerConfig{
+		DB:                   db,
+		IndexClient:          indexClient,
+		ProxyClient:          proxyClient,
+		SourceClient:         sourceClient,
+		RedisHAClient:        redisHAClient,
+		RedisCacheClient:     redisCacheClient,
+		Queue:                fetchQueue,
+		ReportingClient:      reportingClient,
+		TaskIDChangeInterval: config.TaskIDChangeIntervalWorker,
+		StaticPath:           *staticPath,
+	})
 	if err != nil {
 		log.Fatal(ctx, err)
 	}
diff --git a/internal/testing/integration/integration_test.go b/internal/testing/integration/integration_test.go
index 8eeb04e..4ec5290 100644
--- a/internal/testing/integration/integration_test.go
+++ b/internal/testing/integration/integration_test.go
@@ -79,7 +79,17 @@
 	queue := queue.NewInMemory(ctx, proxyClient, source.NewClient(1*time.Second), testDB, 10,
 		worker.FetchAndUpdateState, nil)
 
-	workerServer, err := worker.NewServer(&config.Config{}, testDB, indexClient, proxyClient, source.NewClient(1*time.Second), redisHAClient, redisCacheClient, queue, nil, 10*time.Minute, "../../../content/static")
+	workerServer, err := worker.NewServer(&config.Config{}, worker.ServerConfig{
+		DB:                   testDB,
+		IndexClient:          indexClient,
+		ProxyClient:          proxyClient,
+		SourceClient:         source.NewClient(1 * time.Second),
+		RedisHAClient:        redisHAClient,
+		RedisCacheClient:     redisCacheClient,
+		Queue:                queue,
+		TaskIDChangeInterval: 10 * time.Minute,
+		StaticPath:           "../../../content/static",
+	})
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/internal/worker/server.go b/internal/worker/server.go
index 64a23cf..1203466 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -51,38 +51,41 @@
 	indexTemplate *template.Template
 }
 
-// NewServer creates a new Server with the given dependencies.
-func NewServer(cfg *config.Config,
-	db *postgres.DB,
-	indexClient *index.Client,
-	proxyClient *proxy.Client,
-	sourceClient *source.Client,
-	redisHAClient *redis.Client,
-	redisCacheClient *redis.Client,
-	queue queue.Queue,
-	reportingClient *errorreporting.Client,
-	taskIDChangeInterval time.Duration,
-	staticPath string,
-) (_ *Server, err error) {
-	defer derrors.Wrap(&err, "NewServer(db, ic, pc, q, %q)", staticPath)
+// ServerConfig contains everything needed by a Server.
+type ServerConfig struct {
+	DB                   *postgres.DB
+	IndexClient          *index.Client
+	ProxyClient          *proxy.Client
+	SourceClient         *source.Client
+	RedisHAClient        *redis.Client
+	RedisCacheClient     *redis.Client
+	Queue                queue.Queue
+	ReportingClient      *errorreporting.Client
+	TaskIDChangeInterval time.Duration
+	StaticPath           string
+}
 
-	indexTemplate, err := parseTemplate(staticPath)
+// NewServer creates a new Server with the given dependencies.
+func NewServer(cfg *config.Config, scfg ServerConfig) (_ *Server, err error) {
+	defer derrors.Wrap(&err, "NewServer(db, %+v)", scfg)
+
+	indexTemplate, err := parseTemplate(scfg.StaticPath)
 	if err != nil {
 		return nil, err
 	}
 
 	return &Server{
 		cfg:                  cfg,
-		db:                   db,
-		indexClient:          indexClient,
-		proxyClient:          proxyClient,
-		sourceClient:         sourceClient,
-		redisHAClient:        redisHAClient,
-		redisCacheClient:     redisCacheClient,
-		queue:                queue,
-		reportingClient:      reportingClient,
+		db:                   scfg.DB,
+		indexClient:          scfg.IndexClient,
+		proxyClient:          scfg.ProxyClient,
+		sourceClient:         scfg.SourceClient,
+		redisHAClient:        scfg.RedisHAClient,
+		redisCacheClient:     scfg.RedisCacheClient,
+		queue:                scfg.Queue,
+		reportingClient:      scfg.ReportingClient,
 		indexTemplate:        indexTemplate,
-		taskIDChangeInterval: taskIDChangeInterval,
+		taskIDChangeInterval: scfg.TaskIDChangeInterval,
 	}, nil
 }
 
diff --git a/internal/worker/server_test.go b/internal/worker/server_test.go
index c3cf34b..c227c78 100644
--- a/internal/worker/server_test.go
+++ b/internal/worker/server_test.go
@@ -164,8 +164,14 @@
 			// Use 10 workers to have parallelism consistent with the worker binary.
 			q := queue.NewInMemory(ctx, proxyClient, sourceClient, testDB, 10, FetchAndUpdateState, nil)
 
-			s, err := NewServer(&config.Config{}, testDB, indexClient, proxyClient, sourceClient,
-				nil, nil, q, nil, 10*time.Minute, "")
+			s, err := NewServer(&config.Config{}, ServerConfig{
+				DB:                   testDB,
+				IndexClient:          indexClient,
+				ProxyClient:          proxyClient,
+				SourceClient:         sourceClient,
+				Queue:                q,
+				TaskIDChangeInterval: 10 * time.Minute,
+			})
 			if err != nil {
 				t.Fatal(err)
 			}