package runcmd import ( "context" "fmt" "go.uber.org/zap" "github.com/kanootoko/codevault/internal/config" "github.com/kanootoko/codevault/internal/db" "github.com/kanootoko/codevault/internal/httpserver" "github.com/kanootoko/codevault/internal/observability/logging" "github.com/kanootoko/codevault/internal/observability/metrics" "github.com/kanootoko/codevault/internal/ratelimit" "github.com/kanootoko/codevault/internal/utils/gshutdown" ) func RunServer(ctx context.Context, appConfig config.Config) error { logger, err := logging.LoggerFromCtx(ctx) if err != nil { return fmt.Errorf("error on getting logger: %w", err) } appMetrics := metrics.NewMetrics(metrics.GetMeter()) database, err := db.Open(appConfig.Database.Path) if err != nil { return fmt.Errorf("error on opening database: %w", err) } _ = gshutdown.SubtaskStarted(ctx, "database") go func() { defer func() { _ = gshutdown.SubtaskFinished(ctx, "database") }() <-ctx.Done() if err := database.Close(); err != nil { logger.Error("error on closing database", zap.Error(err)) } }() secrets := db.NewSecretsRepository(database) users := db.NewUsersRepository(database) limiter := ratelimit.NewLimiter(appConfig.RateLimit.MaxFailures, appConfig.RateLimit.Window) router, err := httpserver.New(secrets, users, limiter, appMetrics, appConfig.Server.TrustedProxies) if err != nil { return fmt.Errorf("error on building http router: %w", err) } logger.Info("starting codevault server") if err := httpserver.Run(ctx, appConfig.Server.Address, router, limiter); err != nil { return fmt.Errorf("error on running http server: %w", err) } return nil }