129 lines
3.6 KiB
Go
129 lines
3.6 KiB
Go
package services
|
|
|
|
import (
|
|
"bbs-go/internal/cache"
|
|
"bbs-go/internal/models"
|
|
"bbs-go/internal/models/constants"
|
|
"bbs-go/internal/repositories"
|
|
"errors"
|
|
"log/slog"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/mlogclub/simple/common/dates"
|
|
"github.com/mlogclub/simple/sqls"
|
|
"github.com/mlogclub/simple/web/params"
|
|
)
|
|
|
|
var CheckInService = newCheckInService()
|
|
|
|
func newCheckInService() *checkInService {
|
|
return &checkInService{}
|
|
}
|
|
|
|
type checkInService struct {
|
|
m sync.Mutex
|
|
}
|
|
|
|
func (s *checkInService) Get(id int64) *models.CheckIn {
|
|
return repositories.CheckInRepository.Get(sqls.DB(), id)
|
|
}
|
|
|
|
func (s *checkInService) Take(where ...interface{}) *models.CheckIn {
|
|
return repositories.CheckInRepository.Take(sqls.DB(), where...)
|
|
}
|
|
|
|
func (s *checkInService) Find(cnd *sqls.Cnd) []models.CheckIn {
|
|
return repositories.CheckInRepository.Find(sqls.DB(), cnd)
|
|
}
|
|
|
|
func (s *checkInService) FindOne(cnd *sqls.Cnd) *models.CheckIn {
|
|
return repositories.CheckInRepository.FindOne(sqls.DB(), cnd)
|
|
}
|
|
|
|
func (s *checkInService) FindPageByParams(params *params.QueryParams) (list []models.CheckIn, paging *sqls.Paging) {
|
|
return repositories.CheckInRepository.FindPageByParams(sqls.DB(), params)
|
|
}
|
|
|
|
func (s *checkInService) FindPageByCnd(cnd *sqls.Cnd) (list []models.CheckIn, paging *sqls.Paging) {
|
|
return repositories.CheckInRepository.FindPageByCnd(sqls.DB(), cnd)
|
|
}
|
|
|
|
func (s *checkInService) Count(cnd *sqls.Cnd) int64 {
|
|
return repositories.CheckInRepository.Count(sqls.DB(), cnd)
|
|
}
|
|
|
|
func (s *checkInService) Create(t *models.CheckIn) error {
|
|
return repositories.CheckInRepository.Create(sqls.DB(), t)
|
|
}
|
|
|
|
func (s *checkInService) Update(t *models.CheckIn) error {
|
|
return repositories.CheckInRepository.Update(sqls.DB(), t)
|
|
}
|
|
|
|
func (s *checkInService) Updates(id int64, columns map[string]interface{}) error {
|
|
return repositories.CheckInRepository.Updates(sqls.DB(), id, columns)
|
|
}
|
|
|
|
func (s *checkInService) UpdateColumn(id int64, name string, value interface{}) error {
|
|
return repositories.CheckInRepository.UpdateColumn(sqls.DB(), id, name, value)
|
|
}
|
|
|
|
func (s *checkInService) Delete(id int64) {
|
|
repositories.CheckInRepository.Delete(sqls.DB(), id)
|
|
}
|
|
|
|
func (s *checkInService) CheckIn(userId int64) error {
|
|
s.m.Lock()
|
|
defer s.m.Unlock()
|
|
var (
|
|
checkIn = s.GetByUserId(userId)
|
|
dayName = dates.GetDay(time.Now())
|
|
yesterdayName = dates.GetDay(time.Now().Add(-time.Hour * 24))
|
|
consecutiveDays = 1
|
|
err error
|
|
)
|
|
|
|
if checkIn != nil && checkIn.LatestDayName == dayName {
|
|
return errors.New("你已签到")
|
|
}
|
|
|
|
if checkIn != nil && checkIn.LatestDayName == yesterdayName {
|
|
consecutiveDays = checkIn.ConsecutiveDays + 1
|
|
}
|
|
|
|
if checkIn == nil {
|
|
err = s.Create(&models.CheckIn{
|
|
Model: models.Model{},
|
|
UserId: userId,
|
|
LatestDayName: dayName,
|
|
ConsecutiveDays: consecutiveDays,
|
|
CreateTime: dates.NowTimestamp(),
|
|
UpdateTime: dates.NowTimestamp(),
|
|
})
|
|
} else {
|
|
checkIn.LatestDayName = dayName
|
|
checkIn.ConsecutiveDays = consecutiveDays
|
|
checkIn.UpdateTime = dates.NowTimestamp()
|
|
err = s.Update(checkIn)
|
|
}
|
|
if err == nil {
|
|
// 清理签到排行榜缓存
|
|
cache.UserCache.RefreshCheckInRank()
|
|
// 处理签到积分
|
|
config := SysConfigService.GetConfig()
|
|
if config.ScoreConfig.CheckInScore > 0 {
|
|
_ = UserService.IncrScore(userId, config.ScoreConfig.CheckInScore, constants.EntityCheckIn,
|
|
strconv.FormatInt(userId, 10), "签到"+strconv.Itoa(dayName))
|
|
} else {
|
|
slog.Warn("签到积分未配置...")
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (s *checkInService) GetByUserId(userId int64) *models.CheckIn {
|
|
return s.FindOne(sqls.NewCnd().Eq("user_id", userId))
|
|
}
|