From 5b8c47e37379bc53a75730bee8e7a474cf35c3b8 Mon Sep 17 00:00:00 2001
From: inwardflow <3102126552@qq.com>
Date: Sun, 29 Mar 2026 11:56:06 +0800
Subject: [PATCH 01/10] refactor: consolidate website response parsing
---
.../website/AbstractWebsiteBooleanApi.java | 126 +++++
.../AbstractWebsiteMapListQueryApi.java | 82 +++
.../website/AbstractWebsiteMapQueryApi.java | 83 ++++
.../website/AbstractWebsiteTextQueryApi.java | 82 +++
.../api/website/AddWebsiteDomainApi.java | 135 ++---
.../api/website/CloseWebsitePasswordApi.java | 100 +---
.../btapi/api/website/CloseWebsiteSslApi.java | 100 +---
.../btapi/api/website/CreateWebsiteApi.java | 470 +++++++++---------
.../api/website/CreateWebsiteBackupApi.java | 100 +---
.../btapi/api/website/DeleteWebsiteApi.java | 214 +++-----
.../api/website/DeleteWebsiteBackupApi.java | 100 +---
.../api/website/DeleteWebsiteDomainApi.java | 154 ++----
.../btapi/api/website/GetPhpVersionsApi.java | 123 ++---
.../api/website/GetWebsiteBackupsApi.java | 205 +++-----
.../api/website/GetWebsiteConfigApi.java | 149 +-----
.../api/website/GetWebsiteDetailApi.java | 120 +----
.../api/website/GetWebsiteDomainsApi.java | 133 +----
.../api/website/GetWebsiteLimitNetApi.java | 126 +----
.../btapi/api/website/GetWebsiteListApi.java | 237 +++------
.../api/website/GetWebsiteNginxConfigApi.java | 129 +----
.../website/GetWebsitePhpExtensionsApi.java | 132 ++---
.../api/website/GetWebsitePhpVersionApi.java | 110 +---
.../website/GetWebsiteRewriteRulesApi.java | 110 +---
.../api/website/GetWebsiteRootPathApi.java | 110 +---
.../api/website/GetWebsiteSslListApi.java | 132 ++---
.../btapi/api/website/GetWebsiteTypesApi.java | 123 ++---
.../sdk/btapi/api/website/GetWebsitesApi.java | 297 +++++------
.../api/website/SetWebsiteLimitNetApi.java | 169 ++-----
.../btapi/api/website/SetWebsiteLogsApi.java | 100 +---
.../api/website/SetWebsiteNginxConfigApi.java | 139 ++----
.../api/website/SetWebsitePasswordApi.java | 136 ++---
.../website/SetWebsitePhpExtensionsApi.java | 140 ++----
.../api/website/SetWebsitePhpVersionApi.java | 120 +----
.../btapi/api/website/SetWebsitePsApi.java | 117 +----
.../website/SetWebsiteRewriteRulesApi.java | 139 ++----
.../api/website/SetWebsiteRootPathApi.java | 118 +----
.../api/website/SetWebsiteRunPathApi.java | 119 +----
.../btapi/api/website/SetWebsiteSslApi.java | 173 ++-----
.../api/website/SetWebsiteUserIniApi.java | 100 +---
.../btapi/api/website/StartWebsiteApi.java | 100 +---
.../sdk/btapi/api/website/StopWebsiteApi.java | 100 +---
.../website/WebsiteApiResponseSupport.java | 148 ++++++
.../sdk/btapi/facade/WebsiteOperations.java | 310 ++++++++++++
43 files changed, 2299 insertions(+), 3911 deletions(-)
create mode 100644 src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteBooleanApi.java
create mode 100644 src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteMapListQueryApi.java
create mode 100644 src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteMapQueryApi.java
create mode 100644 src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteTextQueryApi.java
create mode 100644 src/main/java/net/heimeng/sdk/btapi/api/website/WebsiteApiResponseSupport.java
create mode 100644 src/main/java/net/heimeng/sdk/btapi/facade/WebsiteOperations.java
diff --git a/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteBooleanApi.java b/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteBooleanApi.java
new file mode 100644
index 0000000..b0ffabe
--- /dev/null
+++ b/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteBooleanApi.java
@@ -0,0 +1,126 @@
+package net.heimeng.sdk.btapi.api.website;
+
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONObject;
+
+import net.heimeng.sdk.btapi.api.BaseBtApi;
+import net.heimeng.sdk.btapi.exception.BtApiException;
+import net.heimeng.sdk.btapi.model.BtResult;
+
+/**
+ * Website 模块中返回布尔结果的 API 公共基类。
+ *
+ *
统一处理标准 {@code status/msg} 响应解析,并提供常用参数校验与布尔标志位辅助方法。
+ */
+abstract class AbstractWebsiteBooleanApi extends BaseBtApi> {
+
+ private final String successMessage;
+ private final String failureMessage;
+
+ protected AbstractWebsiteBooleanApi(
+ String endpoint, String successMessage, String failureMessage) {
+ super(endpoint, HttpMethod.POST);
+ this.successMessage = successMessage;
+ this.failureMessage = failureMessage;
+ }
+
+ @Override
+ public BtResult parseResponse(String response) {
+ JSON json = WebsiteApiResponseSupport.parseJsonResponse(response, endpoint);
+ if (!(json instanceof JSONObject jsonObject)) {
+ throw new BtApiException("Website API response must be a JSON object");
+ }
+ if (!jsonObject.containsKey("status")) {
+ throw new BtApiException("Website API response is missing required status field");
+ }
+
+ boolean status = jsonObject.getBool("status", false);
+ BtResult result = new BtResult<>();
+ result.setStatus(status);
+ result.setMsg(jsonObject.getStr("msg", status ? successMessage : failureMessage));
+ result.setData(status);
+ return result;
+ }
+
+ protected final boolean hasRequiredParams(String... paramNames) {
+ for (String paramName : paramNames) {
+ if (!hasNonBlankStringParam(paramName)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected final boolean hasParam(String paramName) {
+ return params.containsKey(paramName);
+ }
+
+ protected final boolean hasNonBlankStringParam(String paramName) {
+ Object value = params.get(paramName);
+ return value instanceof String stringValue && !stringValue.isBlank();
+ }
+
+ protected final boolean hasPositiveIntegerParam(String paramName) {
+ Object value = params.get(paramName);
+ return value instanceof Number numberValue && numberValue.intValue() > 0;
+ }
+
+ protected final boolean hasNonNegativeNumberParam(String paramName) {
+ Object value = params.get(paramName);
+ return value instanceof Number numberValue && numberValue.intValue() >= 0;
+ }
+
+ protected final boolean hasOptionalNonNegativeNumberParam(String paramName) {
+ return !params.containsKey(paramName) || hasNonNegativeNumberParam(paramName);
+ }
+
+ protected final boolean hasBooleanFlagIntParam(String paramName) {
+ Object value = params.get(paramName);
+ if (!(value instanceof Number numberValue)) {
+ return false;
+ }
+ int flag = numberValue.intValue();
+ return flag == 0 || flag == 1;
+ }
+
+ protected final boolean hasOptionalBooleanFlagIntParam(String paramName) {
+ return !params.containsKey(paramName) || hasBooleanFlagIntParam(paramName);
+ }
+
+ protected final void requireNonBlank(String value, String paramName) {
+ if (value == null || value.isBlank()) {
+ throw new IllegalArgumentException(paramName + " cannot be blank");
+ }
+ }
+
+ protected final void requireNonNull(Object value, String paramName) {
+ if (value == null) {
+ throw new IllegalArgumentException(paramName + " cannot be null");
+ }
+ }
+
+ protected final void requirePositiveInteger(Integer value, String paramName) {
+ if (value == null || value <= 0) {
+ throw new IllegalArgumentException(paramName + " must be positive");
+ }
+ }
+
+ protected final void putOptionalBooleanFlag(String paramName, Boolean value) {
+ if (value == null) {
+ removeParam(paramName);
+ return;
+ }
+ addParam(paramName, value ? 1 : 0);
+ }
+
+ protected final void putOptionalNonNegativeInteger(String paramName, Integer value) {
+ if (value == null) {
+ removeParam(paramName);
+ return;
+ }
+ if (value < 0) {
+ throw new IllegalArgumentException(paramName + " cannot be negative");
+ }
+ addParam(paramName, value);
+ }
+}
diff --git a/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteMapListQueryApi.java b/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteMapListQueryApi.java
new file mode 100644
index 0000000..111ee4d
--- /dev/null
+++ b/src/main/java/net/heimeng/sdk/btapi/api/website/AbstractWebsiteMapListQueryApi.java
@@ -0,0 +1,82 @@
+package net.heimeng.sdk.btapi.api.website;
+
+import java.util.List;
+import java.util.Map;
+
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+
+import net.heimeng.sdk.btapi.api.BaseBtApi;
+import net.heimeng.sdk.btapi.exception.BtApiException;
+import net.heimeng.sdk.btapi.model.BtResult;
+
+/**
+ * Website 模块中返回 {@code List