- 添加DemoApi接口定义用户认证和资料管理API - 实现LocalImCache用于本地存储IM对话和消息历史 - 添加MessageContent模型处理多媒体消息内容 - 创建AttachmentRepository处理图片视频音频文件发送 - 实现AuthRepository管理用户登录注册和会话 - 添加VoiceRecorder支持语音录制功能 - 创建AppDependencies依赖注入容器 - 添加ChatScreen界面组件实现聊天UI逻辑
70 行
2.6 KiB
Java
70 行
2.6 KiB
Java
package com.xuqm.push.service;
|
|
|
|
import com.xuqm.push.entity.DeviceTokenEntity;
|
|
import com.xuqm.push.repository.DeviceTokenRepository;
|
|
import com.xuqm.push.service.provider.PushProvider;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.scheduling.annotation.Async;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.UUID;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Service
|
|
public class PushDispatcher {
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(PushDispatcher.class);
|
|
|
|
private final DeviceTokenRepository tokenRepository;
|
|
private final Map<String, PushProvider> providers;
|
|
|
|
public PushDispatcher(DeviceTokenRepository tokenRepository, List<PushProvider> providerList) {
|
|
this.tokenRepository = tokenRepository;
|
|
this.providers = providerList.stream()
|
|
.collect(Collectors.toMap(PushProvider::vendorName, p -> p));
|
|
}
|
|
|
|
@Async
|
|
public void pushToUser(String appId, String userId, String title, String body, String payload) {
|
|
List<DeviceTokenEntity> tokens = tokenRepository.findByAppIdAndUserId(appId, userId);
|
|
for (DeviceTokenEntity t : tokens) {
|
|
PushProvider provider = providers.get(t.getVendor().name());
|
|
if (provider != null) {
|
|
boolean ok = provider.send(t.getToken(), title, body, payload);
|
|
log.info("Push to {}@{} via {}: {}", userId, appId, t.getVendor(), ok ? "OK" : "FAIL");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Async
|
|
public void pushToUsers(String appId, List<String> userIds, String title, String body, String payload) {
|
|
if (userIds == null || userIds.isEmpty()) {
|
|
return;
|
|
}
|
|
for (String userId : userIds) {
|
|
pushToUser(appId, userId, title, body, payload);
|
|
}
|
|
}
|
|
|
|
public void registerToken(String appId, String userId, DeviceTokenEntity.Vendor vendor, String token) {
|
|
Optional<DeviceTokenEntity> existing = tokenRepository.findByAppIdAndUserIdAndVendor(appId, userId, vendor);
|
|
DeviceTokenEntity entity = existing.orElseGet(() -> {
|
|
DeviceTokenEntity e = new DeviceTokenEntity();
|
|
e.setId(UUID.randomUUID().toString());
|
|
e.setAppId(appId);
|
|
e.setUserId(userId);
|
|
e.setVendor(vendor);
|
|
e.setCreatedAt(LocalDateTime.now());
|
|
return e;
|
|
});
|
|
entity.setToken(token);
|
|
entity.setUpdatedAt(LocalDateTime.now());
|
|
tokenRepository.save(entity);
|
|
}
|
|
}
|