184 lines
5.2 KiB
Go
184 lines
5.2 KiB
Go
package ufsdk
|
||
|
||
import (
|
||
"encoding/json"
|
||
"errors"
|
||
"net/http"
|
||
"net/url"
|
||
"strconv"
|
||
)
|
||
|
||
type response interface {
|
||
Error() error
|
||
}
|
||
|
||
//BucketResponse 用于 Bucket 模块返回的数据。
|
||
type BucketResponse struct {
|
||
RetCode int `json:"RetCode,omitempty"`
|
||
Action string `json:"Action,omitempty"`
|
||
BucketName string `json:"BucketName,omitempty"`
|
||
BucketID string `json:"BucketId,omitempty"`
|
||
Message string `json:"Message,omitempty"`
|
||
}
|
||
|
||
func (b BucketResponse) Error() error {
|
||
if b.RetCode != 0 {
|
||
return errors.New(b.Message)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (b BucketResponse) String() string {
|
||
return structPrettyStr(b)
|
||
}
|
||
|
||
//DomainSet 用于 BucketDataSet 里面的 Domain 字段
|
||
type DomainSet struct {
|
||
Src []string `json:"Src,omitempty"`
|
||
Cdn []string `json:"Cdn,omitempty"`
|
||
CustomSrc []string `json:"CustomSrc,omitempty"`
|
||
CustomCdn []string `json:"CustomCdn,omitempty"`
|
||
}
|
||
|
||
//BucketDataSet 用于 BucketListResponse 里面的 DataSet 字段
|
||
type BucketDataSet struct {
|
||
BucketName string `json:"BucketName,omitempty"`
|
||
BucketID string `json:"BucketId,omitempty"`
|
||
Domain DomainSet `json:"Domain,omitempty"`
|
||
Type string `json:"Type,omitempty"`
|
||
CreateTime int `json:"CreateTime,omitempty"`
|
||
ModifyTime int `json:"ModifyTime,omitempty"`
|
||
CdnDomainID []string `json:"CdnDomainId,omitempty"`
|
||
Biz string `json:"Biz,omitempty"`
|
||
Region string `json:"Region,omitempty"`
|
||
HasUserDomain int `json:"HasUserDomain,omitempty"`
|
||
}
|
||
|
||
//BucketListResponse 用于 DescribeBucket 返回的数据。
|
||
type BucketListResponse struct {
|
||
RetCode int `json:"RetCode,omitempty"`
|
||
Action string `json:"Action,omitempty"`
|
||
Message string `json:"Message,omitempty"`
|
||
DataSet []BucketDataSet `json:"DataSet,omitempty"`
|
||
}
|
||
|
||
func (b BucketListResponse) Error() error {
|
||
if b.RetCode != 0 {
|
||
return errors.New(b.Message)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
//String 把 BucketListResponse 里面的字段格式化。
|
||
func (b BucketListResponse) String() string {
|
||
return structPrettyStr(b)
|
||
}
|
||
|
||
//CreateBucket 创建一个 bucket, bucketName 必须全部为小写字母,不能带符号和特殊字符。
|
||
//
|
||
//region 表示 ufile 所在的可用区,目前支持北京,香港,广州,上海二,雅加达,洛杉矶。一下是可用区值的映射:
|
||
//
|
||
//北京 cn-bj
|
||
//
|
||
//广州 cn-gd
|
||
//
|
||
//可用区以控制台列出来的为准,更多可用区具体的值在 https://docs.ucloud.cn/api/summary/regionlist 查看。
|
||
//
|
||
//bucketType 可以填 public(公有空间) 和 private(私有空间)
|
||
//projectID bucket 所在的项目 ID,可为空。
|
||
func (u *UFileRequest) CreateBucket(bucketName, region, bucketType, projectID string) (bucket BucketResponse, err error) {
|
||
query := url.Values{}
|
||
query.Add("Action", "CreateBucket")
|
||
query.Add("BucketName", bucketName)
|
||
query.Add("Type", bucketType)
|
||
query.Add("Region", region)
|
||
|
||
if projectID != "" {
|
||
query.Add("ProjectId", projectID)
|
||
}
|
||
|
||
err = u.bucketRequest(query, &bucket)
|
||
return
|
||
}
|
||
|
||
//DeleteBucket 删除一个 bucket,如果成功,status code 会返回 204 no-content
|
||
func (u *UFileRequest) DeleteBucket(bucketName, projectID string) (bucket BucketResponse, err error) {
|
||
query := url.Values{}
|
||
query.Add("Action", "DeleteBucket")
|
||
query.Add("BucketName", bucketName)
|
||
if projectID != "" {
|
||
query.Add("ProjectId", projectID)
|
||
}
|
||
|
||
err = u.bucketRequest(query, &bucket)
|
||
return
|
||
}
|
||
|
||
//UpdateBucket 更新一个 bucket,你可以改 bucket 的类型(私有或公有)和 项目 ID。
|
||
//bucketType 填公有(public)或私有(private)。
|
||
//projectID 没有可以填空("")。
|
||
func (u *UFileRequest) UpdateBucket(bucketName, bucketType, projectID string) (bucket BucketResponse, err error) {
|
||
query := url.Values{}
|
||
query.Add("Action", "UpdateBucket")
|
||
query.Add("BucketName", bucketName)
|
||
query.Add("Type", bucketType)
|
||
if projectID != "" {
|
||
query.Add("ProjectId", projectID)
|
||
}
|
||
|
||
err = u.bucketRequest(query, &bucket)
|
||
return
|
||
}
|
||
|
||
//DescribeBucket 获取 bucket 的详细信息,如果 bucketName 为空,返回当前账号下所有的 bucket。
|
||
//limit 是限制返回的 bucket 列表数量。
|
||
//offset 是列表的偏移量,默认为 0。
|
||
//projectID 可为空。
|
||
func (u *UFileRequest) DescribeBucket(bucketName string, offset, limit int, projectID string) (list BucketListResponse, err error) {
|
||
query := url.Values{}
|
||
query.Add("Action", "DescribeBucket")
|
||
if bucketName != "" {
|
||
query.Add("BucketName", bucketName)
|
||
}
|
||
//offset default is 0
|
||
query.Add("Offset", strconv.Itoa(offset))
|
||
|
||
if limit == 0 {
|
||
limit = 20
|
||
}
|
||
query.Add("Limit", strconv.Itoa(limit))
|
||
|
||
if projectID != "" {
|
||
query.Add("ProjectId", projectID)
|
||
}
|
||
err = u.bucketRequest(query, &list)
|
||
return
|
||
}
|
||
|
||
func (u *UFileRequest) bucketRequest(query url.Values, data response) error {
|
||
reqURL := u.genBucketURL(query)
|
||
req, err := http.NewRequest("GET", reqURL, nil)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
resp, err := u.Client.Do(req)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = u.responseParse(resp)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = json.Unmarshal(u.LastResponseBody, data)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return data.Error()
|
||
}
|
||
|
||
func (u *UFileRequest) genBucketURL(query url.Values) string {
|
||
u.baseURL.RawQuery = u.Auth.AuthorizationBucketMgr(query)
|
||
return u.baseURL.String()
|
||
}
|