diff --git a/go/internal/database/service.go b/go/internal/database/service.go index d8617b876..9c4c843b0 100644 --- a/go/internal/database/service.go +++ b/go/internal/database/service.go @@ -4,6 +4,7 @@ import ( "fmt" "gorm.io/gorm" + "gorm.io/gorm/clause" ) type Model interface { @@ -45,16 +46,15 @@ func get[T Model](db *gorm.DB, clauses ...Clause) (*T, error) { return &model, nil } -// TODO: Make this upsert actually idempotent +// save performs an upsert operation (INSERT ON CONFLICT DO UPDATE) // args: // - db: the database connection // - model: the model to save func save[T Model](db *gorm.DB, model *T) error { - if err := db.Create(model).Error; err != nil { - if err == gorm.ErrDuplicatedKey { - return db.Save(model).Error - } - return fmt.Errorf("failed to create model: %w", err) + if err := db.Clauses(clause.OnConflict{ + UpdateAll: true, + }).Create(model).Error; err != nil { + return fmt.Errorf("failed to upsert model: %w", err) } return nil }