feat: add gcore uploader

This commit is contained in:
Fu Diwei
2025-02-17 22:05:08 +08:00
parent e2a148c25f
commit ea02190ad5
5 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
package gcorecdn
import (
"context"
"errors"
"fmt"
"time"
gprovider "github.com/G-Core/gcorelabscdn-go/gcore/provider"
gsslcerts "github.com/G-Core/gcorelabscdn-go/sslcerts"
xerrors "github.com/pkg/errors"
"github.com/usual2970/certimate/internal/pkg/core/uploader"
gcoresdk "github.com/usual2970/certimate/internal/pkg/vendors/gcore-sdk/common"
)
type GcoreCDNUploaderConfig struct {
// Gcore API Token。
ApiToken string `json:"apiToken"`
}
type GcoreCDNUploader struct {
config *GcoreCDNUploaderConfig
sdkClient *gsslcerts.Service
}
var _ uploader.Uploader = (*GcoreCDNUploader)(nil)
func New(config *GcoreCDNUploaderConfig) (*GcoreCDNUploader, error) {
if config == nil {
return nil, errors.New("config is nil")
}
client, err := createSdkClient(config.ApiToken)
if err != nil {
return nil, xerrors.Wrap(err, "failed to create sdk client")
}
return &GcoreCDNUploader{
config: config,
sdkClient: client,
}, nil
}
func (u *GcoreCDNUploader) Upload(ctx context.Context, certPem string, privkeyPem string) (res *uploader.UploadResult, err error) {
// 生成新证书名(需符合 Gcore 命名规则)
var certId, certName string
certName = fmt.Sprintf("certimate_%d", time.Now().UnixMilli())
// 新增证书
// REF: https://api.gcore.com/docs/cdn#tag/CA-certificates/operation/ca_certificates-add
createCertificateReq := &gsslcerts.CreateRequest{
Name: certName,
Cert: certPem,
PrivateKey: privkeyPem,
Automated: false,
ValidateRootCA: false,
}
createCertificateResp, err := u.sdkClient.Create(context.TODO(), createCertificateReq)
if err != nil {
return nil, xerrors.Wrap(err, "failed to execute sdk request 'sslcerts.Create'")
}
certId = fmt.Sprintf("%d", createCertificateResp.ID)
certName = createCertificateResp.Name
return &uploader.UploadResult{
CertId: certId,
CertName: certName,
}, nil
}
func createSdkClient(apiToken string) (*gsslcerts.Service, error) {
requester := gprovider.NewClient(
gcoresdk.BASE_URL,
gprovider.WithSigner(gcoresdk.NewAuthRequestSigner(apiToken)),
)
service := gsslcerts.NewService(requester)
return service, nil
}

View File

@@ -0,0 +1,3 @@
package common
const BASE_URL = "https://api.gcore.com"

View File

@@ -0,0 +1,24 @@
package common
import (
"net/http"
"github.com/G-Core/gcorelabscdn-go/gcore"
)
type AuthRequestSigner struct {
apiToken string
}
var _ gcore.RequestSigner = (*AuthRequestSigner)(nil)
func NewAuthRequestSigner(apiToken string) *AuthRequestSigner {
return &AuthRequestSigner{
apiToken: apiToken,
}
}
func (s *AuthRequestSigner) Sign(req *http.Request) error {
req.Header.Set("Authorization", "APIKey "+s.apiToken)
return nil
}