| 197 | } |
| 198 | |
| 199 | func DeleteTaskPluginVersion(key, version string) (TaskPluginDeleteResult, error) { |
| 200 | result := TaskPluginDeleteResult{} |
| 201 | err := DB.Transaction(func(tx *gorm.DB) error { |
| 202 | var plugin TaskPlugin |
| 203 | if err := lockForUpdate(tx).Where(&TaskPlugin{Key: key, Version: version}).First(&plugin).Error; err != nil { |
| 204 | return err |
| 205 | } |
| 206 | result.DeletedActive = plugin.Active |
| 207 | if err := tx.Delete(&plugin).Error; err != nil { |
| 208 | return err |
| 209 | } |
| 210 | if !plugin.Active { |
| 211 | return nil |
| 212 | } |
| 213 | |
| 214 | var promoted TaskPlugin |
| 215 | err := lockForUpdate(tx). |
| 216 | Where(&TaskPlugin{Key: key}). |
| 217 | Order("created_at DESC, id DESC"). |
| 218 | First(&promoted).Error |
| 219 | if errors.Is(err, gorm.ErrRecordNotFound) { |
| 220 | return nil |
| 221 | } |
| 222 | if err != nil { |
| 223 | return err |
| 224 | } |
| 225 | if err = tx.Model(&promoted).Update("active", true).Error; err != nil { |
| 226 | return err |
| 227 | } |
| 228 | promoted.Active = true |
| 229 | result.Promoted = &promoted |
| 230 | return nil |
| 231 | }) |
| 232 | return result, err |
| 233 | } |