Files
lv8girl/internal/services/message.go
2026-02-23 23:50:04 +08:00

98 lines
2.5 KiB
Go

package services
import (
"lv8girl/internal/models"
"lv8girl/internal/repositories"
)
type MessageService struct {
messageRepo *repositories.MessageRepository
userRepo *repositories.UserRepository
}
func NewMessageService() *MessageService {
return &MessageService{
messageRepo: repositories.NewMessageRepository(),
userRepo: repositories.NewUserRepository(),
}
}
func (s *MessageService) SendMessage(fromUserID, toUserID uint, content string) error {
message := &models.PrivateMessage{
FromUserID: fromUserID,
ToUserID: toUserID,
Content: content,
IsRead: false,
}
return s.messageRepo.Create(message)
}
func (s *MessageService) GetUnreadCount(userID uint) (int64, error) {
return s.messageRepo.CountUnread(userID)
}
type ConversationView struct {
UserID uint
Username string
Avatar string
LastMsg string
Time string
Unread int64
}
func (s *MessageService) GetConversations(userID uint) ([]ConversationView, error) {
messages, err := s.messageRepo.FindConversations(userID)
if err != nil {
return nil, err
}
userMap := make(map[uint]bool)
for _, msg := range messages {
if msg.FromUserID != userID {
userMap[msg.FromUserID] = true
}
if msg.ToUserID != userID {
userMap[msg.ToUserID] = true
}
}
var conversations []ConversationView
for otherID := range userMap {
otherUser, err := s.userRepo.FindByID(otherID)
if err != nil {
continue
}
lastMsg, _ := s.messageRepo.FindLastMessage(userID, otherID)
unread, _ := s.messageRepo.CountUnreadFromUser(otherID, userID)
avatar := ""
if otherUser.Avatar != "" {
avatar = "/" + otherUser.Avatar
}
conversations = append(conversations, ConversationView{
UserID: otherUser.ID,
Username: otherUser.Username,
Avatar: avatar,
LastMsg: lastMsg.Content,
Time: lastMsg.CreatedAt.Format("2006-01-02 15:04"),
Unread: unread,
})
}
return conversations, nil
}
func (s *MessageService) NotifyUserApproved(adminID, userID uint) error {
return s.SendMessage(adminID, userID, "恭喜!您的账号已通过管理员审核,现在可以正常登录使用了。")
}
func (s *MessageService) NotifyUserRejected(adminID, userID uint) error {
return s.SendMessage(adminID, userID, "您的账号审核未通过。如有疑问,请联系管理员。")
}
func (s *MessageService) NotifyUserBanned(adminID, userID uint) error {
return s.SendMessage(adminID, userID, "您的账号已被管理员封禁。如有疑问,请联系管理员。")
}