314 lines
7.9 KiB
JavaScript
314 lines
7.9 KiB
JavaScript
// 好友功能API客户端
|
|
const apiClient = require('./api-client.js');
|
|
|
|
class FriendAPI {
|
|
constructor() {
|
|
this.apiClient = apiClient;
|
|
}
|
|
|
|
// 🔥 ===== 好友管理 =====
|
|
|
|
// 添加好友
|
|
async addFriend(targetId, message = '') {
|
|
try {
|
|
const response = await this.apiClient.post('/api/v1/social/friend/add', {
|
|
targetId: targetId,
|
|
message: message
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('添加好友失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 获取好友列表
|
|
async getFriendList() {
|
|
try {
|
|
const response = await this.apiClient.get('/api/v1/social/friends');
|
|
return response;
|
|
} catch (error) {
|
|
console.error('获取好友列表失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 获取好友详情
|
|
async getFriendDetail(customId, lat = null, lng = null) {
|
|
try {
|
|
const params = {};
|
|
if (lat !== null && lng !== null) {
|
|
params.lat = lat;
|
|
params.lng = lng;
|
|
}
|
|
|
|
const response = await this.apiClient.get(`/api/v1/social/friends/${customId}/detail`, params);
|
|
return response;
|
|
} catch (error) {
|
|
console.error('获取好友详情失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 删除好友
|
|
async deleteFriend(customId) {
|
|
try {
|
|
const response = await this.apiClient.delete(`/api/v1/social/friend/${customId}`);
|
|
return response;
|
|
} catch (error) {
|
|
console.error('删除好友失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 更新好友关系
|
|
async updateFriendRelation(friendId, updates) {
|
|
try {
|
|
const response = await this.apiClient.put('/api/v1/social/friend', {
|
|
friendId: friendId,
|
|
...updates
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('更新好友关系失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 🔥 ===== 好友请求管理 =====
|
|
|
|
// 获取好友请求列表
|
|
async getFriendRequests() {
|
|
try {
|
|
const response = await this.apiClient.get('/api/v1/social/friend/requests');
|
|
return response;
|
|
} catch (error) {
|
|
console.error('获取好友请求列表失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 获取待处理好友请求数量
|
|
async getFriendRequestCount() {
|
|
try {
|
|
const response = await this.apiClient.get('/api/v1/social/friend/requests/count');
|
|
return response;
|
|
} catch (error) {
|
|
console.error('获取好友请求数量失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 处理好友请求
|
|
async handleFriendRequest(requestId, accept) {
|
|
try {
|
|
const response = await this.apiClient.post('/api/v1/social/friend/handle-request', {
|
|
requestId: requestId,
|
|
accept: accept
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('处理好友请求失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 批量处理好友请求
|
|
async batchHandleFriendRequests(requestIds, accept) {
|
|
try {
|
|
const response = await this.apiClient.post('/api/v1/social/friend/batch-handle-requests', {
|
|
requestIds: requestIds,
|
|
accept: accept
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('批量处理好友请求失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 🔥 ===== 用户搜索 =====
|
|
|
|
// 搜索用户 - 根据正确的接口文档
|
|
async searchUsers(query, searchType = 'all', page = 1, pageSize = 10) {
|
|
try {
|
|
const response = await this.apiClient.post('/api/v1/social/users/search', {
|
|
query: query,
|
|
searchType: searchType,
|
|
page: page,
|
|
pageSize: pageSize
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('搜索用户失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 🔥 ===== 通知管理(轮询降级) =====
|
|
|
|
// 拉取好友通知
|
|
async pullFriendNotifications(limit = 10) {
|
|
try {
|
|
const response = await this.apiClient.get('/api/v1/social/friend/notifications/pull', {
|
|
limit: limit
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error('拉取好友通知失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 获取通知统计
|
|
async getNotificationStats() {
|
|
try {
|
|
const response = await this.apiClient.get('/api/v1/social/friend/notifications/stats');
|
|
return response;
|
|
} catch (error) {
|
|
console.error('获取通知统计失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 清除通知缓存
|
|
async clearNotificationCache() {
|
|
try {
|
|
const response = await this.apiClient.delete('/api/v1/social/friend/notifications/clear');
|
|
return response;
|
|
} catch (error) {
|
|
console.error('清除通知缓存失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 🔥 ===== 工具方法 =====
|
|
|
|
// 格式化关系状态文本
|
|
getRelationStatusText(relationStatus) {
|
|
const statusMap = {
|
|
'self': '自己',
|
|
'friend': '已是好友',
|
|
'can_add': '可以添加好友',
|
|
'pending': '等待验证',
|
|
'privacy_limited': '隐私限制',
|
|
'blocked': '被拉黑'
|
|
};
|
|
return statusMap[relationStatus] || '未知状态';
|
|
}
|
|
|
|
// 格式化搜索类型文本
|
|
getSearchTypeText(searchType) {
|
|
const typeMap = {
|
|
'nickname': '昵称',
|
|
'custom_id': '用户ID',
|
|
'phone': '手机号',
|
|
'all': '全部'
|
|
};
|
|
return typeMap[searchType] || '未知类型';
|
|
}
|
|
|
|
// 格式化隐私级别文本
|
|
getPrivacyLevelText(privacyLevel) {
|
|
const levelMap = {
|
|
1: '精确位置',
|
|
2: '区县级别',
|
|
3: '城市级别',
|
|
4: '不可见'
|
|
};
|
|
return levelMap[privacyLevel] || '未知级别';
|
|
}
|
|
|
|
// 格式化关系标签
|
|
getRelationLabelText(relation) {
|
|
const relationMap = {
|
|
'情侣': '💕 情侣',
|
|
'家人': '👨👩👧👦 家人',
|
|
'兄弟': '👬 兄弟',
|
|
'姐妹': '👭 姐妹',
|
|
'闺蜜': '👯♀️ 闺蜜',
|
|
'死党': '🤝 死党'
|
|
};
|
|
return relationMap[relation] || relation;
|
|
}
|
|
|
|
// 计算友谊天数
|
|
calculateFriendshipDays(friendshipDate) {
|
|
if (!friendshipDate) return 0;
|
|
|
|
const now = new Date();
|
|
const friendDate = new Date(friendshipDate);
|
|
const diffTime = Math.abs(now - friendDate);
|
|
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
return diffDays;
|
|
}
|
|
|
|
// 格式化友谊时间描述
|
|
formatFriendshipTime(friendshipDate) {
|
|
if (!friendshipDate) return '未知时间';
|
|
|
|
const days = this.calculateFriendshipDays(friendshipDate);
|
|
|
|
if (days < 1) {
|
|
return '今天成为好友';
|
|
} else if (days < 30) {
|
|
return `${days}天前成为好友`;
|
|
} else if (days < 365) {
|
|
const months = Math.floor(days / 30);
|
|
return `${months}个月前成为好友`;
|
|
} else {
|
|
const years = Math.floor(days / 365);
|
|
return `${years}年前成为好友`;
|
|
}
|
|
}
|
|
|
|
// 验证CustomID格式
|
|
validateCustomId(customId) {
|
|
if (!customId || typeof customId !== 'string') {
|
|
return false;
|
|
}
|
|
|
|
// CustomID应该是9-10位数字字符串
|
|
const customIdRegex = /^\d{9,10}$/;
|
|
return customIdRegex.test(customId);
|
|
}
|
|
|
|
// 脱敏手机号
|
|
maskPhoneNumber(phone) {
|
|
if (!phone || phone.length < 11) {
|
|
return phone;
|
|
}
|
|
|
|
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
|
|
}
|
|
|
|
// 生成好友分组列表
|
|
getFriendGroups() {
|
|
return [
|
|
'默认分组',
|
|
'家人',
|
|
'同学',
|
|
'同事',
|
|
'朋友',
|
|
'其他'
|
|
];
|
|
}
|
|
|
|
// 生成关系标签列表
|
|
getRelationLabels() {
|
|
return [
|
|
{ value: '情侣', label: '💕 情侣', color: '#ff4757' },
|
|
{ value: '家人', label: '👨👩👧👦 家人', color: '#2ed573' },
|
|
{ value: '兄弟', label: '👬 兄弟', color: '#3742fa' },
|
|
{ value: '姐妹', label: '👭 姐妹', color: '#ff6b81' },
|
|
{ value: '闺蜜', label: '👯♀️ 闺蜜', color: '#a55eea' },
|
|
{ value: '死党', label: '🤝 死党', color: '#26de81' }
|
|
];
|
|
}
|
|
}
|
|
|
|
// 创建全局单例
|
|
const friendAPI = new FriendAPI();
|
|
|
|
module.exports = friendAPI;
|
|
|