// Package main is the entry point for the preferences-api service. package main import ( "database/sql" "flag" "fmt" "os" _ "github.com/lib/pq" "git.threesix.ai/jordan/slack5-1770574304/pkg/app" "git.threesix.ai/jordan/slack5-1770574304/pkg/config" "git.threesix.ai/jordan/slack5-1770574304/pkg/logging" "git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/adapter/postgres" "git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/api" "git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/service" ) func main() { // Parse flags exportOpenAPI := flag.Bool("export-openapi", false, "Export OpenAPI spec to stdout and exit") flag.Parse() // If exporting OpenAPI, generate spec and exit (used by CI for docs generation) if *exportOpenAPI { spec := api.NewServiceSpec() jsonBytes, err := spec.JSON() if err != nil { fmt.Fprintf(os.Stderr, "failed to generate OpenAPI spec: %v\n", err) os.Exit(1) } fmt.Println(string(jsonBytes)) os.Exit(0) } // Create logger logger := logging.Default() // Load database config dbCfg := config.ReadDatabaseConfig() // Open PostgreSQL connection db, err := sql.Open("postgres", dbCfg.URL) if err != nil { logger.Error("failed to open database", "error", err) os.Exit(1) } defer db.Close() if dbCfg.MaxOpenConns > 0 { db.SetMaxOpenConns(dbCfg.MaxOpenConns) } if dbCfg.MaxIdleConns > 0 { db.SetMaxIdleConns(dbCfg.MaxIdleConns) } if dbCfg.ConnMaxLifetime > 0 { db.SetConnMaxLifetime(dbCfg.ConnMaxLifetime) } // Create adapters (repositories) prefRepo, err := postgres.NewPreferenceRepository(db) if err != nil { logger.Error("failed to create preference repository", "error", err) os.Exit(1) } // Create services (business logic) preferenceService := service.NewPreferenceService(prefRepo, logger) // Create application application := app.New("preferences-api", app.WithDefaultPort(8001)) // Register routes with dependency injection api.RegisterRoutes(application, preferenceService) // Start server application.Run() }