- go.mod module path matches repo zkcoi/Meshray-Manager (case-distinct from zkcoi/Meshray/core)
- rewrite internal imports meshray/{internal,web,pkg} -> Meshray-Manager/... (core refs kept)
- sync README.md / install.sh repo URLs; add CHANGELOG entry
142 lines
3.3 KiB
Go
142 lines
3.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.zkcoi.com/zkcoi/Meshray-Manager/internal/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// DDNSHandler DDNS 配置处理器
|
|
type DDNSHandler struct {
|
|
ddnsService *service.DDNSService
|
|
}
|
|
|
|
// NewDDNSHandler 创建 DDNS 处理器
|
|
func NewDDNSHandler(ddnsService *service.DDNSService) *DDNSHandler {
|
|
return &DDNSHandler{
|
|
ddnsService: ddnsService,
|
|
}
|
|
}
|
|
|
|
// DDNSConfigRequest DDNS 配置请求
|
|
type DDNSConfigRequest struct {
|
|
Provider string `json:"provider"`
|
|
AccessKeyID string `json:"access_key_id"`
|
|
AccessKeySecret string `json:"access_key_secret"`
|
|
Domain string `json:"domain"`
|
|
TxtRecordName string `json:"txt_record_name"`
|
|
SyncMode string `json:"sync_mode"`
|
|
RetryInterval int `json:"retry_interval"`
|
|
MaxRetries int `json:"max_retries"`
|
|
Enabled bool `json:"enabled"`
|
|
}
|
|
|
|
// GetDDNSConfig 获取 DDNS 配置
|
|
// GET /api/v1/ddns/config
|
|
func (h *DDNSHandler) GetDDNSConfig(c *gin.Context) {
|
|
config, err := h.ddnsService.GetConfig(c.Request.Context())
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"data": config,
|
|
})
|
|
}
|
|
|
|
// UpdateDDNSConfig 更新 DDNS 配置
|
|
// PUT /api/v1/ddns/config
|
|
func (h *DDNSHandler) UpdateDDNSConfig(c *gin.Context) {
|
|
var req DDNSConfigRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "参数错误:" + err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
if req.Provider == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "请选择 DNS 提供商",
|
|
})
|
|
return
|
|
}
|
|
if req.AccessKeyID == "" || req.AccessKeySecret == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "请输入完整的访问密钥",
|
|
})
|
|
return
|
|
}
|
|
if req.Domain == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "请输入域名",
|
|
})
|
|
return
|
|
}
|
|
if req.TxtRecordName == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "请输入 TXT 记录名称",
|
|
})
|
|
return
|
|
}
|
|
|
|
if err := h.ddnsService.UpdateConfig(c.Request.Context(), req); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "配置已保存",
|
|
})
|
|
}
|
|
|
|
// TestDDNSRequest 测试请求
|
|
type TestDDNSRequest struct {
|
|
Provider string `json:"provider"`
|
|
AccessKeyID string `json:"access_key_id"`
|
|
AccessKeySecret string `json:"access_key_secret"`
|
|
Domain string `json:"domain"`
|
|
TxtRecordName string `json:"txt_record_name"`
|
|
}
|
|
|
|
// TestDDNSConnectivity 测试 DDNS 连通性
|
|
// POST /api/v1/ddns/test
|
|
func (h *DDNSHandler) TestDDNSConnectivity(c *gin.Context) {
|
|
var req TestDDNSRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "参数错误:" + err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
results := h.ddnsService.TestConnectivity(c.Request.Context(), req)
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"data": gin.H{
|
|
"results": results,
|
|
},
|
|
})
|
|
}
|
|
|
|
// SyncDDNS 手动同步 DDNS
|
|
// POST /api/v1/ddns/sync
|
|
func (h *DDNSHandler) SyncDDNS(c *gin.Context) {
|
|
if err := h.ddnsService.SyncNow(c.Request.Context()); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "同步成功",
|
|
})
|
|
}
|