75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
Server ServerConfig `mapstructure:"server"`
|
|
Database DatabaseConfig `mapstructure:"database"`
|
|
Storage StorageConfig `mapstructure:"storage"`
|
|
JWT JWTConfig `mapstructure:"jwt"`
|
|
}
|
|
|
|
type ServerConfig struct {
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
}
|
|
|
|
type DatabaseConfig struct {
|
|
Driver string `mapstructure:"driver"`
|
|
Path string `mapstructure:"path"`
|
|
}
|
|
|
|
type StorageConfig struct {
|
|
Driver string `mapstructure:"driver"`
|
|
Local LocalStorageConfig `mapstructure:"local"`
|
|
}
|
|
|
|
type LocalStorageConfig struct {
|
|
Path string `mapstructure:"path"`
|
|
}
|
|
|
|
type JWTConfig struct {
|
|
Secret string `mapstructure:"secret"`
|
|
AccessTTL time.Duration `mapstructure:"access_ttl"`
|
|
RefreshTTL time.Duration `mapstructure:"refresh_ttl"`
|
|
}
|
|
|
|
func (c *Config) Validate() error {
|
|
var errs []error
|
|
|
|
if c.Server.Port < 1 || c.Server.Port > 65535 {
|
|
errs = append(errs, fmt.Errorf("server.port: %d out of range [1, 65535]", c.Server.Port))
|
|
}
|
|
|
|
if addr := net.ParseIP(c.Server.Host); c.Server.Host != "" && addr == nil {
|
|
errs = append(errs, fmt.Errorf("server.host: %q is not a valid IP address", c.Server.Host))
|
|
}
|
|
|
|
if c.Database.Path == "" {
|
|
errs = append(errs, errors.New("database.path: must not be empty"))
|
|
}
|
|
|
|
if c.Storage.Local.Path == "" {
|
|
errs = append(errs, errors.New("storage.local.path: must not be empty"))
|
|
}
|
|
|
|
if c.JWT.Secret == "" {
|
|
errs = append(errs, errors.New("jwt.secret: must not be empty"))
|
|
}
|
|
|
|
if c.JWT.AccessTTL <= 0 {
|
|
errs = append(errs, fmt.Errorf("jwt.access_ttl: %v must be positive", c.JWT.AccessTTL))
|
|
}
|
|
|
|
if c.JWT.RefreshTTL <= 0 {
|
|
errs = append(errs, fmt.Errorf("jwt.refresh_ttl: %v must be positive", c.JWT.RefreshTTL))
|
|
}
|
|
|
|
return errors.Join(errs...)
|
|
}
|