spider-scheduler/pkg/task/user.go

102 lines
2.9 KiB
Go
Raw Permalink Normal View History

package task
import (
2023-04-09 13:35:34 +08:00
"github.com/furryboard/spider-scheduler/pkg/dao"
"github.com/furryboard/spider-scheduler/pkg/dao/model"
"github.com/furryboard/spider-scheduler/pkg/exception"
"github.com/furryboard/spider-scheduler/pkg/log"
"github.com/furryboard/spider-scheduler/pkg/logic"
"math"
"time"
)
// UpdateUserInfo 更新数据库内用户信息
// 会对原始表进行更改并将更改记录写入changelogs
func UpdateUserInfo() {
// 预查询数量
// TODO: 预查询数量和分页策略功能可复用
var count int64
tx := dao.DB().Model(&model.Furry{}).Count(&count)
if tx.Error != nil {
err := exception.ErrFetchFurries("获取furries数量失败" + tx.Error.Error())
log.Logger().Errorf("获取furries数量失败%s", err)
return
}
2023-04-09 13:35:34 +08:00
pageSize := 1
maxPage := int(math.Ceil(float64(count) / float64(pageSize)))
for page := 0; page <= maxPage; page++ {
// 获取目标用户列表(分页)
users, err := logic.GetValidUsers(page, pageSize)
if err != nil {
log.Logger().Errorf("获取用户列表时发生错误:%s", err)
continue
}
// 已获取完毕
if users == nil {
return
}
// 抽取uid列表
var uids []uint
for _, user := range users {
uids = append(uids, user.UID)
}
// 通过API获取用户信息
infos := logic.BatchGetUserInfo(&uids)
// 检查更新内容更新furries表插入changelogs使用事务
c, err := logic.UpdateUserInfo(users, infos)
if err != nil {
log.Logger().Errorf("更新数据时发生错误:%s", err)
continue
}
log.Logger().Infof("成功更新了%d个用户信息", c)
// delay
time.Sleep(2 * time.Second)
}
}
// UpdateFans 更新粉丝数,将记录写入表中,增量记录
func UpdateFans() {
// TODO: 与UpdateUserInfo有大量重复可抽离复用代码
// 预查询数量
var count int64
2023-04-09 13:35:34 +08:00
//tx := dao.DB().Model(&model.Furry{}).Where("status = 0").Count(&count)
tx := dao.DB().Model(&model.Furry{}).Count(&count)
if tx.Error != nil {
err := exception.ErrFetchFurries("获取furries数量失败" + tx.Error.Error())
log.Logger().Errorf("获取furries数量失败%s", err)
return
}
pageSize := 4
maxPage := int(math.Ceil(float64(count) / float64(pageSize)))
for page := 0; page <= maxPage; page++ {
// 获取目标用户列表(分页)
users, err := logic.GetValidUsers(page, pageSize)
if err != nil {
log.Logger().Errorf("获取用户列表时发生错误:%s", err)
continue
}
// 已获取完毕
if users == nil {
return
}
// 抽取uid列表
var uids []uint
for _, user := range users {
uids = append(uids, user.UID)
}
// 通过API获取用户统计信息
stats := logic.BatchGetUserStat(&uids)
// 插入表
c, err := logic.UpdateFansToDB(stats)
if err != nil {
log.Logger().Errorf("更新粉丝数量时发生错误:%s", err)
return
}
log.Logger().Infof("成功更新了%d个用户粉丝数", c)
time.Sleep(2 * time.Second)
}
}