79 lines
2.6 KiB
Go
79 lines
2.6 KiB
Go
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")
|