152 lines
4.5 KiB
Go
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))
|
|
}
|
|
}
|