| 87 | } |
| 88 | |
| 89 | func (s *Server) Run(ctx context.Context, addr string) error { |
| 90 | mux := httptrace.NewServeMux() |
| 91 | |
| 92 | if s.isProductionEnvironment { |
| 93 | defer configureObservability(mux, s.releaseVersion)() |
| 94 | go func() { |
| 95 | if err := s.db.DeepClean(ctx); err != nil { |
| 96 | fmt.Println("failed to deep clean: %w", err) |
| 97 | } |
| 98 | }() |
| 99 | } |
| 100 | middlewares := mergeMiddlewares( |
| 101 | withPanicGuard(s.statsd), |
| 102 | withLogging(s.statsd, os.Stdout), |
| 103 | ) |
| 104 | |
| 105 | mux.Handle("/api/v1/submit", middlewares(http.HandlerFunc(s.apiSubmitHandler))) |
| 106 | mux.Handle("/api/v1/get-dump-requests", middlewares(http.HandlerFunc(s.apiGetPendingDumpRequestsHandler))) |
| 107 | mux.Handle("/api/v1/submit-dump", middlewares(http.HandlerFunc(s.apiSubmitDumpHandler))) |
| 108 | mux.Handle("/api/v1/query", middlewares(http.HandlerFunc(s.apiQueryHandler))) |
| 109 | mux.Handle("/api/v1/bootstrap", middlewares(http.HandlerFunc(s.apiBootstrapHandler))) |
| 110 | mux.Handle("/api/v1/register", middlewares(http.HandlerFunc(s.apiRegisterHandler))) |
| 111 | mux.Handle("/api/v1/banner", middlewares(http.HandlerFunc(s.apiBannerHandler))) |
| 112 | mux.Handle("/api/v1/download", middlewares(http.HandlerFunc(s.apiDownloadHandler))) |
| 113 | mux.Handle("/api/v1/trigger-cron", middlewares(http.HandlerFunc(s.triggerCronHandler))) |
| 114 | mux.Handle("/api/v1/get-deletion-requests", middlewares(http.HandlerFunc(s.getDeletionRequestsHandler))) |
| 115 | mux.Handle("/api/v1/add-deletion-request", middlewares(http.HandlerFunc(s.addDeletionRequestHandler))) |
| 116 | mux.Handle("/api/v1/slsa-status", middlewares(http.HandlerFunc(s.slsaStatusHandler))) |
| 117 | mux.Handle("/api/v1/feedback", middlewares(http.HandlerFunc(s.feedbackHandler))) |
| 118 | mux.Handle("/api/v1/uninstall", middlewares(http.HandlerFunc(s.apiUninstallHandler))) |
| 119 | mux.Handle("/api/v1/ai-suggest", middlewares(http.HandlerFunc(s.aiSuggestionHandler))) |
| 120 | mux.Handle("/api/v1/ping", middlewares(http.HandlerFunc(s.pingHandler))) |
| 121 | mux.Handle("/healthcheck", middlewares(http.HandlerFunc(s.healthCheckHandler))) |
| 122 | mux.Handle("/internal/api/v1/usage-stats", middlewares(http.HandlerFunc(s.usageStatsHandler))) |
| 123 | mux.Handle("/internal/api/v1/stats", middlewares(http.HandlerFunc(s.statsHandler))) |
| 124 | if s.isTestEnvironment { |
| 125 | mux.Handle("/api/v1/ai-suggest-override", middlewares(http.HandlerFunc(s.testOnlyOverrideAiSuggestions))) |
| 126 | mux.Handle("/api/v1/wipe-db-entries", middlewares(http.HandlerFunc(s.wipeDbEntriesHandler))) |
| 127 | mux.Handle("/api/v1/get-num-connections", middlewares(http.HandlerFunc(s.getNumConnectionsHandler))) |
| 128 | } |
| 129 | |
| 130 | httpServer := &http.Server{ |
| 131 | Addr: addr, |
| 132 | Handler: mux, |
| 133 | } |
| 134 | |
| 135 | fmt.Printf("Listening on %s\n", addr) |
| 136 | if err := httpServer.ListenAndServe(); err != nil { |
| 137 | if !errors.Is(err, http.ErrServerClosed) { |
| 138 | return fmt.Errorf("http.ListenAndServe: %w", err) |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | return nil |
| 143 | } |
| 144 | |
| 145 | func (s *Server) UpdateReleaseVersion(v string, updateInfo shared.UpdateInfo) { |
| 146 | s.releaseVersion = v |