feature/epic1-core-infrastructure #2

Merged
master merged 16 commits from feature/epic1-core-infrastructure into main 2025-11-05 21:36:55 +01:00
3 changed files with 31 additions and 4 deletions
Showing only changes of commit 0e3bfb4e44 - Show all commits

View File

@@ -7,15 +7,24 @@ import (
"os"
"git.dcentral.systems/toolz/goplt/internal/di"
"git.dcentral.systems/toolz/goplt/internal/infra/database"
"git.dcentral.systems/toolz/goplt/internal/server"
"git.dcentral.systems/toolz/goplt/pkg/logger"
"go.uber.org/fx"
)
func main() {
// Create DI container with lifecycle hooks
// We need to invoke the HTTP server to ensure all providers execute
container := di.NewContainer(
// Invoke lifecycle hooks
fx.Invoke(di.RegisterLifecycleHooks),
// Force HTTP server to be created (which triggers all dependencies)
// This ensures database, health, metrics, etc. are all created
fx.Invoke(func(srv *server.Server, dbClient *database.Client) {
// Both server and database are created, hooks are registered
// This ensures all providers execute
}),
)
// Create root context

View File

@@ -1,7 +1,7 @@
environment: development
server:
port: 8080
port: 3000
host: "0.0.0.0"
read_timeout: 30s
write_timeout: 30s

View File

@@ -70,6 +70,7 @@ func ProvideDatabase() fx.Option {
return fx.Provide(func(cfg config.ConfigProvider, log logger.Logger, lc fx.Lifecycle) (*database.Client, error) {
dsn := cfg.GetString("database.dsn")
if dsn == "" {
log.Error("ProvideDatabase: DSN is empty")
return nil, fmt.Errorf("database DSN is not configured")
}
@@ -93,6 +94,12 @@ func ProvideDatabase() fx.Option {
connMaxIdleTime = 10 * time.Minute
}
log.Info("Preparing database connection",
logger.String("dsn_mask", maskDSN(dsn)),
logger.Int("max_connections", maxConns),
)
log.Info("Connecting to database...")
dbClient, err := database.NewClient(database.Config{
DSN: dsn,
MaxConnections: maxConns,
@@ -101,14 +108,19 @@ func ProvideDatabase() fx.Option {
ConnMaxIdleTime: connMaxIdleTime,
})
if err != nil {
log.Error("Failed to create database client",
logger.Error(err),
)
return nil, fmt.Errorf("failed to create database client: %w", err)
}
log.Info("Database client created successfully")
// Register lifecycle hooks
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
// Run migrations on startup
log.Info("Running database migrations...")
// Run migrations on startup
if err := dbClient.Migrate(ctx); err != nil {
log.Error("Database migrations failed",
logger.Error(err),
@@ -222,16 +234,22 @@ func ProvideHTTPServer() fx.Option {
tracer trace.TracerProvider,
lc fx.Lifecycle,
) (*server.Server, error) {
log.Info("Creating HTTP server...")
srv, err := server.NewServer(cfg, log, healthRegistry, metricsRegistry, errorBus, tracer)
if err != nil {
log.Error("Failed to create HTTP server",
logger.Error(err),
)
return nil, fmt.Errorf("failed to create HTTP server: %w", err)
}
log.Info("HTTP server created, registering lifecycle hooks...")
// Register lifecycle hooks
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
log.Info("HTTP server OnStart hook called")
// Get server address from config
port := cfg.GetInt("server.port")
if port == 0 {