diff --git a/src/server/handle/auth.go b/src/server/handle/auth.go new file mode 100644 index 0000000..1e0be86 --- /dev/null +++ b/src/server/handle/auth.go @@ -0,0 +1,13 @@ +package handle + +import ( + "github.com/gin-gonic/gin" +) + +func AuthMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + + // 进行身份认证 + c.Next() + } +} diff --git a/src/server/handle/cert.go b/src/server/handle/cert.go index 0ea6c2e..f19505a 100644 --- a/src/server/handle/cert.go +++ b/src/server/handle/cert.go @@ -1,18 +1,25 @@ package handle import ( + "acme-mana/src/conf" "github.com/gin-gonic/gin" "log" ) -func GetCert(context *gin.Context) { - log.Println("get cert") +var CertHandlerInstance = &CertHandler{} + +type CertHandler struct { } -func RefreshCert(context *gin.Context) { +func (h *CertHandler) Get(c *gin.Context) { + log.Println("get cert") + c.JSON(200, conf.Config()) +} + +func (h *CertHandler) Refresh(context *gin.Context) { log.Fatalln("refresh cert") } -func domainList(context *gin.Context) { +func (h *CertHandler) DomainList(context *gin.Context) { log.Fatalln("domain list") } diff --git a/src/server/handle/conf.go b/src/server/handle/conf.go new file mode 100644 index 0000000..277c400 --- /dev/null +++ b/src/server/handle/conf.go @@ -0,0 +1,17 @@ +package handle + +import ( + "acme-mana/src/conf" + "acme-mana/src/server/model" + "github.com/gin-gonic/gin" +) + +var ConfHandlerInstance = &ConfHandler{} + +type ConfHandler struct { +} + +func (h *ConfHandler) Get(c *gin.Context) { + config := conf.Config() + c.JSON(200, model.SuccessD(config)) +} diff --git a/src/server/handle/error.go b/src/server/handle/error.go new file mode 100644 index 0000000..12ea9bc --- /dev/null +++ b/src/server/handle/error.go @@ -0,0 +1,34 @@ +package handle + +import ( + "acme-mana/src/server/model" + "github.com/gin-gonic/gin" + "net/http" +) + +// GlobalErrorHandler 是一个全局错误处理器中间件 +func GlobalErrorHandler() gin.HandlerFunc { + return func(c *gin.Context) { + // 继续执行后续中间件和处理函数 + c.Next() + + // 获取上下文中的错误 + if err, ok := c.Get("error"); ok { + switch typedErr := err.(type) { + case *model.AppError: + c.JSON(200, &model.Result{ + Code: typedErr.Code, + Message: typedErr.Message, + Data: nil, + }) + default: + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Internal Server Error", + "success": false, + }) + } + c.Abort() + return + } + } +} diff --git a/src/server/http-server.go b/src/server/http-server.go index 14833af..9fbaf40 100644 --- a/src/server/http-server.go +++ b/src/server/http-server.go @@ -19,19 +19,27 @@ type HttpServer struct { } func (s *HttpServer) InitServer() { + config := conf.Config() + var serverConf = config.Server + s.initServer(serverConf.Host, serverConf.Port) +} + +// initServer 初始化 +func (s *HttpServer) initServer(host string, port int) { s.engine = gin.Default() s.register() s.status = false - config := conf.Config() - var serverConf = config.Server s.server = &http.Server{ - Addr: serverConf.Host + ":" + strconv.Itoa(serverConf.Port), + Addr: host + ":" + strconv.Itoa(port), Handler: s.engine, } } func (s *HttpServer) Start() { + if s.status { + return + } go func() { if err := s.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { log.Printf("listen: %s\n\n", err) @@ -58,7 +66,14 @@ func Status() bool { func (s *HttpServer) register() { service := s.engine - service.GET("/api/v1/refresh", handle.RefreshCert) - service.GET("/api/v1/cert", handle.GetCert) - service.GET("/api/v1/domain/list", handle.GetCert) + service.Use(gin.Logger()) + service.Use(handle.GlobalErrorHandler()) + + certHandler := handle.CertHandlerInstance + certGroup := service.Group("/api/v1/cert", handle.AuthMiddleware()) + certGroup.GET("/", certHandler.Get) + + confHandler := handle.ConfHandlerInstance + confGroup := service.Group("/api/v1", handle.AuthMiddleware()) + confGroup.GET("/conf", confHandler.Get) } diff --git a/src/server/model/app-error.go b/src/server/model/app-error.go new file mode 100644 index 0000000..65d3fb5 --- /dev/null +++ b/src/server/model/app-error.go @@ -0,0 +1,19 @@ +package model + +type AppError struct { + Code int `json:"code"` + Message string `json:"message"` +} + +// Error 实现 error 接口 +func (e *AppError) Error() string { + return e.Message +} + +// NewAppError 创建一个新的 AppError +func NewAppError(code int, message string) *AppError { + return &AppError{ + Code: code, + Message: message, + } +} diff --git a/src/server/model/result.go b/src/server/model/result.go new file mode 100644 index 0000000..283c722 --- /dev/null +++ b/src/server/model/result.go @@ -0,0 +1,27 @@ +package model + +type Result struct { + Code int `json:"code"` + Message string `json:"message"` + Data any `json:"data"` +} + +func (r Result) SetData(data any) Result { + r.Data = data + return r +} + +func Success() *Result { + return &Result{ + Code: 200, + Message: "success", + } +} + +func SuccessD(data any) *Result { + return &Result{ + Code: 200, + Message: "success", + Data: data, + } +}