53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
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,
|
|
}
|
|
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
|
|
}
|