From cfa8164f2468ea5a63b4cce2edb01957846b2b12 Mon Sep 17 00:00:00 2001 From: Bobby Date: Mon, 16 Jun 2025 06:06:02 +0530 Subject: moved app secret, dev mode to server config. added min password length --- config/config.go | 20 +++++++------------- config/types.go | 11 +++++++---- database/database.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ imageboard/main.go | 6 +++--- 4 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 database/database.go diff --git a/config/config.go b/config/config.go index ce2dd8b..a7831f2 100644 --- a/config/config.go +++ b/config/config.go @@ -7,14 +7,12 @@ import ( ) var ( - AppSecret string = "default_secret" - Database DatabaseConfig - IsDevelopmentMode bool = true - Image ImageConfig - S3 S3Config - Server ServerConfig - Session SessionConfig - SMTP SMTPConfig + Database DatabaseConfig + Upload UploadConfig + S3 S3Config + Server ServerConfig + Session SessionConfig + SMTP SMTPConfig ) func init() { @@ -22,15 +20,11 @@ func init() { log.Println("no .env file found, using environment variables") } - AppSecret = getEnv("APP_SECRET", AppSecret) - if err := Parse(&Database); err != nil { log.Fatalf("failed to parse configuration: %v", err) } - IsDevelopmentMode = getEnvBool("DEV_MODE", IsDevelopmentMode) - - if err := Parse(&Image); err != nil { + if err := Parse(&Upload); err != nil { log.Fatalf("failed to parse configuration: %v", err) } diff --git a/config/types.go b/config/types.go index 075b728..fc4ad3c 100644 --- a/config/types.go +++ b/config/types.go @@ -3,9 +3,12 @@ package config import "time" type ServerConfig struct { - Host string `env:"SERVER_HOST" default:"localhost"` - Port int `env:"SERVER_PORT" default:"8080"` - AppName string `env:"APP_NAME" default:"ImageBoard"` + Host string `env:"SERVER_HOST" default:"localhost"` + Port int `env:"SERVER_PORT" default:"8080"` + AppName string `env:"APP_NAME" default:"ImageBoard"` + AppSecret string `env:"APP_SECRET" default:"default_secret"` + IsDevMode bool `env:"DEV_MODE" default:"true"` + MinPasswordLength int `env:"MIN_PASSWORD_LENGTH" default:"8"` } type DatabaseConfig struct { @@ -26,7 +29,7 @@ type SessionConfig struct { CookieSameSite string `env:"SESSION_COOKIE_SAMESITE" default:"Lax"` } -type ImageConfig struct { +type UploadConfig struct { MaxSize int `env:"IMAGE_MAX_SIZE" default:"10485760"` AllowedTypes string `env:"IMAGE_ALLOWED_TYPES" default:"image/jpeg,image/png,image/gif,image/webp"` } diff --git a/database/database.go b/database/database.go new file mode 100644 index 0000000..d063cfc --- /dev/null +++ b/database/database.go @@ -0,0 +1,49 @@ +package database + +import ( + "fmt" + "imageboard/config" + "log" + + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var ( + DB *gorm.DB + err error +) + +func init() { + dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s", + config.Database.Host, + config.Database.Username, + config.Database.Password, + config.Database.DatabaseName, + config.Database.Port, + config.Database.SSLMode, + ) + + logLevel := logger.Silent + if config.Server.IsDevMode { + logLevel = logger.Info + } + + DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ + Logger: logger.Default.LogMode(logLevel), + }) + if err != nil { + log.Fatalf("failed to connect to database: %v", err) + } + + if err := autoMigrate(); err != nil { + log.Fatalf("failed to auto migrate database: %v", err) + } + + log.Println("Database connection established successfully") +} + +func autoMigrate() error { + return DB.AutoMigrate() +} diff --git a/imageboard/main.go b/imageboard/main.go index d5a3c88..49eda9c 100644 --- a/imageboard/main.go +++ b/imageboard/main.go @@ -17,19 +17,19 @@ import ( ) func main() { - if config.AppSecret == "default_secret" { + if config.Server.AppSecret == "default_secret" { log.Println("Warning: AppSecret is set to a default value which is not secure. Please set a strong random secret in your APP_SECRET environment variable or .env file.") } engine := html.New("./templates", ".html") - engine.Reload(config.IsDevelopmentMode) + engine.Reload(config.Server.IsDevMode) app := fiber.New(fiber.Config{ Views: engine, ErrorHandler: func(ctx *fiber.Ctx, err error) error { log.Printf("Error: %v", err) return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") }, - BodyLimit: config.Image.MaxSize, + BodyLimit: config.Upload.MaxSize, }) app.Use(recover.New()) -- cgit v1.2.3