Commit 0f1f3ce1025478d90f575c917ee50f257c760b5d
1 parent
15e856c7
feat(common): unified ApiResponse and ErrorCode REQ-MOD-001
Showing
3 changed files
with
107 additions
and
0 deletions
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 | +} | ... | ... |