()
| 315 | var fixLock = sync.Mutex{} |
| 316 | |
| 317 | func FixAbility() (int, int, error) { |
| 318 | lock := fixLock.TryLock() |
| 319 | if !lock { |
| 320 | return 0, 0, errors.New("已经有一个修复任务在运行中,请稍后再试") |
| 321 | } |
| 322 | defer fixLock.Unlock() |
| 323 | var channels []*Channel |
| 324 | // Find all channels |
| 325 | err := DB.Model(&Channel{}).Find(&channels).Error |
| 326 | if err != nil { |
| 327 | return 0, 0, err |
| 328 | } |
| 329 | if len(channels) == 0 { |
| 330 | return 0, 0, nil |
| 331 | } |
| 332 | successCount := 0 |
| 333 | failCount := 0 |
| 334 | for _, chunk := range lo.Chunk(channels, 50) { |
| 335 | ids := lo.Map(chunk, func(c *Channel, _ int) int { return c.Id }) |
| 336 | // Delete all abilities of this channel |
| 337 | err = DB.Where("channel_id IN ?", ids).Delete(&Ability{}).Error |
| 338 | if err != nil { |
| 339 | common.SysError(fmt.Sprintf("Delete abilities failed: %s", err.Error())) |
| 340 | failCount += len(chunk) |
| 341 | continue |
| 342 | } |
| 343 | // Then add new abilities |
| 344 | for _, channel := range chunk { |
| 345 | err = channel.AddAbilities() |
| 346 | if err != nil { |
| 347 | common.SysError(fmt.Sprintf("Add abilities for channel %d failed: %s", channel.Id, err.Error())) |
| 348 | failCount++ |
| 349 | } else { |
| 350 | successCount++ |
| 351 | } |
| 352 | } |
| 353 | } |
| 354 | InitChannelCache() |
| 355 | return successCount, failCount, nil |
| 356 | } |
no test coverage detected