feat: add safeline deployer

This commit is contained in:
Fu Diwei
2025-02-17 16:48:33 +08:00
parent a40b078e9c
commit c72dc0d2c4
30 changed files with 586 additions and 77 deletions

View File

@@ -9,8 +9,6 @@ import (
"time"
"github.com/go-resty/resty/v2"
"github.com/usual2970/certimate/internal/pkg/utils/maps"
)
type BaoTaPanelClient struct {
@@ -113,11 +111,7 @@ func (c *BaoTaPanelClient) sendRequestWithResult(path string, params map[string]
return err
}
jsonResp := make(map[string]any)
if err := json.Unmarshal(resp.Body(), &jsonResp); err != nil {
return fmt.Errorf("baota: failed to parse response: %w", err)
}
if err := maps.Populate(jsonResp, &result); err != nil {
if err := json.Unmarshal(resp.Body(), &result); err != nil {
return fmt.Errorf("baota: failed to parse response: %w", err)
}

View File

@@ -5,6 +5,19 @@ type BaseResponse interface {
GetMsg() string
}
type baseResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
func (r *baseResponse) GetCode() int {
return r.Code
}
func (r *baseResponse) GetMsg() string {
return r.Msg
}
type AddDomainResolutionRequest struct {
ZoneName string `json:"ym"`
RecordType string `json:"lx"`
@@ -15,17 +28,8 @@ type AddDomainResolutionRequest struct {
}
type AddDomainResolutionResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data int `json:"data"`
}
func (r *AddDomainResolutionResponse) GetCode() int {
return r.Code
}
func (r *AddDomainResolutionResponse) GetMsg() string {
return r.Msg
baseResponse
Data int `json:"data"`
}
type ModifyDomainResolutionRequest struct {
@@ -39,16 +43,7 @@ type ModifyDomainResolutionRequest struct {
}
type ModifyDomainResolutionResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
func (r *ModifyDomainResolutionResponse) GetCode() int {
return r.Code
}
func (r *ModifyDomainResolutionResponse) GetMsg() string {
return r.Msg
baseResponse
}
type DeleteDomainResolutionRequest struct {
@@ -57,16 +52,7 @@ type DeleteDomainResolutionRequest struct {
}
type DeleteDomainResolutionResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
func (r *DeleteDomainResolutionResponse) GetCode() int {
return r.Code
}
func (r *DeleteDomainResolutionResponse) GetMsg() string {
return r.Msg
baseResponse
}
type ListDomainResolutionRequest struct {
@@ -76,8 +62,7 @@ type ListDomainResolutionRequest struct {
}
type ListDomainResolutionResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
baseResponse
Count int `json:"count"`
Data []*ResolutionRecord `json:"data"`
Page int `json:"page"`
@@ -92,11 +77,3 @@ type ResolutionRecord struct {
RecordValue string `json:"jxz"`
MX int `json:"mx"`
}
func (r *ListDomainResolutionResponse) GetCode() int {
return r.Code
}
func (r *ListDomainResolutionResponse) GetMsg() string {
return r.Msg
}

View File

@@ -10,8 +10,6 @@ import (
"time"
"github.com/go-resty/resty/v2"
"github.com/usual2970/certimate/internal/pkg/utils/maps"
)
type GnameClient struct {
@@ -131,9 +129,7 @@ func (c *GnameClient) sendRequest(path string, params map[string]any) (*resty.Re
resp, err := req.Post(url)
if err != nil {
return nil, fmt.Errorf("gname: failed to send request: %w", err)
}
if resp.IsError() {
} else if resp.IsError() {
return nil, fmt.Errorf("gname: unexpected status code: %d, %s", resp.StatusCode(), resp.Body())
}
@@ -146,11 +142,7 @@ func (c *GnameClient) sendRequestWithResult(path string, params map[string]any,
return err
}
jsonResp := make(map[string]any)
if err := json.Unmarshal(resp.Body(), &jsonResp); err != nil {
return fmt.Errorf("gname: failed to parse response: %w", err)
}
if err := maps.Populate(jsonResp, &result); err != nil {
if err := json.Unmarshal(resp.Body(), &result); err != nil {
return fmt.Errorf("gname: failed to parse response: %w", err)
}

View File

@@ -0,0 +1,34 @@
package safelinesdk
type BaseResponse interface {
GetErrCode() *string
GetErrMsg() *string
}
type baseResponse struct {
ErrCode *string `json:"err,omitempty"`
ErrMsg *string `json:"msg,omitempty"`
}
func (r *baseResponse) GetErrCode() *string {
return r.ErrCode
}
func (r *baseResponse) GetErrMsg() *string {
return r.ErrMsg
}
type UpdateCertificateRequest struct {
Id int32 `json:"id"`
Type int32 `json:"type"`
Manual *UpdateCertificateRequestBodyManul `json:"manual"`
}
type UpdateCertificateRequestBodyManul struct {
Crt string `json:"crt"`
Key string `json:"key"`
}
type UpdateCertificateResponse struct {
baseResponse
}

View File

@@ -0,0 +1,87 @@
package safelinesdk
import (
"encoding/json"
"fmt"
"strings"
"time"
"github.com/go-resty/resty/v2"
)
type SafeLineClient struct {
apiHost string
apiToken string
client *resty.Client
}
func NewSafeLineClient(apiHost, apiToken string) *SafeLineClient {
client := resty.New()
return &SafeLineClient{
apiHost: apiHost,
apiToken: apiToken,
client: client,
}
}
func (c *SafeLineClient) WithTimeout(timeout time.Duration) *SafeLineClient {
c.client.SetTimeout(timeout)
return c
}
func (c *SafeLineClient) UpdateCertificate(req *UpdateCertificateRequest) (*UpdateCertificateResponse, error) {
params := make(map[string]any)
jsonData, _ := json.Marshal(req)
json.Unmarshal(jsonData, &params)
result := UpdateCertificateResponse{}
err := c.sendRequestWithResult("/api/open/cert", params, &result)
if err != nil {
return nil, err
}
return &result, nil
}
func (c *SafeLineClient) sendRequest(path string, params map[string]any) (*resty.Response, error) {
if params == nil {
params = make(map[string]any)
}
url := strings.TrimRight(c.apiHost, "/") + path
req := c.client.R().
SetHeader("Content-Type", "application/json").
SetHeader("X-SLCE-API-TOKEN", c.apiToken).
SetBody(params)
resp, err := req.Post(url)
if err != nil {
return nil, fmt.Errorf("safeline: failed to send request: %w", err)
}
if resp.IsError() {
return nil, fmt.Errorf("safeline: unexpected status code: %d, %s", resp.StatusCode(), resp.Body())
}
return resp, nil
}
func (c *SafeLineClient) sendRequestWithResult(path string, params map[string]any, result BaseResponse) error {
resp, err := c.sendRequest(path, params)
if err != nil {
return err
}
if err := json.Unmarshal(resp.Body(), &result); err != nil {
return fmt.Errorf("safeline: failed to parse response: %w", err)
}
if result.GetErrCode() != nil && *result.GetErrCode() != "" {
if result.GetErrMsg() == nil {
return fmt.Errorf("safeline api error: %s", *result.GetErrCode())
} else {
return fmt.Errorf("safeline api error: %s, %s", *result.GetErrCode(), *result.GetErrMsg())
}
}
return nil
}