{ "Database": { "DataSources": { "AppDatabase": { "Write": "Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50", "Reads": [ "Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50" ], "CommandTimeoutSeconds": 30, "MaxRetryCount": 3, "MaxRetryDelaySeconds": 5 }, "IdentityDatabase": { "Write": "Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50", "Reads": [ "Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50" ], "CommandTimeoutSeconds": 30, "MaxRetryCount": 3, "MaxRetryDelaySeconds": 5 } } }, "Redis": "localhost:6379,abortConnect=false", "Identity": { "Jwt": { "Issuer": "takeout-saas", "Audience": "takeout-saas-clients", "Secret": "ReplaceWithA32CharLongSecretKey_____", "AccessTokenExpirationMinutes": 120, "RefreshTokenExpirationMinutes": 10080 }, "LoginRateLimit": { "WindowSeconds": 60, "MaxAttempts": 5 }, "RefreshTokenStore": { "Prefix": "identity:refresh:" } }, "Dictionary": { "Cache": { "SlidingExpiration": "00:30:00" } }, "Tenancy": { "TenantIdHeaderName": "X-Tenant-Id", "TenantCodeHeaderName": "X-Tenant-Code", "IgnoredPaths": [ "/health" ], "RootDomain": "" } }