Files
nl-im-service/internal/service/contact_service.go
2025-12-03 11:00:47 +08:00

311 lines
7.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* package service
* 作用:联系人管理服务
*/
package service
import (
"errors"
"xk-websocket-v2/internal/model"
"gorm.io/gorm"
)
// ContactService 联系人服务结构体
type ContactService struct {
DB *gorm.DB
}
// ContactSvc 全局单例
var ContactSvc *ContactService
/**
* InitContactService
* 功能:初始化联系人服务
*/
func InitContactService(db *gorm.DB) {
ContactSvc = &ContactService{DB: db}
}
/**
* SearchUsers
* 功能:搜索用户(按用户名、ID、邮箱、手机号)
*/
func (s *ContactService) SearchUsers(keyword string, limit int) ([]model.User, error) {
return UserSvc.SearchUsers(keyword, limit)
}
/**
* AddFriend
* 功能:发送好友申请
*/
func (s *ContactService) AddFriend(fromUserID, toUserID, message string) error {
// 检查是否已经是好友
var existingContact model.UserContact
result := s.DB.Where("user_id = ? AND contact_id = ?", fromUserID, toUserID).First(&existingContact)
if result.Error == nil {
return errors.New("已经是好友关系")
}
// 检查是否已有待处理的申请
var existingRequest model.FriendRequest
result = s.DB.Where("from_user_id = ? AND to_user_id = ? AND status = ?",
fromUserID, toUserID, "pending").First(&existingRequest)
if result.Error == nil {
return errors.New("已发送过好友申请")
}
// 创建好友申请
request := model.FriendRequest{
FromUserID: fromUserID,
ToUserID: toUserID,
Message: message,
Status: "pending",
}
return s.DB.Create(&request).Error
}
/**
* GetFriendRequests
* 功能:获取好友申请列表
*/
func (s *ContactService) GetFriendRequests(userID string) ([]model.FriendRequest, error) {
var requests []model.FriendRequest
result := s.DB.Where("to_user_id = ? AND status = ?", userID, "pending").
Order("created_at DESC").
Find(&requests)
return requests, result.Error
}
/**
* AcceptFriendRequest
* 功能:接受好友申请
*/
func (s *ContactService) AcceptFriendRequest(requestID uint, userID string) error {
// 查找申请
var request model.FriendRequest
if err := s.DB.First(&request, requestID).Error; err != nil {
return err
}
// 验证是否为接收者
if request.ToUserID != userID {
return errors.New("无权操作此申请")
}
// 开始事务
tx := s.DB.Begin()
// 更新申请状态
if err := tx.Model(&request).Update("status", "accepted").Error; err != nil {
tx.Rollback()
return err
}
// 创建双向好友关系
contact1 := model.UserContact{
UserID: request.FromUserID,
ContactID: request.ToUserID,
}
contact2 := model.UserContact{
UserID: request.ToUserID,
ContactID: request.FromUserID,
}
if err := tx.Create(&contact1).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&contact2).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
/**
* RejectFriendRequest
* 功能:拒绝好友申请
*/
func (s *ContactService) RejectFriendRequest(requestID uint, userID string) error {
var request model.FriendRequest
if err := s.DB.First(&request, requestID).Error; err != nil {
return err
}
if request.ToUserID != userID {
return errors.New("无权操作此申请")
}
return s.DB.Model(&request).Update("status", "rejected").Error
}
/**
* GetContacts
* 功能:获取好友列表
*/
func (s *ContactService) GetContacts(userID string) ([]model.UserContact, error) {
var contacts []model.UserContact
result := s.DB.Where("user_id = ?", userID).
Order("is_top DESC, last_chat_time DESC, created_at DESC").
Find(&contacts)
return contacts, result.Error
}
/**
* GetContactDetail
* 功能:获取好友详情
*/
func (s *ContactService) GetContactDetail(userID, contactID string) (*model.UserContact, error) {
var contact model.UserContact
result := s.DB.Where("user_id = ? AND contact_id = ?", userID, contactID).First(&contact)
if result.Error != nil {
return nil, result.Error
}
return &contact, nil
}
/**
* UpdateContact
* 功能:更新好友信息(备注、分组等)
*/
func (s *ContactService) UpdateContact(userID, contactID string, updates map[string]interface{}) error {
return s.DB.Model(&model.UserContact{}).
Where("user_id = ? AND contact_id = ?", userID, contactID).
Updates(updates).Error
}
/**
* DeleteContact
* 功能:删除好友
*/
func (s *ContactService) DeleteContact(userID, contactID string) error {
// 删除双向好友关系
tx := s.DB.Begin()
if err := tx.Where("user_id = ? AND contact_id = ?", userID, contactID).Delete(&model.UserContact{}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Where("user_id = ? AND contact_id = ?", contactID, userID).Delete(&model.UserContact{}).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
/**
* GetGroups
* 功能:获取分组列表
*/
func (s *ContactService) GetGroups(userID string) ([]model.ContactGroup, error) {
var groups []model.ContactGroup
result := s.DB.Where("user_id = ?", userID).
Order("sort_order ASC, created_at ASC").
Find(&groups)
return groups, result.Error
}
/**
* CreateGroup
* 功能:创建分组
*/
func (s *ContactService) CreateGroup(userID, groupName string) (*model.ContactGroup, error) {
// 获取当前最大排序值
var maxOrder int
s.DB.Model(&model.ContactGroup{}).
Where("user_id = ?", userID).
Select("COALESCE(MAX(sort_order), 0)").
Scan(&maxOrder)
group := model.ContactGroup{
UserID: userID,
GroupName: groupName,
SortOrder: maxOrder + 1,
}
if err := s.DB.Create(&group).Error; err != nil {
return nil, err
}
return &group, nil
}
/**
* UpdateGroup
* 功能:更新分组
*/
func (s *ContactService) UpdateGroup(groupID uint, userID string, updates map[string]interface{}) error {
return s.DB.Model(&model.ContactGroup{}).
Where("id = ? AND user_id = ?", groupID, userID).
Updates(updates).Error
}
/**
* DeleteGroup
* 功能:删除分组
*/
func (s *ContactService) DeleteGroup(groupID uint, userID string) error {
// 检查分组是否存在且属于该用户
var group model.ContactGroup
if err := s.DB.Where("id = ? AND user_id = ?", groupID, userID).First(&group).Error; err != nil {
return err
}
// 将该分组下的联系人移到默认分组(group_id = 0)
if err := s.DB.Model(&model.UserContact{}).
Where("user_id = ? AND group_id = ?", userID, groupID).
Update("group_id", 0).Error; err != nil {
return err
}
// 删除分组
return s.DB.Delete(&group).Error
}
/**
* GetContactsWithUserInfo
* 功能:获取好友列表(包含用户信息)
*/
func (s *ContactService) GetContactsWithUserInfo(userID string) ([]map[string]interface{}, error) {
var contacts []model.UserContact
if err := s.DB.Where("user_id = ?", userID).
Order("is_top DESC, last_chat_time DESC").
Find(&contacts).Error; err != nil {
return nil, err
}
var result []map[string]interface{}
for _, contact := range contacts {
// 获取联系人用户信息
var user model.User
if err := s.DB.Where("id = ?", contact.ContactID).First(&user).Error; err != nil {
continue
}
user.Password = ""
// 组合数据
item := map[string]interface{}{
"id": contact.ContactID,
"name": user.Name,
"avatar": user.Avatar,
"desc": user.Desc,
"remark_name": contact.RemarkName,
"group_id": contact.GroupID,
"is_top": contact.IsTop,
"is_muted": contact.IsMuted,
"last_chat_time": contact.LastChatTime,
"last_message": contact.LastMessage,
"unread_count": contact.UnreadCount,
}
result = append(result, item)
}
return result, nil
}