slack5-1770574304/services/preferences-api/cmd/server/main.go
rdev-worker 5fa5a77bfb
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature user-preferences
2026-02-08 18:36:52 +00:00

80 lines
2.1 KiB
Go

// 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()
}