363 lines
7.9 KiB
Go
363 lines
7.9 KiB
Go
|
|
/**
|
|||
|
|
* package api
|
|||
|
|
* 作用:联系人管理相关API处理器
|
|||
|
|
*/
|
|||
|
|
package api
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"strconv"
|
|||
|
|
"xk-websocket-v2/internal/model"
|
|||
|
|
"xk-websocket-v2/internal/service"
|
|||
|
|
"xk-websocket-v2/internal/utils"
|
|||
|
|
|
|||
|
|
"github.com/gin-gonic/gin"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* ContactListHandler
|
|||
|
|
* 功能:获取联系人列表(已存在,需改为从数据库查询)
|
|||
|
|
* 路径:GET /api/contacts
|
|||
|
|
*/
|
|||
|
|
func ContactListHandler(c *gin.Context) {
|
|||
|
|
// 从Context获取用户ID(由JWT中间件注入)
|
|||
|
|
userID, exists := c.Get("user_id")
|
|||
|
|
if !exists {
|
|||
|
|
// 如果没有认证,返回空列表(兼容旧代码)
|
|||
|
|
utils.SuccessWithData(c, []interface{}{}, "获取成功")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
contacts, err := service.ContactSvc.GetContactsWithUserInfo(userID.(string))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, "查询失败")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保返回空数组而不是null
|
|||
|
|
if contacts == nil {
|
|||
|
|
contacts = []map[string]interface{}{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, contacts, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* SearchUsersHandler
|
|||
|
|
* 功能:搜索用户
|
|||
|
|
* 路径:GET /api/contacts/search
|
|||
|
|
*/
|
|||
|
|
func SearchUsersHandler(c *gin.Context) {
|
|||
|
|
keyword := c.Query("keyword")
|
|||
|
|
if keyword == "" {
|
|||
|
|
utils.BadRequest(c, "搜索关键词不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "20"))
|
|||
|
|
if limit < 1 || limit > 100 {
|
|||
|
|
limit = 20
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
users, err := service.ContactSvc.SearchUsers(keyword, limit)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, "搜索失败")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保返回空数组而不是null
|
|||
|
|
if users == nil {
|
|||
|
|
users = []model.User{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, users, "搜索成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* AddFriendHandler
|
|||
|
|
* 功能:添加好友(发送申请)
|
|||
|
|
* 路径:POST /api/contacts/add-friend
|
|||
|
|
*/
|
|||
|
|
func AddFriendHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
ToUserID string `json:"to_user_id" binding:"required"`
|
|||
|
|
Message string `json:"message"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.AddFriend(userID.(string), req.ToUserID, req.Message); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "好友申请已发送")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetFriendRequestsHandler
|
|||
|
|
* 功能:获取好友申请列表
|
|||
|
|
* 路径:GET /api/contacts/friend-requests
|
|||
|
|
*/
|
|||
|
|
func GetFriendRequestsHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
requests, err := service.ContactSvc.GetFriendRequests(userID.(string))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, "查询失败")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保返回空数组而不是null
|
|||
|
|
if requests == nil {
|
|||
|
|
requests = []model.FriendRequest{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, requests, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* AcceptFriendRequestHandler
|
|||
|
|
* 功能:接受好友申请
|
|||
|
|
* 路径:POST /api/contacts/accept-request
|
|||
|
|
*/
|
|||
|
|
func AcceptFriendRequestHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
RequestID uint `json:"request_id" binding:"required"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.AcceptFriendRequest(req.RequestID, userID.(string)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "已接受好友申请")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* RejectFriendRequestHandler
|
|||
|
|
* 功能:拒绝好友申请
|
|||
|
|
* 路径:POST /api/contacts/reject-request
|
|||
|
|
*/
|
|||
|
|
func RejectFriendRequestHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
RequestID uint `json:"request_id" binding:"required"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.RejectFriendRequest(req.RequestID, userID.(string)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "已拒绝好友申请")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetGroupsHandler
|
|||
|
|
* 功能:获取分组列表
|
|||
|
|
* 路径:GET /api/contacts/groups
|
|||
|
|
*/
|
|||
|
|
func GetGroupsHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
groups, err := service.ContactSvc.GetGroups(userID.(string))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, "查询失败")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保返回空数组而不是null
|
|||
|
|
if groups == nil {
|
|||
|
|
groups = []model.ContactGroup{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, groups, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* CreateGroupHandler
|
|||
|
|
* 功能:创建分组
|
|||
|
|
* 路径:POST /api/contacts/groups
|
|||
|
|
*/
|
|||
|
|
func CreateGroupHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
GroupName string `json:"group_name" binding:"required"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
group, err := service.ContactSvc.CreateGroup(userID.(string), req.GroupName)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "创建失败: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, group, "创建成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* UpdateGroupHandler
|
|||
|
|
* 功能:更新分组
|
|||
|
|
* 路径:PUT /api/contacts/groups/:id
|
|||
|
|
*/
|
|||
|
|
func UpdateGroupHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
groupID, _ := strconv.ParseUint(c.Param("id"), 10, 32)
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
GroupName string `json:"group_name"`
|
|||
|
|
SortOrder int `json:"sort_order"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
updates := make(map[string]interface{})
|
|||
|
|
if req.GroupName != "" {
|
|||
|
|
updates["group_name"] = req.GroupName
|
|||
|
|
}
|
|||
|
|
if req.SortOrder > 0 {
|
|||
|
|
updates["sort_order"] = req.SortOrder
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.UpdateGroup(uint(groupID), userID.(string), updates); err != nil {
|
|||
|
|
utils.BadRequest(c, "更新失败: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "更新成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* DeleteGroupHandler
|
|||
|
|
* 功能:删除分组
|
|||
|
|
* 路径:DELETE /api/contacts/groups/:id
|
|||
|
|
*/
|
|||
|
|
func DeleteGroupHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
groupID, _ := strconv.ParseUint(c.Param("id"), 10, 32)
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.DeleteGroup(uint(groupID), userID.(string)); err != nil {
|
|||
|
|
utils.BadRequest(c, "删除失败: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "删除成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetContactDetailHandler
|
|||
|
|
* 功能:获取好友详情
|
|||
|
|
* 路径:GET /api/contacts/:id
|
|||
|
|
*/
|
|||
|
|
func GetContactDetailHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
contactID := c.Param("id")
|
|||
|
|
|
|||
|
|
contact, err := service.ContactSvc.GetContactDetail(userID.(string), contactID)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.NotFound(c, "好友不存在")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取联系人用户信息
|
|||
|
|
user, err := service.UserSvc.GetUserByID(contactID)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.NotFound(c, "用户不存在")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
result := map[string]interface{}{
|
|||
|
|
"contact": contact,
|
|||
|
|
"user": user,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, result, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* UpdateContactHandler
|
|||
|
|
* 功能:更新好友信息
|
|||
|
|
* 路径:PUT /api/contacts/:id
|
|||
|
|
*/
|
|||
|
|
func UpdateContactHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
contactID := c.Param("id")
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
RemarkName string `json:"remark_name"`
|
|||
|
|
GroupID uint `json:"group_id"`
|
|||
|
|
IsTop *bool `json:"is_top"`
|
|||
|
|
IsMuted *bool `json:"is_muted"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
updates := make(map[string]interface{})
|
|||
|
|
if req.RemarkName != "" {
|
|||
|
|
updates["remark_name"] = req.RemarkName
|
|||
|
|
}
|
|||
|
|
if req.GroupID > 0 {
|
|||
|
|
updates["group_id"] = req.GroupID
|
|||
|
|
}
|
|||
|
|
if req.IsTop != nil {
|
|||
|
|
updates["is_top"] = *req.IsTop
|
|||
|
|
}
|
|||
|
|
if req.IsMuted != nil {
|
|||
|
|
updates["is_muted"] = *req.IsMuted
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.UpdateContact(userID.(string), contactID, updates); err != nil {
|
|||
|
|
utils.BadRequest(c, "更新失败: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "更新成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* DeleteContactHandler
|
|||
|
|
* 功能:删除好友
|
|||
|
|
* 路径:DELETE /api/contacts/:id
|
|||
|
|
*/
|
|||
|
|
func DeleteContactHandler(c *gin.Context) {
|
|||
|
|
userID, _ := c.Get("user_id")
|
|||
|
|
contactID := c.Param("id")
|
|||
|
|
|
|||
|
|
if err := service.ContactSvc.DeleteContact(userID.(string), contactID); err != nil {
|
|||
|
|
utils.BadRequest(c, "删除失败: "+err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "已删除好友")
|
|||
|
|
}
|
|||
|
|
|