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{}