106 lines
3.8 KiB
Go
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
|
|
}
|