Files
RenewCMS/internal/infrastructure/persistence/repositories/imageVariantRepository.go
T
2026-10-08 02:33:32 +02:00

66 lines
2.0 KiB
Go

package persistence
import (
domain "RenewCMS/internal/domain/image"
"RenewCMS/internal/infrastructure/persistence/mappers"
entity "RenewCMS/internal/infrastructure/persistence/models"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type VariantRepository struct {
db *gorm.DB
}
var _ domain.VariantRepository = &VariantRepository{}
func NewVariantRepository(db *gorm.DB) *VariantRepository {
return &VariantRepository{db}
}
func (v *VariantRepository) List() ([]domain.Variant, error) {
var found []entity.ImageVariant
if err := v.db.Order("name asc").Find(&found).Error; err != nil {
return nil, err
}
variants := make([]domain.Variant, 0, len(found))
for _, model := range found {
variants = append(variants, mappers.VariantToDomain(model))
}
return variants, nil
}
func (v *VariantRepository) Get(name string) (domain.Variant, error) {
var model entity.ImageVariant
if err := v.db.Where("name = ?", name).First(&model).Error; err != nil {
return domain.Variant{}, mapNotFoundErr(err, domain.ErrVariantNotFound)
}
return mappers.VariantToDomain(model), nil
}
func (v *VariantRepository) Create(variant domain.Variant) (domain.Variant, error) {
model := mappers.VariantToModel(variant)
result := v.db.Clauses(clause.OnConflict{DoNothing: true}).Create(&model)
if result.Error != nil {
return domain.Variant{}, result.Error
}
if result.RowsAffected == 0 {
return domain.Variant{}, domain.ErrVariantExists
}
return mappers.VariantToDomain(model), nil
}
func (v *VariantRepository) Update(variant domain.Variant) (domain.Variant, error) {
model := mappers.VariantToModel(variant)
result := v.db.Model(&entity.ImageVariant{}).Where("name = ?", model.Name).Select("*").Omit("name", "created_at").UpdateColumns(&model)
if err := deleteOrNotFound(result, domain.ErrVariantNotFound); err != nil {
return domain.Variant{}, err
}
return v.Get(variant.Name)
}
func (v *VariantRepository) Delete(name string) error {
return deleteOrNotFound(v.db.Where("name = ?", name).Delete(&entity.ImageVariant{}), domain.ErrVariantNotFound)
}