66 lines
2.0 KiB
Go
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)
|
|
}
|