diff --git a/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionDetailVO.java b/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionDetailVO.java new file mode 100644 index 0000000..cc003bb --- /dev/null +++ b/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionDetailVO.java @@ -0,0 +1,21 @@ +package com.imeeting.dto.android; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "Android gRPC 连接详情") +public class AndroidGrpcConnectionDetailVO { + + @Schema(description = "连接ID") + private String connectionId; + + @Schema(description = "设备ID") + private String deviceId; + + @Schema(description = "租户ID") + private Long tenantId; + + @Schema(description = "用户ID") + private Long userId; +} diff --git a/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionSnapshotVO.java b/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionSnapshotVO.java new file mode 100644 index 0000000..010c97a --- /dev/null +++ b/backend/src/main/java/com/imeeting/dto/android/AndroidGrpcConnectionSnapshotVO.java @@ -0,0 +1,17 @@ +package com.imeeting.dto.android; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "Android gRPC 连接快照") +public class AndroidGrpcConnectionSnapshotVO { + + @Schema(description = "当前连接总数") + private int connectionCount; + + @Schema(description = "连接详情列表") + private List connections; +} diff --git a/backend/src/main/java/com/imeeting/support/AndroidRequestLogHelper.java b/backend/src/main/java/com/imeeting/support/AndroidRequestLogHelper.java new file mode 100644 index 0000000..a6a04e3 --- /dev/null +++ b/backend/src/main/java/com/imeeting/support/AndroidRequestLogHelper.java @@ -0,0 +1,67 @@ +package com.imeeting.support; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +public final class AndroidRequestLogHelper { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private AndroidRequestLogHelper() { + } + + public static void logRequest(Logger log, String moduleName, String apiName, Object... keyValues) { + log.info("[{}]{},请求时间:{},请求参数:{}", + moduleName, + apiName, + LocalDateTime.now(), + toJson(buildParams(keyValues))); + } + + private static Map buildParams(Object... keyValues) { + Map params = new LinkedHashMap<>(); + if (keyValues == null) { + return params; + } + for (int i = 0; i + 1 < keyValues.length; i += 2) { + Object key = keyValues[i]; + if (key == null) { + continue; + } + params.put(String.valueOf(key), sanitizeValue(keyValues[i + 1])); + } + return params; + } + + private static Object sanitizeValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof MultipartFile file) { + Map fileInfo = new LinkedHashMap<>(); + fileInfo.put("name", file.getName()); + fileInfo.put("originalFilename", file.getOriginalFilename()); + fileInfo.put("size", file.getSize()); + return fileInfo; + } + if (value instanceof MultipartFile[] files) { + return Arrays.stream(files).map(AndroidRequestLogHelper::sanitizeValue).toList(); + } + return value; + } + + private static String toJson(Object value) { + try { + return OBJECT_MAPPER.writeValueAsString(value); + } catch (JsonProcessingException e) { + return String.valueOf(value); + } + } +}