70 lines
1.7 KiB
Go

package newsrepository
import (
"fmt"
categorydomain "legalgo-BE-go/internal/domain/category"
newsdomain "legalgo-BE-go/internal/domain/news"
tagdomain "legalgo-BE-go/internal/domain/tag"
"gorm.io/gorm/clause"
)
func (a *accessor) Update(spec newsdomain.News) error {
tx := a.db.Begin()
if err := tx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{
"title",
"content",
"featured_image",
"is_premium",
"slug",
"author_id",
"live_at",
"updated_at",
}),
}).Select(
"title",
"content",
"featured_image",
"is_premium",
"slug",
"author_id",
"live_at",
"updated_at",
).Save(&spec).Error; err != nil {
tx.Rollback()
return fmt.Errorf("failed to update news: %v", err)
}
tagsDeleted := make([]tagdomain.Tag, len(spec.Tags))
copy(tagsDeleted, spec.Tags)
if err := tx.Model(&spec).Association("Tags").Clear(); err != nil {
tx.Rollback()
return fmt.Errorf("failed to remove previous tags: %v", err)
}
if err := tx.Model(&spec).Association("Tags").Append(tagsDeleted); err != nil {
tx.Rollback()
return fmt.Errorf("failed to add tags: %v", err)
}
categoriesDeleted := make([]categorydomain.Category, len(spec.Categories))
copy(categoriesDeleted, spec.Categories)
if err := tx.Model(&spec).Association("Categories").Clear(); err != nil {
tx.Rollback()
return fmt.Errorf("failed to remove previous categories: %v", err)
}
if err := tx.Model(&spec).Association("Categories").Append(categoriesDeleted); err != nil {
tx.Rollback()
return fmt.Errorf("failed to add categories: %v", err)
}
if err := tx.Commit().Error; err != nil {
return fmt.Errorf("failed to commit transaction: %v", err)
}
return nil
}