311 lines
7.5 KiB
Go
311 lines
7.5 KiB
Go
/**
|
||
* 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
|
||
}
|
||
|