feat: migrate all remaining modules from rainyun-go-sdk

- domain(24), product(8), rbm(10), rca(21), rgs(38), ros(19),
  ssl(5), user(10), workorder(11), public remaining 5
- split nested response structs into reusable named types
- rgs reuses rcs request/response types
- fix source bugs: malformed paths, resp vs &resp, missing bodies
- register all 11 services in sdk.New
This commit is contained in:
2026-08-05 23:09:53 +08:00
parent b8490ef422
commit 51b7e2f319
56 changed files with 4267 additions and 2 deletions
+196
View File
@@ -0,0 +1,196 @@
package ros
import (
"fmt"
"github.com/XingfenD/rainyun_api_go_sdk/apis/common"
"github.com/XingfenD/rainyun_api_go_sdk/constant"
)
// 创建对象存储桶请求
type CreateRosBucketRequest struct {
BucketName string `json:"bucket_name"` // 存储桶名称
InstanceID int `json:"instance_id"` // 实例ID
}
// 创建对象存储桶响应
type CreateRosBucketResponse struct {
Code int `json:"code"`
Data RosBucket `json:"data"`
}
// 获取对象存储桶列表请求
type GetRosBucketListRequest struct {
Options common.StandQueryParameters `json:"options"`
}
// 获取对象存储桶列表响应
type GetRosBucketListResponse struct {
Code int `json:"code"`
Data RosBucketList `json:"data"`
}
// 对象存储桶列表
type RosBucketList struct {
TotalRecords int `json:"TotalRecords"`
Records []RosBucket `json:"Records"`
}
// 获取对象存储桶详情响应
type GetRosBucketDetailResponse struct {
Code int `json:"code"`
Data RosBucketDetail `json:"data"`
}
// 对象存储桶详情
type RosBucketDetail struct {
Data RosBucket `json:"Data"`
}
// 修改存储桶Proxy设置请求
// 一个请求只能设置一项设置,要设置的设置项需要放在 Setting 中,只需要写需要修改的设置项,其他不填
type ModifyRosBucketProxySettingsRequest struct {
DomainList []string `json:"domain_list,omitempty"` // 域名列表
GzipSettings RosGzipSettings `json:"gzip_settings,omitempty"`
IPRestrictSettings RosIPRestrictSettings `json:"ip_restrict_settings,omitempty"`
RefererRestrictSettings RosRefererRestrictSettings `json:"referer_restrict_settings,omitempty"`
Setting string `json:"setting"` // 必选项,要设置的选项(domain/ssl/waf/gzip/ip_restrict/referer_restrict)
SslSettings RosSslSettings `json:"ssl_settings,omitempty"`
WafSettings RosWafSettings `json:"waf_settings,omitempty"`
}
// Gzip设置
type RosGzipSettings struct {
CompressLevel int `json:"compress_level,omitempty"` // 压缩等级(1-5,默认为2)
FileTypes []string `json:"file_types,omitempty"` // 文件MIME类型,默认["*"]
IsEnable bool `json:"is_enable,omitempty"` // 是否启用GZIP压缩,默认启用
}
// IP访问限制设置
type RosIPRestrictSettings struct {
Blacklist []string `json:"blacklist,omitempty"` // 黑名单IP或CIDR范围列表,和白名单列表只能二选一不能共存
IsEnable bool `json:"is_enable,omitempty"` // 是否启用IP访问限制
Whitelist []string `json:"whitelist,omitempty"` // 白名单IP或CIDR范围列表,和黑名单列表只能二选一不能共存
}
// Referer防盗链设置
type RosRefererRestrictSettings struct {
Blacklist []string `json:"blacklist,omitempty"` // 黑名单域名列表,和白名单列表只能二选一不能共存
BypassMissing bool `json:"bypass_missing,omitempty"` // 是否允许Referer请求头不存在或者格式有误
IsEnable bool `json:"is_enable,omitempty"` // 是否启用Referer防盗链
Whitelist []string `json:"whitelist,omitempty"` // 白名单域名列表,和黑名单列表只能二选一不能共存
}
// SSL设置,SSL证书会自动匹配
type RosSslSettings struct {
IsEnable bool `json:"is_enable,omitempty"` // 是否启用SSL
IsForce bool `json:"is_force,omitempty"` // 是否强制使用SSL
}
// WAF防火墙设置
type RosWafSettings struct {
BlockTime int `json:"block_time,omitempty"` // 未通过JS验证时的封禁时间,秒
GlobalJsCheck bool `json:"global_js_check,omitempty"` // 是否启用全局JS检查,只有超过阈值才会生效
GlobalQPS int `json:"global_qps,omitempty"` // 全局访问速率限制,超过会被拒绝
IsEnable bool `json:"is_enable,omitempty"` // 是否启用WAF防火墙
PerIPJsCheck bool `json:"per_ip_js_check,omitempty"` // 是否启用单IP JS检查,只有超过阈值才会生效
PerIPQPS int `json:"per_ip_qps,omitempty"` // 单个IP访问速率限制,超过会被拒绝
}
// 获取对象存储桶列表
//
// ⚠️注意这个接口是拿不到AK和SK的,响应里面的AK和SK都是空的
func (s *RosService) GetRosBucketList(req *GetRosBucketListRequest) (*GetRosBucketListResponse, error) {
path := "/product/ros/bucket/"
var resp GetRosBucketListResponse
querys, err := common.MarshalQueryParams(req)
if err != nil {
return nil, err
}
err = s.client.Do(constant.HTTPMethod_GET, path, querys, nil, &resp)
return &resp, err
}
// 创建对象存储桶
//
// req: 创建参数(bucketName 存储桶名 >= 3 字符 <= 63 字符)
func (s *RosService) CreateRosBucket(req CreateRosBucketRequest) (*CreateRosBucketResponse, error) {
path := "/product/ros/bucket"
var resp CreateRosBucketResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, req, &resp)
return &resp, err
}
// 获取对象存储桶详情
//
// bucketID: 存储桶ID
func (s *RosService) GetRosBucketDetail(bucketID int) (*GetRosBucketDetailResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d", bucketID)
var resp GetRosBucketDetailResponse
err := s.client.Do(constant.HTTPMethod_GET, path, nil, nil, &resp)
return &resp, err
}
// 删除对象存储桶
//
// bucketID: 存储桶ID
func (s *RosService) DeleteRosBucket(bucketID int) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d", bucketID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_DELETE, path, nil, nil, &resp)
return &resp, err
}
// 获取对象存储桶监控数据
//
// bucketID: 存储桶ID
//
// req: 开始时间/结束时间(timestamp)
func (s *RosService) GetRosBucketMonitorData(bucketID int, req *GetRosMonitorDataRequest) (*GetRosMonitorDataResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d/monitor", bucketID)
var resp GetRosMonitorDataResponse
querys, err := common.MarshalQueryParams(req)
if err != nil {
return nil, err
}
err = s.client.Do(constant.HTTPMethod_GET, path, querys, nil, &resp)
return &resp, err
}
// 修改存储桶Proxy设置
//
// bucketID: 存储桶ID
func (s *RosService) ModifyRosBucketProxySettings(bucketID int, req *ModifyRosBucketProxySettingsRequest) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d/proxy", bucketID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_PATCH, path, nil, req, &resp)
return &resp, err
}
// 对象存储桶重新生成密钥
//
// bucketID: 存储桶ID
func (s *RosService) ReGenerateRosBucketKeys(bucketID int) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d/regenerate-keys", bucketID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, nil, &resp)
return &resp, err
}
// 开关对象存储桶匿名访问
//
// bucketID: 存储桶ID
func (s *RosService) SetRosBucketPublicAccess(bucketID int) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/bucket/%d/toggle-public-access", bucketID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, nil, &resp)
return &resp, err
}
+11
View File
@@ -0,0 +1,11 @@
package ros
import "github.com/XingfenD/rainyun_api_go_sdk/apis"
type RosService struct {
client *apis.RyClient
}
func NewRosService(c *apis.RyClient) *RosService {
return &RosService{client: c}
}
+224
View File
@@ -0,0 +1,224 @@
package ros
import (
"fmt"
"github.com/XingfenD/rainyun_api_go_sdk/apis/common"
"github.com/XingfenD/rainyun_api_go_sdk/constant"
)
// 创建对象存储实例请求
type CreateRosInstanceRequest struct {
Duration int `json:"duration"` // 购买时长(月)
PlanID int `json:"plan_id"` // 套餐ID
WithCouponID int `json:"with_coupon_id"` // 优惠券ID
}
// 创建对象存储实例响应
type CreateRosInstanceResponse struct {
Code int `json:"code"`
Data RosInstance `json:"data"`
}
// 获取对象存储实例列表请求
type GetRosInstanceListRequest struct {
Options common.StandQueryParameters `json:"options"`
}
// 获取对象存储实例列表响应
type GetRosInstanceListResponse struct {
Code int `json:"code"`
Data RosInstanceList `json:"data"`
}
// 对象存储实例列表
type RosInstanceList struct {
TotalRecords int `json:"TotalRecords"`
Records []RosInstance `json:"Records"`
}
// 获取对象存储实例详情响应
type GetRosInstanceDetailResponse struct {
Code int `json:"code"`
Data RosInstanceDetail `json:"data"`
}
// 对象存储实例详情
type RosInstanceDetail struct {
Data RosInstance `json:"Data"`
RenewPointPrice RosRenewPointPrice `json:"RenewPointPrice"` // 积分续费
}
// 对象存储积分续费价格
type RosRenewPointPrice struct {
Num7 int `json:"7"` // 积分续费七天
Num31 int `json:"31"` // 积分续费一个月
}
// ROS实例续费请求
type RenewRosInstanceRequest struct {
Duration int `json:"duration"` // 续费时长(月)
WithCouponID int `json:"with_coupon_id"` // 优惠券ID
}
// ROS实例自动续费选项
type RosInstanceAutoRenewOption struct {
AutoRenewOption bool `json:"auto_renew_option"`
}
// ROS实例缩放请求
type ScaleRosInstanceRequest struct {
DestPlan int `json:"dest_plan"` // 目标套餐ID
WithCouponID int `json:"with_coupon_id"` // 优惠券ID
}
// 设置对象存储实例标签请求
type SetRosInstanceTagRequest struct {
TagName string `json:"tag_name"`
}
// 开关对象存储实例的弹性计费选项请求
type ToggleRosInstanceExtraAccountingRequest struct {
IsEnable bool `json:"is_enable"`
}
// 创建对象存储实例
//
// req: 创建参数
func (s *RosService) CreateRosInstance(req CreateRosInstanceRequest) (*CreateRosInstanceResponse, error) {
path := "/product/ros/instance"
var resp CreateRosInstanceResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, req, &resp)
return &resp, err
}
// 获取对象存储实例详情
//
// instanceID: 实例ID
func (s *RosService) GetRosInstanceDetail(instanceID int) (*GetRosInstanceDetailResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d", instanceID)
var resp GetRosInstanceDetailResponse
err := s.client.Do(constant.HTTPMethod_GET, path, nil, nil, &resp)
return &resp, err
}
// 获取对象存储实例列表
//
// ⚠️注意这个接口是拿不到AK和SK的,响应里面的AK和SK都是空的
func (s *RosService) GetRosInstanceList(req *GetRosInstanceListRequest) (*GetRosInstanceListResponse, error) {
path := "/product/ros/instance/"
var resp GetRosInstanceListResponse
querys, err := common.MarshalQueryParams(req)
if err != nil {
return nil, err
}
err = s.client.Do(constant.HTTPMethod_GET, path, querys, nil, &resp)
return &resp, err
}
// 获取对象存储实例监控数据
//
// instanceID: 实例ID
//
// req: 开始时间/结束时间(timestamp)
func (s *RosService) GetRosInstanceMonitorData(instanceID int, req *GetRosMonitorDataRequest) (*GetRosMonitorDataResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/monitor", instanceID)
var resp GetRosMonitorDataResponse
querys, err := common.MarshalQueryParams(req)
if err != nil {
return nil, err
}
err = s.client.Do(constant.HTTPMethod_GET, path, querys, nil, &resp)
return &resp, err
}
// 对象存储实例续费
//
// instanceID: 实例ID
//
// req: 续费参数
func (s *RosService) RenewRosInstance(instanceID int, req RenewRosInstanceRequest) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/renew", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, req, &resp)
return &resp, err
}
// 对象存储实例自动续费选项
//
// instanceID: 实例ID
//
// isOpen: 是否开启自动续费
func (s *RosService) SetRosInstanceAutoRenewOption(instanceID int, isOpen bool) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/renew/option", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, RosInstanceAutoRenewOption{AutoRenewOption: isOpen}, &resp)
return &resp, err
}
// ROS实例缩放
//
// instanceID: 实例ID
//
// req: 缩放参数
func (s *RosService) ScaleRosInstance(instanceID int, req ScaleRosInstanceRequest) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/scale", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, req, &resp)
return &resp, err
}
// 设置对象存储实例标签
//
// instanceID: 实例ID
//
// tag: 标签
func (s *RosService) SetRosInstanceTags(instanceID int, tag string) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/tag", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_PATCH, path, nil, SetRosInstanceTagRequest{TagName: tag}, &resp)
return &resp, err
}
// 开关对象存储实例的弹性计费选项
//
// instanceID: 实例ID
//
// isEnable: 是否开启
func (s *RosService) ToggleRosInstanceExtraAccounting(instanceID int, isEnable bool) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/toggle-extra-accounting", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_PATCH, path, nil, ToggleRosInstanceExtraAccountingRequest{IsEnable: isEnable}, &resp)
return &resp, err
}
// 对象存储实例重新生成密钥
//
// instanceID: 实例ID
func (s *RosService) ReGenerateRosInstanceKeys(instanceID int) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/regenerate-keys", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, nil, &resp)
return &resp, err
}
// 开关对象存储实例匿名访问
//
// instanceID: 实例ID
func (s *RosService) SetRosInstancePublicAccess(instanceID int) (*common.BasicOperationResponse, error) {
path := fmt.Sprintf("/product/ros/instance/%d/toggle-public-access", instanceID)
var resp common.BasicOperationResponse
err := s.client.Do(constant.HTTPMethod_POST, path, nil, nil, &resp)
return &resp, err
}
+141
View File
@@ -0,0 +1,141 @@
package ros
// RosNode 节点信息
type RosNode struct {
UUID string `json:"UUID"`
AuthKey string `json:"AuthKey"`
Region string `json:"Region"`
IPRegion string `json:"IpRegion"`
Machine string `json:"Machine"`
Product string `json:"Product"`
Subtype string `json:"Subtype"`
ChineseName string `json:"ChineseName"`
PhysicalNode string `json:"PhysicalNode"`
Config string `json:"Config"`
Stock any `json:"Stock"`
StatusData string `json:"StatusData"`
ShowMonitorData string `json:"ShowMonitorData"`
UpdateTime string `json:"UpdateTime"`
GitRepositoryName string `json:"GitRepositoryName"`
CertifyRequired bool `json:"CertifyRequired"`
IsDisableBackup bool `json:"IsDisableBackup"`
IsHidden bool `json:"IsHidden"`
NodeName string `json:"NodeName"`
}
// RosPlan 套餐信息
type RosPlan struct {
ID int `json:"id"`
Region string `json:"region"`
Subtype string `json:"subtype"`
PlanName string `json:"plan_name"`
Machine string `json:"machine"`
ChargeType string `json:"charge_type"`
Chinese string `json:"chinese"`
IsFree bool `json:"is_free"`
PointRenewPrice any `json:"point_renew_price"`
IsSelling bool `json:"is_selling"`
Price int `json:"price"`
StorageSize int `json:"storage_size"`
Bandwidth int `json:"bandwidth"`
ExtraTransferPrice float64 `json:"extra_transfer_price"`
ExtraStoragePrice float64 `json:"extra_storage_price"`
}
// RosUsageData 实例使用数据
type RosUsageData struct {
MetricsUsageTotalBytes int `json:"metrics_usage_total_bytes"` // 存储使用量
MetricsReceivedBytes int `json:"metrics_received_bytes"` // 接收字节数
MetricsSentBytes int `json:"metrics_sent_bytes"` // 发送字节数
MetricsRequests int `json:"metrics_requests"` // 请求数
SpeedReceivedBytes int `json:"speed_received_bytes"` // 接收字节速度
SpeedSentBytes int `json:"speed_sent_bytes"` // 发送字节速度
SpeedRequests int `json:"speed_requests"` // 请求速度
UpdateTime int `json:"UpdateTime"` // 更新时间
}
// RosInstance 对象存储实例信息
type RosInstance struct {
ID int `json:"ID"`
UID int `json:"UID"`
PlanID int `json:"PlanID"`
CreateDate int `json:"CreateDate"` // 创建时间
NodeUUID string `json:"NodeUUID"` // 节点UUID
Node RosNode `json:"Node"` // 节点信息
Status string `json:"Status"`
StopReason string `json:"StopReason"`
RewardPointsToBeCollect int `json:"RewardPointsToBeCollect"` // 待领取积分奖励
Tag string `json:"Tag"`
Plan RosPlan `json:"Plan"`
AccessKey string `json:"access_key"` // ⚠️列表接口拿不到AK,响应里面的AK是空的
SecretKey string `json:"secret_key"` // ⚠️列表接口拿不到SK,响应里面的SK是空的
IsPublicAccess bool `json:"is_public_access"` // 是否允许公共访问
IsEnableExtraAccounting bool `json:"is_enable_extra_accounting"` // 是否启用额外计费
LastResetDate int `json:"last_reset_date"` // 最后重置时间
NextResetDate int `json:"next_reset_date"` // 下次重置时间
ExpDate int `json:"ExpDate"` // 到期时间
ExpireNotice int `json:"ExpireNotice"`
AutoRenew bool `json:"AutoRenew"` // 是否自动续费
UnsubscribeAble bool `json:"UnsubscribeAble"`
Try bool `json:"Try"` // 是否试用
PublicAPIURL string `json:"public_api_url"`
Buckets any `json:"buckets"`
ExtraPayTime int `json:"extra_pay_time"`
UsageData RosUsageData `json:"UsageData"`
Restrictions string `json:"restrictions"`
PublicAccessRestricted bool `json:"public_access_restricted"`
}
// RosBucket 对象存储桶信息
type RosBucket struct {
ID int `json:"id"` // 存储桶ID
Name string `json:"name"` // 存储桶名称
UID int `json:"uid"` // 用户ID
CreateDate int `json:"create_date"`
AccessKey string `json:"access_key"` // ⚠️列表接口拿不到AK,响应里面的AK是空的
SecretKey string `json:"secret_key"` // ⚠️列表接口拿不到SK,响应里面的SK是空的
IsPublicAccess bool `json:"is_public_access"` // 是否公开
InstanceID int `json:"instance_id"` // 实例ID
Instance RosInstance `json:"Instance"`
StopReason string `json:"stop_reason"`
DomainList any `json:"DomainList"`
SslIsEnable bool `json:"ssl_is_enable"`
SSLCertList any `json:"SSLCertList"`
SslAutoRedirect bool `json:"ssl_auto_redirect"`
WafIsEnable bool `json:"waf_is_enable"`
WafGlobalQPS int `json:"waf_global_qps"`
WafPerIPQPS int `json:"waf_per_ip_qps"`
WafBlockTime int `json:"waf_block_time"`
WafGlobalJsCheck bool `json:"waf_global_js_check"`
WafPerIPJsCheck bool `json:"waf_per_ip_js_check"`
RefererRestrictIsEnable bool `json:"referer_restrict_is_enable"`
RefererRestrictWhitelist any `json:"RefererRestrictWhitelist"`
RefererRestrictBlacklist any `json:"RefererRestrictBlacklist"`
RefererRestrictBypassMissing bool `json:"referer_restrict_bypass_missing"`
IPRestrictIsEnable bool `json:"ip_restrict_is_enable"`
IPRestrictWhitelist any `json:"IPRestrictWhitelist"`
IPRestrictBlacklist any `json:"IPRestrictBlacklist"`
GzipIsEnable bool `json:"gzip_is_enable"`
GzipCompressLevel int `json:"gzip_compress_level"`
UsageData RosUsageData `json:"UsageData"`
ReadyDelete bool `json:"ready_delete"`
}
// 获取监控数据请求(桶和实例通用)
type GetRosMonitorDataRequest struct {
StartDate int `json:"start_date"` // 开始时间(timestamp)
EndDate int `json:"end_date"` // 结束时间(timestamp)
}
// 获取监控数据响应(桶和实例通用)
type GetRosMonitorDataResponse struct {
Code int `json:"code"`
Data RosMonitorData `json:"data"`
}
// RosMonitorData 对象存储监控数据(桶和实例通用)
type RosMonitorData struct {
Columns []string `json:"Columns"`
Values [][]any `json:"Values"`
}