package com.xuqm.im.service; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Component public class ImPushBridgeClient { private static final Logger log = LoggerFactory.getLogger(ImPushBridgeClient.class); private final HttpClient httpClient = HttpClient.newHttpClient(); private final ObjectMapper objectMapper; @Value("${im.push-service-url:http://127.0.0.1:8083}") private String pushServiceUrl; @Value("${im.internal-token:xuqm-internal-token}") private String internalToken; public ImPushBridgeClient(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public void notifyUsers(String appId, List userIds, String title, String body, String payload) { if (userIds == null || userIds.isEmpty()) { return; } try { Map bodyMap = new LinkedHashMap<>(); bodyMap.put("appId", appId); bodyMap.put("userIds", userIds); bodyMap.put("title", title); bodyMap.put("body", body); bodyMap.put("payload", payload); String json = objectMapper.writeValueAsString(bodyMap); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(pushServiceUrl + "/api/push/internal/notify")) .header("Content-Type", "application/json") .header("X-Internal-Token", internalToken) .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); httpClient.send(request, HttpResponse.BodyHandlers.ofString()); } catch (Exception e) { log.warn("Failed to notify push-service for appId={}, userIds={}: {}", appId, userIds, e.getMessage()); } } }