package database import ( domainSite "RenewCMS/internal/domain/site" entity "RenewCMS/internal/infrastructure/persistence/models" "fmt" "gorm.io/gorm" ) func SeedDefaultSite(db *gorm.DB, publicURL string) error { return db.Transaction(func(tx *gorm.DB) error { defaultSite, err := ensureDefaultSite(tx, publicURL) if err != nil { return err } return tx.Unscoped().Model(&entity.Article{}).Where("site_id IS NULL OR site_id = 0").UpdateColumn("site_id", defaultSite.ID).Error }) } func ensureDefaultSite(tx *gorm.DB, publicURL string) (entity.Site, error) { var total int64 if err := tx.Model(&entity.Site{}).Count(&total).Error; err != nil { return entity.Site{}, err } if total > 0 { return firstDefaultSite(tx) } baseURL, err := domainSite.SeedBaseURL(publicURL) if err != nil { return entity.Site{}, fmt.Errorf("PUBLIC_URL %q cannot seed the first site: %w", publicURL, err) } seeded := entity.Site{ Name: domainSite.DefaultName, Key: domainSite.DefaultKey, BaseURL: baseURL, DefaultRobots: domainSite.RobotsIndex, IsDefault: true, TitleTemplate: domainSite.DefaultTitleTemplate, } if err := tx.Create(&seeded).Error; err != nil { return entity.Site{}, err } return seeded, nil } func firstDefaultSite(tx *gorm.DB) (entity.Site, error) { var found entity.Site if err := tx.Order("is_default DESC, id ASC").First(&found).Error; err != nil { return entity.Site{}, err } return found, nil } func BackfillSiteTitleTemplates(db *gorm.DB) error { return db.Model(&entity.Site{}).Where("title_template IS NULL OR title_template = ''").UpdateColumn("title_template", domainSite.DefaultTitleTemplate).Error }