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)) } }