package uploadersdk import ( "fmt" "gitlink.org.cn/cloudream/common/pkgs/types" sch "gitlink.org.cn/cloudream/common/sdks/pcmscheduler" schsdk "gitlink.org.cn/cloudream/common/sdks/scheduler" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" "gitlink.org.cn/cloudream/common/utils/http2" "gitlink.org.cn/cloudream/common/utils/serder" "net/url" "strings" ) type DataID int64 type FolderID int64 type Cluster struct { PackageID cdssdk.PackageID `gorm:"column:package_id" json:"dataID"` ClusterID schsdk.ClusterID `gorm:"column:cluster_id" json:"clusterID"` StorageID cdssdk.StorageID `gorm:"column:storage_id" json:"storageID"` } func (Cluster) TableName() string { return "uploadedCluster" // 确保和数据库中的表名一致 } type Package struct { UserID cdssdk.UserID `gorm:"column:user_id" json:"userID"` PackageID cdssdk.PackageID `gorm:"column:package_id" json:"packageID"` PackageName string `gorm:"column:package_name" json:"packageName"` DataType string `gorm:"column:data_type" json:"dataType"` JsonData string `gorm:"column:json_data" json:"jsonData"` // JSON 数据字段 BindingID DataID `gorm:"column:binding_id" json:"bindingID"` Objects []cdssdk.Object `gorm:"column:objects" json:"objects"` UploadedCluster []Cluster `gorm:"column:uploadedCluster" json:"uploadedCluster"` //UploadedCluster []Cluster `gorm:"foreignKey:package_id;references:package_id" json:"clusters"` // 关联 Cluster 数据 //BlockChain []BlockChain `gorm:"foreignKey:package_id;references:package_id" json:"blockChains"` // 关联 BlockChain 数据 } type PackageDAO struct { UserID cdssdk.UserID `gorm:"column:user_id" json:"userID"` PackageID cdssdk.PackageID `gorm:"column:package_id" json:"packageID"` PackageName string `gorm:"column:package_name" json:"packageName"` DataType string `gorm:"column:data_type" json:"dataType"` JsonData string `gorm:"column:json_data" json:"jsonData"` // JSON 数据字段 BindingID DataID `gorm:"column:binding_id" json:"bindingID"` UploadedCluster []Cluster `gorm:"foreignKey:package_id;references:package_id" json:"clusters"` // 关联 Cluster 数据 } type DataScheduleReq struct { PackageID cdssdk.PackageID `json:"packageID"` DataType string `json:"dataType"` Clusters []Cluster `json:"clusters"` } type codeRepository struct { RepositoryName string ClusterID ClusterID } type DataScheduleResp struct { Results []sch.DataScheduleResult `json:"results"` } func (c *Client) DataSchedule(req DataScheduleReq) (*DataScheduleResp, error) { targetUrl, err := url.JoinPath(c.baseURL, "/jobSet/schedule") if err != nil { return nil, err } resp, err := http2.PostJSON(targetUrl, http2.RequestParam{ Body: req, }) if err != nil { return nil, err } contType := resp.Header.Get("Content-Type") if strings.Contains(contType, http2.ContentTypeJSON) { var codeResp response[DataScheduleResp] if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { return nil, fmt.Errorf("parsing response: %w", err) } if codeResp.Code == ResponseCodeOK { return &codeResp.Data, nil } return nil, codeResp.ToError() } return nil, fmt.Errorf("unknow response content type: %s", contType) } type UploadReq struct { Type string `json:"type"` Source UploadSource `json:"source"` Target UploadTarget `json:"target"` StorageIDs []cdssdk.StorageID `json:"storageIDs"` } type UploadSource interface { Noop() } var UploadSourceTypeUnion = types.NewTypeUnion[UploadSource]( (*PackageSource)(nil), (*UrlSource)(nil), ) var _ = serder.UseTypeUnionInternallyTagged(&UploadSourceTypeUnion, "type") type PackageSource struct { serder.Metadata `union:"packageSource"` UploadSourceBase Type string `json:"type"` PackageID cdssdk.PackageID `json:"packageID"` } type UrlSource struct { serder.Metadata `union:"urlSource"` UploadSourceBase Type string `json:"type"` Url string `json:"url"` } type UploadSourceBase struct{} func (d *UploadSourceBase) Noop() {} type UploadTarget interface { Noop() } var UploadTargetTypeUnion = types.NewTypeUnion[UploadTarget]( (*UrlTarget)(nil), (*ApiTarget)(nil), ) var _ = serder.UseTypeUnionInternallyTagged(&UploadTargetTypeUnion, "type") type UrlTarget struct { serder.Metadata `union:"url"` UploadTargetBase Clusters []ClusterID `json:"clusters"` } type ApiTarget struct { serder.Metadata `union:"api"` UploadTargetBase Clusters []ClusterID `json:"clusters"` } type UploadTargetBase struct{} func (d *UploadTargetBase) Noop() {} type UploadResp struct { PackageID cdssdk.PackageID `json:"packageID"` ObjectIDs []cdssdk.ObjectID `json:"objectIDs"` JsonData string `json:"jsonData"` } func (c *Client) Upload(req UploadReq) (*UploadResp, error) { targetUrl, err := url.JoinPath(c.baseURL, "/data/upload") if err != nil { return nil, err } resp, err := http2.PostJSON(targetUrl, http2.RequestParam{ Body: req, }) if err != nil { return nil, err } contType := resp.Header.Get("Content-Type") if strings.Contains(contType, http2.ContentTypeJSON) { var codeResp response[UploadResp] if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { return nil, fmt.Errorf("parsing response: %w", err) } if codeResp.Code == ResponseCodeOK { return &codeResp.Data, nil } return nil, codeResp.ToError() } return nil, fmt.Errorf("unknow response content type: %s", contType) }