123 lines
2.9 KiB
Go
123 lines
2.9 KiB
Go
package migrasyon
|
||
|
||
import (
|
||
configs "goFiber/config"
|
||
database "goFiber/database/config"
|
||
"goFiber/database/models"
|
||
"log"
|
||
"net/url"
|
||
"strings"
|
||
)
|
||
|
||
// Only run AutoMigrate if DB is initialized
|
||
|
||
func Migrate() {
|
||
if database.DB != nil {
|
||
if err := database.DB.AutoMigrate(
|
||
&models.User{},
|
||
&models.SocialAccount{},
|
||
&models.Profile{},
|
||
&models.Hero{},
|
||
&models.Setting{},
|
||
&models.CorsWhitelist{},
|
||
&models.CorsBlacklist{},
|
||
&models.RateLimitSetting{},
|
||
&models.Category{},
|
||
&models.Tag{},
|
||
&models.Post{},
|
||
&models.CategoryView{},
|
||
&models.Comment{},
|
||
); err != nil {
|
||
log.Printf("AutoMigrate Yapılamadı !!: %v", err)
|
||
}
|
||
seedSecurityDefaults()
|
||
log.Println("AutoMigrate Yapıldı.")
|
||
} else {
|
||
log.Println("DB not initialized: skipping AutoMigrate")
|
||
}
|
||
}
|
||
|
||
func seedSecurityDefaults() {
|
||
seedRateLimit("register", "Register endpoint default rate limit", 5, 60)
|
||
seedRateLimit("login", "Login endpoint default rate limit", 10, 60)
|
||
|
||
for _, origin := range defaultWhitelistOrigins() {
|
||
seedCorsWhitelist(origin, "default seeded whitelist")
|
||
}
|
||
}
|
||
|
||
func seedRateLimit(name, description string, maxRequests int64, windowSeconds int) {
|
||
var existing models.RateLimitSetting
|
||
if err := database.DB.Where("name = ?", name).First(&existing).Error; err == nil {
|
||
return
|
||
}
|
||
|
||
item := models.RateLimitSetting{
|
||
Name: name,
|
||
Description: description,
|
||
MaxRequests: maxRequests,
|
||
WindowSeconds: windowSeconds,
|
||
IsActive: true,
|
||
UpdatedBy: "seed",
|
||
}
|
||
if err := database.DB.Create(&item).Error; err != nil {
|
||
log.Printf("RateLimit seed failed (%s): %v", name, err)
|
||
return
|
||
}
|
||
log.Printf("RateLimit seed created: name=%s max=%d window=%ds", name, maxRequests, windowSeconds)
|
||
}
|
||
|
||
func seedCorsWhitelist(origin, description string) {
|
||
origin = strings.TrimSpace(origin)
|
||
if origin == "" {
|
||
return
|
||
}
|
||
|
||
var existing models.CorsWhitelist
|
||
if err := database.DB.Where("origin = ?", origin).First(&existing).Error; err == nil {
|
||
return
|
||
}
|
||
|
||
item := models.CorsWhitelist{
|
||
Origin: origin,
|
||
Description: description,
|
||
IsActive: true,
|
||
CreatedBy: "seed",
|
||
}
|
||
if err := database.DB.Create(&item).Error; err != nil {
|
||
log.Printf("CorsWhitelist seed failed (%s): %v", origin, err)
|
||
return
|
||
}
|
||
log.Printf("CorsWhitelist seed created: origin=%s", origin)
|
||
}
|
||
|
||
func defaultWhitelistOrigins() []string {
|
||
origins := []string{
|
||
"http://localhost:3000",
|
||
"http://localhost:5173",
|
||
"http://localhost:8080",
|
||
}
|
||
|
||
appURL := strings.TrimSpace(configs.AppConfig.AppURL)
|
||
if appURL != "" {
|
||
if parsed, err := url.Parse(appURL); err == nil && parsed.Scheme != "" && parsed.Host != "" {
|
||
origins = append(origins, parsed.Scheme+"://"+parsed.Host)
|
||
}
|
||
}
|
||
|
||
uniq := make(map[string]struct{})
|
||
out := make([]string, 0, len(origins))
|
||
for _, origin := range origins {
|
||
origin = strings.TrimSpace(origin)
|
||
if origin == "" {
|
||
continue
|
||
}
|
||
if _, ok := uniq[origin]; ok {
|
||
continue
|
||
}
|
||
uniq[origin] = struct{}{}
|
||
out = append(out, origin)
|
||
}
|
||
return out
|
||
}
|