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