89 lines
2.8 KiB
Go
89 lines
2.8 KiB
Go
package persistence
|
|
|
|
import (
|
|
domain "RenewCMS/internal/domain/language"
|
|
"RenewCMS/internal/infrastructure/persistence/mappers"
|
|
entity "RenewCMS/internal/infrastructure/persistence/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SiteLanguageRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewSiteLanguageRepository(db *gorm.DB) *SiteLanguageRepository {
|
|
return &SiteLanguageRepository{db}
|
|
}
|
|
|
|
func (s *SiteLanguageRepository) ListBySite(siteID uint32) ([]domain.SiteLanguage, error) {
|
|
var found []entity.SiteLanguage
|
|
if err := s.db.Where("site_id = ?", siteID).Order("is_default DESC, lang ASC").Find(&found).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
languages := make([]domain.SiteLanguage, 0, len(found))
|
|
for _, row := range found {
|
|
languages = append(languages, mappers.SiteLanguageToDomain(row))
|
|
}
|
|
return languages, nil
|
|
}
|
|
|
|
func (s *SiteLanguageRepository) LockStartingLanguage(siteID uint32) (string, error) {
|
|
if _, err := lockSite(s.db, siteID); err != nil {
|
|
return "", err
|
|
}
|
|
defaultLanguage, found, err := findDefaultLanguage(s.db, siteID)
|
|
if err != nil || !found || !defaultLanguage.Confirmed {
|
|
return domain.Unassigned, err
|
|
}
|
|
return defaultLanguage.Lang, nil
|
|
}
|
|
|
|
func (s *SiteLanguageRepository) ConfirmDefault(siteID uint32) error {
|
|
return s.db.Transaction(func(tx *gorm.DB) error {
|
|
if _, err := lockSite(tx, siteID); err != nil {
|
|
return err
|
|
}
|
|
defaultLanguage, err := requireDefaultLanguage(tx, siteID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if defaultLanguage.Confirmed {
|
|
return nil
|
|
}
|
|
if err := markConfirmed(tx, defaultLanguage); err != nil {
|
|
return err
|
|
}
|
|
return assignUnassignedArticles(tx, defaultLanguage)
|
|
})
|
|
}
|
|
|
|
func findDefaultLanguage(db *gorm.DB, siteID uint32) (entity.SiteLanguage, bool, error) {
|
|
var defaults []entity.SiteLanguage
|
|
if err := db.Where("site_id = ? AND is_default = ?", siteID, true).Limit(1).Find(&defaults).Error; err != nil || len(defaults) == 0 {
|
|
return entity.SiteLanguage{}, false, err
|
|
}
|
|
return defaults[0], true, nil
|
|
}
|
|
|
|
func requireDefaultLanguage(db *gorm.DB, siteID uint32) (entity.SiteLanguage, error) {
|
|
defaultLanguage, found, err := findDefaultLanguage(db, siteID)
|
|
if err != nil {
|
|
return entity.SiteLanguage{}, err
|
|
}
|
|
if !found {
|
|
return entity.SiteLanguage{}, domain.ErrNoDefaultLanguage
|
|
}
|
|
return defaultLanguage, nil
|
|
}
|
|
|
|
func markConfirmed(tx *gorm.DB, defaultLanguage entity.SiteLanguage) error {
|
|
return tx.Model(&entity.SiteLanguage{}).Where("site_id = ? AND lang = ?", defaultLanguage.SiteID, defaultLanguage.Lang).UpdateColumn("confirmed", true).Error
|
|
}
|
|
|
|
func assignUnassignedArticles(tx *gorm.DB, defaultLanguage entity.SiteLanguage) error {
|
|
return tx.Unscoped().Model(&entity.Article{}).Where("site_id = ? AND lang = ?", defaultLanguage.SiteID, domain.Unassigned).UpdateColumn("lang", defaultLanguage.Lang).Error
|
|
}
|
|
|
|
var _ domain.Repository = &SiteLanguageRepository{}
|