spider-scheduler/pkg/task/user.go

102 lines
2.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package task
import (
"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
}
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
//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)
}
}