package config import ( "errors" "fmt" "strings" ) func Validate(c *Config) error { var problems []string if c.Domain == "" { problems = append(problems, "DOMAIN is required") } if c.Port <= 0 || c.Port > 65535 { problems = append(problems, "PORT must be 1-65535") } if c.AdminAPIKey == "" || c.AdminAPIKey == "change-me-to-a-long-random-string" { problems = append(problems, "ADMIN_API_KEY must be set to a non-default value") } else if len(c.AdminAPIKey) < 24 { problems = append(problems, "ADMIN_API_KEY must be at least 24 characters") } if c.DatabasePath == "" { problems = append(problems, "DATABASE_PATH is required") } if c.Lightning.Enabled { if c.Lightning.LNbitsURL == "" { problems = append(problems, "LNBITS_URL is required when LIGHTNING_ENABLED=true") } else if !strings.HasPrefix(c.Lightning.LNbitsURL, "http://") && !strings.HasPrefix(c.Lightning.LNbitsURL, "https://") { problems = append(problems, "LNBITS_URL must start with http:// or https://") } if c.Lightning.LNbitsInvoiceKey == "" { problems = append(problems, "LNBITS_INVOICE_KEY is required when LIGHTNING_ENABLED=true") } if c.Lightning.PriceYearlySats <= 0 { problems = append(problems, "PRICE_YEARLY_SATS must be > 0") } if c.Lightning.PriceLifetimeSats <= 0 { problems = append(problems, "PRICE_LIFETIME_SATS must be > 0") } if c.Lightning.InvoiceExpiryMins <= 0 { problems = append(problems, "INVOICE_EXPIRY_MINUTES must be > 0") } } if c.DM.Enabled { if c.DM.Nsec == "" { problems = append(problems, "DM_NSEC is required when DM_ENABLED=true") } if c.DM.Kind != 4 && c.DM.Kind != 1059 { problems = append(problems, "DM_KIND must be 4 or 1059") } } if (c.Nostr.UsernameSyncEnabled || c.DM.Enabled) && len(c.Nostr.Relays) == 0 { problems = append(problems, "RELAYS is required when sync or DM is enabled") } for _, r := range c.Nostr.Relays { if !strings.HasPrefix(r, "ws://") && !strings.HasPrefix(r, "wss://") { problems = append(problems, "RELAYS entry must be ws:// or wss://, got "+r) } } if c.Webhook.URL != "" { if !strings.HasPrefix(c.Webhook.URL, "http://") && !strings.HasPrefix(c.Webhook.URL, "https://") { problems = append(problems, "WEBHOOK_URL must start with http:// or https://") } } if c.Expiry.GraceDays < 0 { problems = append(problems, "USERNAME_GRACE_DAYS must be >= 0") } if c.Expiry.CronHourUTC < 0 || c.Expiry.CronHourUTC > 23 { problems = append(problems, "EXPIRY_CRON_HOUR_UTC must be 0-23") } if len(problems) > 0 { return fmt.Errorf("invalid config:\n - %s", strings.Join(problems, "\n - ")) } return nil } var ErrInvalidConfig = errors.New("invalid config")