Commit 0f1f3ce1025478d90f575c917ee50f257c760b5d

Authored by zichun
1 parent 15e856c7

feat(common): unified ApiResponse and ErrorCode REQ-MOD-001

backend/src/main/java/com/xly/erp/common/response/ApiResponse.java 0 → 100644
  1 +package com.xly.erp.common.response;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +@Data
  8 +@NoArgsConstructor
  9 +@AllArgsConstructor
  10 +public class ApiResponse<T> {
  11 + private int code;
  12 + private String message;
  13 + private T data;
  14 + private long timestamp;
  15 +
  16 + public static <T> ApiResponse<T> ok(T data) {
  17 + return new ApiResponse<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMessage(), data, System.currentTimeMillis());
  18 + }
  19 +
  20 + public static <T> ApiResponse<T> ok(String message, T data) {
  21 + return new ApiResponse<>(ErrorCode.SUCCESS.getCode(), message, data, System.currentTimeMillis());
  22 + }
  23 +
  24 + public static <T> ApiResponse<T> fail(ErrorCode ec) {
  25 + return new ApiResponse<>(ec.getCode(), ec.getMessage(), null, System.currentTimeMillis());
  26 + }
  27 +
  28 + public static <T> ApiResponse<T> fail(ErrorCode ec, String detail) {
  29 + return new ApiResponse<>(ec.getCode(), detail, null, System.currentTimeMillis());
  30 + }
  31 +
  32 + public static <T> ApiResponse<T> fail(int code, String message) {
  33 + return new ApiResponse<>(code, message, null, System.currentTimeMillis());
  34 + }
  35 +}
... ...
backend/src/main/java/com/xly/erp/common/response/ErrorCode.java 0 → 100644
  1 +package com.xly.erp.common.response;
  2 +
  3 +import lombok.Getter;
  4 +
  5 +@Getter
  6 +public enum ErrorCode {
  7 + SUCCESS(200, "操作成功"),
  8 + PARAM_INVALID(40010, "参数错误"),
  9 + MOD_PARENT_NOT_FOUND(40411, "父模块不存在或已删除"),
  10 + MOD_PROC_NAME_DUP(40911, "存储过程名称已存在"),
  11 + INTERNAL_ERROR(50000, "服务器内部错误");
  12 +
  13 + private final int code;
  14 + private final String message;
  15 +
  16 + ErrorCode(int code, String message) {
  17 + this.code = code;
  18 + this.message = message;
  19 + }
  20 +}
... ...
backend/src/test/java/com/xly/erp/common/response/ApiResponseTest.java 0 → 100644
  1 +package com.xly.erp.common.response;
  2 +
  3 +import org.junit.jupiter.api.Test;
  4 +
  5 +import static org.assertj.core.api.Assertions.assertThat;
  6 +
  7 +class ApiResponseTest {
  8 +
  9 + @Test
  10 + void ok_setsCode200AndDataAndTimestamp() {
  11 + long before = System.currentTimeMillis();
  12 + ApiResponse<String> r = ApiResponse.ok("hello");
  13 + long after = System.currentTimeMillis();
  14 +
  15 + assertThat(r.getCode()).isEqualTo(200);
  16 + assertThat(r.getMessage()).isEqualTo("操作成功");
  17 + assertThat(r.getData()).isEqualTo("hello");
  18 + assertThat(r.getTimestamp()).isBetween(before, after);
  19 + }
  20 +
  21 + @Test
  22 + void okWithMessage_overridesDefaultMessage() {
  23 + ApiResponse<Integer> r = ApiResponse.ok("created", 42);
  24 + assertThat(r.getCode()).isEqualTo(200);
  25 + assertThat(r.getMessage()).isEqualTo("created");
  26 + assertThat(r.getData()).isEqualTo(42);
  27 + }
  28 +
  29 + @Test
  30 + void fail_mapsErrorCodeFields() {
  31 + ApiResponse<Void> r = ApiResponse.fail(ErrorCode.PARAM_INVALID);
  32 + assertThat(r.getCode()).isEqualTo(40010);
  33 + assertThat(r.getMessage()).isEqualTo("参数错误");
  34 + assertThat(r.getData()).isNull();
  35 + }
  36 +
  37 + @Test
  38 + void failWithDetail_overridesDefaultMessage() {
  39 + ApiResponse<Void> r = ApiResponse.fail(ErrorCode.PARAM_INVALID, "sUserName: blank");
  40 + assertThat(r.getCode()).isEqualTo(40010);
  41 + assertThat(r.getMessage()).isEqualTo("sUserName: blank");
  42 + }
  43 +
  44 + @Test
  45 + void errorCode_constantsMatchDocs05Spec() {
  46 + assertThat(ErrorCode.SUCCESS.getCode()).isEqualTo(200);
  47 + assertThat(ErrorCode.PARAM_INVALID.getCode()).isEqualTo(40010);
  48 + assertThat(ErrorCode.MOD_PARENT_NOT_FOUND.getCode()).isEqualTo(40411);
  49 + assertThat(ErrorCode.MOD_PROC_NAME_DUP.getCode()).isEqualTo(40911);
  50 + assertThat(ErrorCode.INTERNAL_ERROR.getCode()).isEqualTo(50000);
  51 + }
  52 +}
... ...