internal/worker: handle vulndb request counts

Add a handler to the server for computing vuln DB request counts.

Change-Id: Ib2664f1cdafd397239a9fc8b025691b066427c6c
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/483636
Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/worker/server.go b/internal/worker/server.go
index 0845972..d577d78 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -16,6 +16,7 @@
 	"time"
 
 	"cloud.google.com/go/errorreporting"
+	"golang.org/x/pkgsite-metrics/internal"
 	"golang.org/x/pkgsite-metrics/internal/analysis"
 	"golang.org/x/pkgsite-metrics/internal/bigquery"
 	"golang.org/x/pkgsite-metrics/internal/config"
@@ -25,6 +26,7 @@
 	"golang.org/x/pkgsite-metrics/internal/observe"
 	"golang.org/x/pkgsite-metrics/internal/proxy"
 	"golang.org/x/pkgsite-metrics/internal/queue"
+	"golang.org/x/pkgsite-metrics/internal/vulndbreqs"
 	vulnc "golang.org/x/vuln/client"
 )
 
@@ -117,10 +119,15 @@
 	if err := s.registerAnalysisHandlers(ctx); err != nil {
 		return nil, err
 	}
+	// compute missing vuln.go.dev request counts
+	s.handle("/compute-requests", s.handleComputeRequests)
 	return s, nil
 }
 
 func ensureTable(ctx context.Context, bq *bigquery.Client, name string) error {
+	if bq == nil {
+		return nil
+	}
 	created, err := bq.CreateOrUpdateTable(ctx, name)
 	if err != nil {
 		return err
@@ -189,6 +196,27 @@
 	return nil
 }
 
+func (s *Server) handleComputeRequests(w http.ResponseWriter, r *http.Request) error {
+	ctx := r.Context()
+	// Don't use the Server's BigQuery client: it's for the wrong
+	// dataset.
+	vClient, err := bigquery.NewClientCreate(ctx, s.cfg.ProjectID, vulndbreqs.DatasetName)
+	if err != nil {
+		return err
+	}
+	keyName := "projects/" + s.cfg.ProjectID + "/secrets/vulndb-hmac-key"
+	hmacKey, err := internal.GetSecret(ctx, keyName)
+	if err != nil {
+		return err
+	}
+	err = vulndbreqs.ComputeAndStore(ctx, s.cfg.VulnDBBucketProjectID, vClient, []byte(hmacKey))
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(w, "Successfully computed and stored request counts.\n")
+	return nil
+}
+
 type serverError struct {
 	status int   // HTTP status code
 	err    error // wrapped error