Files
common-server-public/bbs-go-active/server/internal/services/message_service.go
2025-03-03 17:43:50 +08:00

152 lines
4.5 KiB
Go

package services
import (
"bbs-go/internal/cache"
"bbs-go/internal/models"
"bbs-go/internal/models/constants"
"bbs-go/internal/pkg/bbsurls"
"bbs-go/internal/pkg/email"
"bbs-go/internal/pkg/msg"
"bbs-go/internal/repositories"
"log/slog"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/common/jsons"
"github.com/mlogclub/simple/sqls"
"github.com/mlogclub/simple/web/params"
)
var MessageService = newMessageService()
func newMessageService() *messageService {
return &messageService{}
}
type messageService struct {
}
func (s *messageService) Get(id int64) *models.Message {
return repositories.MessageRepository.Get(sqls.DB(), id)
}
func (s *messageService) Take(where ...interface{}) *models.Message {
return repositories.MessageRepository.Take(sqls.DB(), where...)
}
func (s *messageService) Find(cnd *sqls.Cnd) []models.Message {
return repositories.MessageRepository.Find(sqls.DB(), cnd)
}
func (s *messageService) FindOne(cnd *sqls.Cnd) *models.Message {
return repositories.MessageRepository.FindOne(sqls.DB(), cnd)
}
func (s *messageService) FindPageByParams(params *params.QueryParams) (list []models.Message, paging *sqls.Paging) {
return repositories.MessageRepository.FindPageByParams(sqls.DB(), params)
}
func (s *messageService) FindPageByCnd(cnd *sqls.Cnd) (list []models.Message, paging *sqls.Paging) {
return repositories.MessageRepository.FindPageByCnd(sqls.DB(), cnd)
}
func (s *messageService) Create(t *models.Message) error {
return repositories.MessageRepository.Create(sqls.DB(), t)
}
func (s *messageService) Update(t *models.Message) error {
return repositories.MessageRepository.Update(sqls.DB(), t)
}
func (s *messageService) Updates(id int64, columns map[string]interface{}) error {
return repositories.MessageRepository.Updates(sqls.DB(), id, columns)
}
func (s *messageService) UpdateColumn(id int64, name string, value interface{}) error {
return repositories.MessageRepository.UpdateColumn(sqls.DB(), id, name, value)
}
func (s *messageService) Delete(id int64) {
repositories.MessageRepository.Delete(sqls.DB(), id)
}
// GetUnReadCount 获取未读消息数量
func (s *messageService) GetUnReadCount(userId int64) (count int64) {
sqls.DB().Where("user_id = ? and status = ?", userId, msg.StatusUnread).Model(&models.Message{}).Count(&count)
return
}
// MarkRead 将所有消息标记为已读
func (s *messageService) MarkRead(userId int64) {
sqls.DB().Exec("update t_message set status = ? where user_id = ? and status = ?", msg.StatusHaveRead,
userId, msg.StatusUnread)
}
// SendMsg 发送消息
func (s *messageService) SendMsg(from, to int64, msgType msg.Type,
title, content, quoteContent string, extraData interface{}) {
t := &models.Message{
FromId: from,
UserId: to,
Title: title,
Content: content,
QuoteContent: quoteContent,
Type: int(msgType),
ExtraData: jsons.ToJsonStr(extraData),
Status: msg.StatusUnread,
CreateTime: dates.NowTimestamp(),
}
if err := s.Create(t); err != nil {
slog.Error(err.Error(), slog.Any("err", err))
} else {
s.SendEmailNotice(t)
}
}
// SendEmailNotice 发送邮件通知
func (s *messageService) SendEmailNotice(t *models.Message) {
msgType := msg.Type(t.Type)
// 话题被删除不发送邮件提醒
if msgType == msg.TypeTopicDelete {
return
}
user := cache.UserCache.Get(t.UserId)
if user == nil || len(user.Email.String) == 0 {
return
}
var (
siteTitle = cache.SysConfigCache.GetValue(constants.SysConfigSiteTitle)
emailTitle = siteTitle + " - 新消息提醒"
)
if msgType == msg.TypeTopicComment {
emailTitle = siteTitle + " - 收到话题评论"
} else if msgType == msg.TypeCommentReply {
emailTitle = siteTitle + " - 收到他人回复"
} else if msgType == msg.TypeTopicLike {
emailTitle = siteTitle + " - 收到点赞"
} else if msgType == msg.TypeTopicFavorite {
emailTitle = siteTitle + " - 话题被收藏"
} else if msgType == msg.TypeTopicRecommend {
emailTitle = siteTitle + " - 话题被设为推荐"
} else if msgType == msg.TypeTopicDelete {
emailTitle = siteTitle + " - 话题被删除"
} else if msgType == msg.TypeArticleComment {
emailTitle = siteTitle + " - 收到文章评论"
}
var from *models.User
if t.FromId > 0 {
from = cache.UserCache.Get(t.FromId)
}
err := email.SendTemplateEmail(from, user.Email.String, emailTitle, emailTitle, t.Content,
t.QuoteContent, &models.ActionLink{
Title: "点击查看详情",
Url: bbsurls.AbsUrl("/user/messages"),
})
if err != nil {
slog.Error(err.Error(), slog.Any("err", err))
}
}