Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cmd/lokstra/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"time"

"github.com/primadi/lokstra/common/utils"
"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_registry"
"github.com/primadi/lokstra/serviceapi"
"github.com/primadi/lokstra/tools/migration_runner"
Expand Down Expand Up @@ -122,8 +123,7 @@ func executeMigration(subCmd, configFile, migrationDir, dbPoolName string, steps
return fmt.Errorf("migrations directory not found: %s", migrationDir)
}

// load named-db-pools from config file
if err := lokstra_registry.LoadConfig(cfgFile); err != nil {
if _, err := loader.LoadConfig(cfgFile); err != nil {
return fmt.Errorf("failed to load config file '%s': %w", filepath.Base(cfgFile), err)
}

Expand Down
26 changes: 13 additions & 13 deletions core/deploy/loader/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,10 @@ func RegisterDefinitionsForRuntime(registry *deploy.GlobalRegistry, config *sche
// LoadConfig loads config and builds ALL deployments into Global registry
// Returns error only - deployments are stored in deploy.Global()
func LoadConfig(configPaths ...string) (*schema.DeployConfig, error) {
if len(configPaths) == 0 {
configPaths = []string{"config"}
}

config, err := loadConfig(configPaths...)
if err != nil {
return nil, fmt.Errorf("failed to load config: %w", err)
Expand Down Expand Up @@ -971,23 +975,19 @@ func LoadConfig(configPaths ...string) (*schema.DeployConfig, error) {
registry.StoreDeploymentTopology(deployTopo)
}

// Auto-discover and setup named DB pools
// if err := SetupNamedDbPools(registry, config); err != nil {
// return fmt.Errorf("failed to setup named DB pools: %w", err)
// }

logger.LogDebug("✅ Config loaded successfully from: %v", configPaths)
return config, nil
}

// LoadNamedDbPoolsFromConfig auto-discovers and sets up named DB pools from config
// LoadDbPoolManagerFromConfig auto-discovers and sets up named DB pools from config
// Requires dbpool-manager service to be already registered
func LoadNamedDbPoolsFromConfig() error {
func LoadDbPoolManagerFromConfig() error {
registry := deploy.Global()
config := registry.GetDeployConfig()

// Check if named-db-pools section exists
if len(config.NamedDbPools) == 0 {
// No named-db-pools section, skip
// Check if dbpool-manager section exists
if len(config.DbPoolManager) == 0 {
// No dbpool-manager section, skip
return nil
}

Expand All @@ -1001,7 +1001,7 @@ func LoadNamedDbPoolsFromConfig() error {
}

// Setup each pool
for poolName, poolConfig := range config.NamedDbPools {
for poolName, poolConfig := range config.DbPoolManager {
// Extract DSN or build from components
dsn := poolConfig.DSN

Expand Down Expand Up @@ -1042,7 +1042,7 @@ func LoadNamedDbPoolsFromConfig() error {
password := poolConfig.Password

if host == "" || database == "" {
return fmt.Errorf("named-db-pools.%s: must provide either 'dsn' or 'host'+'database'", poolName)
return fmt.Errorf("dbpool-manager.%s: must provide either 'dsn' or 'host'+'database'", poolName)
}

// Build DSN with best practice defaults
Expand Down Expand Up @@ -1083,7 +1083,7 @@ func LoadNamedDbPoolsFromConfig() error {

// Set DSN and Schema for poolName
// This also auto-registers the pool as a lazy service
dbPoolManager.SetNamedDbPool(poolName, dsn, schema, poolConfig.RlsContext)
dbPoolManager.SetDbPoolManager(poolName, dsn, schema, poolConfig.RlsContext)

logger.LogDebug("✅ Registered DB pool: %s (schema: %s)", poolName, schema)
}
Expand Down
2 changes: 1 addition & 1 deletion core/deploy/loader/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func applyConfigOverrides(config *schema.DeployConfig) {
func mergeConfigs(target, source *schema.DeployConfig) *schema.DeployConfig {
result := &schema.DeployConfig{
Configs: mergeMap(target.Configs, source.Configs),
NamedDbPools: mergeMaps(target.NamedDbPools, source.NamedDbPools),
DbPoolManager: mergeMaps(target.DbPoolManager, source.DbPoolManager),
MiddlewareDefinitions: mergeMaps(target.MiddlewareDefinitions, source.MiddlewareDefinitions),
ServiceDefinitions: mergeMaps(target.ServiceDefinitions, source.ServiceDefinitions),
RouterDefinitions: mergeMaps(target.RouterDefinitions, source.RouterDefinitions), // Renamed from Routers
Expand Down
6 changes: 3 additions & 3 deletions core/deploy/loader/resolver/PROVIDER-REGISTRY.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ configs:
host: "prod-db.example.com"
db:url: "postgresql://localhost:5432/mydb" # Key with colon

named-db-pools:
dbpool-manager:
main:
# Simple config reference (no colons in key)
host: ${@cfg:database.host}
Expand Down Expand Up @@ -232,7 +232,7 @@ configs:
host: "prod-db.example.com"
port: 5432

named-db-pools:
dbpool-manager:
main:
host: ${@cfg:db.host} # → "prod-db.example.com"
port: ${@cfg:db.port} # → 5432
Expand Down Expand Up @@ -502,7 +502,7 @@ configs:
aws:
region: ${AWS_REGION:us-east-1} # @env provider

named-db-pools:
dbpool-manager:
main:
# Mix of providers
host: ${@cfg:db.host} # @cfg provider
Expand Down
2 changes: 1 addition & 1 deletion core/deploy/schema/lokstra.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@
}
}
},
"named-db-pools": {
"dbpool-manager": {
"type": "object",
"description": "Named database pool configurations",
"patternProperties": {
Expand Down
2 changes: 1 addition & 1 deletion core/deploy/schema/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func GetSchemaBytes() []byte {
// This matches the JSON schema and supports multi-file merging
type DeployConfig struct {
Configs map[string]any `yaml:"configs" json:"configs"`
NamedDbPools map[string]*DbPoolConfig `yaml:"named-db-pools,omitempty" json:"named-db-pools,omitempty"`
DbPoolManager map[string]*DbPoolConfig `yaml:"dbpool-manager,omitempty" json:"dbpool-manager,omitempty"`
MiddlewareDefinitions map[string]*MiddlewareDef `yaml:"middleware-definitions,omitempty" json:"middleware-definitions,omitempty"`
ServiceDefinitions map[string]*ServiceDef `yaml:"service-definitions" json:"service-definitions"`
RouterDefinitions map[string]*RouterDef `yaml:"router-definitions,omitempty" json:"router-definitions,omitempty"` // Renamed from Routers
Expand Down
18 changes: 9 additions & 9 deletions dbpool_manager/dbpool_crud.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ func AddDbPool(config DbPoolConfig) error {

// Set the pool configuration (upsert: works for both new and existing pools)
// This also auto-registers the pool as a lazy service
dpm.SetNamedDbPool(config.Name, config.DSN, config.Schema, config.RlsContext)
dpm.SetDbPoolManager(config.Name, config.DSN, config.Schema, config.RlsContext)

// Validate configuration by attempting to get the pool
_, err := dpm.GetNamedDbPool(config.Name)
_, err := dpm.GetDbPoolManager(config.Name)
if err != nil {
// Rollback on validation failure
dpm.RemoveNamedDbPool(config.Name)
dpm.RemoveDbPoolManager(config.Name)
return fmt.Errorf("failed to create pool '%s': %w", config.Name, err)
}

Expand Down Expand Up @@ -75,13 +75,13 @@ func RemoveDbPool(name string) error {
}

// Check if pool exists
_, _, _, err := dpm.GetNamedDbPoolInfo(name)
_, _, _, err := dpm.GetDbPoolManagerInfo(name)
if err != nil {
return fmt.Errorf("pool '%s' not found: %w", name, err)
}

// Remove from manager (also unregisters service automatically)
dpm.RemoveNamedDbPool(name)
dpm.RemoveDbPoolManager(name)

logger.LogInfo("✅ Removed DB pool: %s", name)
return nil
Expand All @@ -98,7 +98,7 @@ func GetDbPoolInfo(name string) (*DbPoolConfig, error) {
return nil, fmt.Errorf("dbpool-manager service not found")
}

dsn, schema, rlsContext, err := dpm.GetNamedDbPoolInfo(name)
dsn, schema, rlsContext, err := dpm.GetDbPoolManagerInfo(name)
if err != nil {
return nil, fmt.Errorf("pool '%s' not found: %w", name, err)
}
Expand All @@ -119,8 +119,8 @@ func ListDbPools() ([]string, error) {
return nil, fmt.Errorf("dbpool-manager service not found")
}

// Use GetAllNamedDbPools from DbPoolManager interface
allPools := dpm.GetAllNamedDbPools()
// Use GetAllDbPoolManager from DbPoolManager interface
allPools := dpm.GetAllDbPoolManager()
if allPools == nil {
return []string{}, nil
}
Expand All @@ -144,7 +144,7 @@ func GetDbPool(name string) (serviceapi.DbPool, error) {
return nil, fmt.Errorf("dbpool-manager service not found")
}

return dpm.GetNamedDbPool(name)
return dpm.GetDbPoolManager(name)
}

// AcquireDbConn acquires a connection from a named pool
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"github.com/primadi/lokstra/common/logger"
"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_init"
"github.com/primadi/lokstra/lokstra_registry"
)
Expand All @@ -18,7 +19,9 @@ func main() {

logger.SetLogLevelFromEnv()

lokstra_registry.LoadConfig("config")
if _, err := loader.LoadConfig("config"); err != nil {
panic(err)
}

dsn := lokstra_registry.GetConfig("db_main.dsn", "")
schema := lokstra_registry.GetConfig("db_main.schema", "public")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"github.com/primadi/lokstra/common/logger"
"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_registry"
)

Expand All @@ -23,7 +24,7 @@ func main() {
registerMiddlewareTypes()

// 3. RunServerFromConfig
if err := lokstra_registry.LoadConfig(); err != nil {
if _, err := loader.LoadConfig(); err != nil {
logger.LogPanic("❌ Failed to load config:", err)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/primadi/lokstra/common/logger"
"github.com/primadi/lokstra/core/deploy"
"github.com/primadi/lokstra/core/deploy/loader"
svc "github.com/primadi/lokstra/docs/00-introduction/examples/full-framework/04-external-services/service"
"github.com/primadi/lokstra/lokstra_registry"
)
Expand Down Expand Up @@ -33,7 +34,7 @@ func main() {

printStartInfo()

if err := lokstra_registry.LoadConfig(); err != nil {
if _, err := loader.LoadConfig(); err != nil {
logger.LogPanic("❌ Failed to load config:", err)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"github.com/primadi/lokstra/common/logger"
"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_registry"
)

Expand All @@ -12,7 +13,7 @@ func main() {
// Get config path
// configPath := filepath.Join("docs", "00-introduction", "examples", "full-framework", "06-inline-definitions-example", "config.yaml")

if err := lokstra_registry.LoadConfig(); err != nil {
if _, err := loader.LoadConfig(); err != nil {
logger.LogPanic("❌ Failed to load config:", err)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"log"

"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_init"
"github.com/primadi/lokstra/lokstra_registry"
"github.com/primadi/lokstra/middleware/recovery"
Expand All @@ -13,7 +14,7 @@ func main() {
lokstra_init.Bootstrap()

// STEP 1: Load Config
if err := lokstra_registry.LoadConfig("config.yaml"); err != nil {
if _, err := loader.LoadConfig("config.yaml"); err != nil {
log.Fatal("Failed to load config:", err)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package main

import (
"github.com/primadi/lokstra/common/logger"
"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_init"
"github.com/primadi/lokstra/lokstra_registry"
)

func main() {
lokstra_init.Bootstrap()

if err := lokstra_registry.LoadConfig(
if _, err := loader.LoadConfig(
"config/base.yaml",
"config/dev.yaml", // or production.yaml for prod
); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"log"

"github.com/primadi/lokstra/core/deploy/loader"
"github.com/primadi/lokstra/lokstra_init"
"github.com/primadi/lokstra/lokstra_registry"
"github.com/primadi/lokstra/middleware/recovery"
Expand All @@ -12,7 +13,7 @@ func main() {
lokstra_init.Bootstrap()

// STEP 1: Load Config
if err := lokstra_registry.LoadConfig("config.yaml"); err != nil {
if _, err := loader.LoadConfig("config.yaml"); err != nil {
log.Fatal("Failed to load config:", err)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Demonstrates configuring multiple named database pools with different settings.

#### Option 1: Component-Based
```yaml
named-db-pools:
dbpool-manager:
main-db:
host: "localhost"
port: 5432
Expand All @@ -35,7 +35,7 @@ named-db-pools:

#### Option 2: DSN-Based
```yaml
named-db-pools:
dbpool-manager:
analytics-db:
dsn: "postgres://user:pass@host:5432/db?sslmode=require"
schema: "analytics"
Expand Down Expand Up @@ -227,7 +227,7 @@ sslmode: "require" # or verify-full
### 4. Environment Variables

```yaml
named-db-pools:
dbpool-manager:
main-db:
host: "${DB_HOST}"
port: 5432
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ configs:
name: "DatabaseApp"

# Named database pool configurations
named-db-pools:
dbpool-manager:
# Main application database
main-db:
host: "localhost"
Expand Down
2 changes: 1 addition & 1 deletion docs/02-framework-guide/04-config/examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Recommended order:
### Configuration Hierarchy
```
configs # Global config values
named-db-pools # Database pool definitions
dbpool-manager # Database pool definitions
middleware-definitions # Middleware instances
service-definitions # Service instances
router-definitions # Router configurations
Expand Down
6 changes: 3 additions & 3 deletions docs/02-framework-guide/04-config/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ configs:
dsn: "postgres://localhost/mydb"

# Named database pools
named-db-pools:
dbpool-manager:
main-db:
dsn: "postgres://localhost:5432/mydb"
schema: "public"
Expand Down Expand Up @@ -205,7 +205,7 @@ Reference: `${app.name}`, `${database.host}`

### Named DB Pools
```yaml
named-db-pools:
dbpool-manager:
main-db:
host: "localhost"
port: 5432
Expand All @@ -222,7 +222,7 @@ named-db-pools:

Or use DSN directly:
```yaml
named-db-pools:
dbpool-manager:
main-db:
dsn: "postgres://user:pass@localhost:5432/mydb"
schema: "public"
Expand Down
Loading