Files
common-server-public/archive/bbs-go/server/internal/spam/post_frequency_strategy.go
12600k-rog-d4 8f4d399cfd 20251209
2025-12-09 20:33:57 +08:00

106 lines
3.8 KiB
Go

package spam
import (
"bbs-go/internal/models"
"bbs-go/internal/repositories"
"errors"
"time"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/sqls"
)
// PostFrequencyStrategy 发表频率限制
type PostFrequencyStrategy struct{}
func (PostFrequencyStrategy) Name() string {
return "PostFrequencyStrategy"
}
func (PostFrequencyStrategy) CheckTopic(user *models.User, topic models.CreateTopicForm) error {
// 注册时间超过24小时
if user.CreateTime < dates.Timestamp(time.Now().Add(-time.Hour*24)) {
return nil
}
var (
maxCountInTenMinutes int64 = 1 // 十分钟内最高发帖数量
maxCountInOneHour int64 = 2 // 一小时内最高发帖量
maxCountInOneDay int64 = 3 // 一天内最高发帖量
)
if repositories.TopicRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour*24)))) >= maxCountInOneDay {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.TopicRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour)))) >= maxCountInOneHour {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.TopicRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Minute*10)))) >= maxCountInTenMinutes {
return errors.New("发表太快了,请休息一会儿")
}
return nil
}
func (s PostFrequencyStrategy) CheckArticle(user *models.User, form models.CreateArticleForm) error {
// 注册时间超过24小时
if user.CreateTime < dates.Timestamp(time.Now().Add(-time.Hour*24)) {
return nil
}
var (
maxCountInTenMinutes int64 = 1 // 十分钟内最高发帖数量
maxCountInOneHour int64 = 2 // 一小时内最高发帖量
maxCountInOneDay int64 = 3 // 一天内最高发帖量
)
if repositories.ArticleRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour*24)))) >= maxCountInOneDay {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.ArticleRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour)))) >= maxCountInOneHour {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.ArticleRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Minute*10)))) >= maxCountInTenMinutes {
return errors.New("发表太快了,请休息一会儿")
}
return nil
}
func (s PostFrequencyStrategy) CheckComment(user *models.User, form models.CreateCommentForm) error {
// 注册时间超过24小时
if user.CreateTime < dates.Timestamp(time.Now().Add(-time.Hour*24)) {
return nil
}
var (
maxCountInTenMinutes int64 = 1 // 十分钟内最高发帖数量
maxCountInOneHour int64 = 1 // 一小时内最高发帖量
maxCountInOneDay int64 = 1 // 一天内最高发帖量
)
if repositories.CommentRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour*24)))) >= maxCountInOneDay {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.CommentRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Hour)))) >= maxCountInOneHour {
return errors.New("发表太快了,请休息一会儿")
}
if repositories.CommentRepository.Count(sqls.DB(), sqls.NewCnd().Eq("user_id", user.Id).
Gt("create_time", dates.Timestamp(time.Now().Add(-time.Minute*10)))) >= maxCountInTenMinutes {
return errors.New("发表太快了,请休息一会儿")
}
return nil
}