commit 12dde94a39557d48fa18cae46a772ccba9c4bc4e Author: The-Tysonator Date: Mon Oct 23 23:40:48 2023 +0100 first commit diff --git a/Delete.go b/Delete.go new file mode 100644 index 0000000..374bbf9 --- /dev/null +++ b/Delete.go @@ -0,0 +1,51 @@ +package gcl + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +// Delete +func (storage *Storage) Delete(path string) (bool, error) { + // Create HTTP Request + request, err := http.NewRequest("DELETE", fmt.Sprintf("https://%s/%s/%s", storage.endpoint, storage.zoneName, path), nil) + // Handle Error + if err != nil { + return false, err + } + // Add Headers + request.Header.Add("AccessKey", storage.accessKey) + // Do Request + response, err := http.DefaultClient.Do(request) + // Handle Error + if err != nil { + return false, err + } + // Close Response + defer response.Body.Close() + // Check Response + if response.StatusCode/100 != 2 { + // Read Body + body, err := io.ReadAll(response.Body) + // Handle Error + if err != nil { + return false, err + } + // Response Data + responseData := struct { + HttpCode int `json:"HttpCode"` + Message string `json:"Message"` + }{} + // Unmarshal Body + err = json.Unmarshal(body, &responseData) + // Handle Error + if err != nil { + return false, err + } + return false, fmt.Errorf("%d : %s", responseData.HttpCode, responseData.Message) + } + // Success + return true, err +} diff --git a/Download.go b/Download.go new file mode 100644 index 0000000..9bbcff9 --- /dev/null +++ b/Download.go @@ -0,0 +1,52 @@ +package gcl + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +// Download +func (storage *Storage) Download(path string) ([]byte, error) { + // Create HTTP Request + request, err := http.NewRequest("GET", fmt.Sprintf("https://%s/%s/%s", storage.endpoint, storage.zoneName, path), nil) + // Handle Error + if err != nil { + return nil, err + } + // Add Headers + request.Header.Add("accept", "*/*") + request.Header.Add("AccessKey", storage.accessKey) + // Do Request + response, err := http.DefaultClient.Do(request) + // Handle Error + if err != nil { + return nil, err + } + // Close Response + defer response.Body.Close() + // Read Body + body, err := io.ReadAll(response.Body) + // Handle Error + if err != nil { + return nil, err + } + // Check Response + if response.StatusCode/100 != 2 { + // Response Data + responseData := struct { + HttpCode int `json:"HttpCode"` + Message string `json:"Message"` + }{} + // Unmarshal Body + err := json.Unmarshal(body, &responseData) + // Handle Error + if err != nil { + return nil, err + } + return nil, fmt.Errorf("%d : %s", response.StatusCode, responseData.Message) + } + // Success + return body, err +} diff --git a/List.go b/List.go new file mode 100644 index 0000000..fd8967e --- /dev/null +++ b/List.go @@ -0,0 +1,60 @@ +package gcl + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +// List +func (storage *Storage) List(path string) ([]Object, error) { + // Create HTTP Request + request, err := http.NewRequest("GET", fmt.Sprintf("https://%s/%s/%s", storage.endpoint, storage.zoneName, path), nil) + // Handle Error + if err != nil { + return nil, err + } + // Add Headers + request.Header.Add("accept", "application/json") + request.Header.Add("AccessKey", storage.accessKey) + // Do Request + response, err := http.DefaultClient.Do(request) + // Handle Error + if err != nil { + return nil, err + } + // Close Response + defer response.Body.Close() + // Read Body + body, err := io.ReadAll(response.Body) + // Handle Error + if err != nil { + return nil, err + } + // Check Response + if response.StatusCode/100 != 2 { + // Response Data + responseData := struct { + HttpCode int `json:"HttpCode"` + Message string `json:"Message"` + }{} + // Unmarshal Body + err = json.Unmarshal(body, &responseData) + // Handle Error + if err != nil { + return nil, err + } + return nil, fmt.Errorf("%d : %s", responseData.HttpCode, responseData.Message) + } + // Response Data + var responseData []Object + // Unmarshal Body + err = json.Unmarshal(body, &responseData) + // Handle Error + if err != nil { + return nil, err + } + // Success + return responseData, err +} diff --git a/New.go b/New.go new file mode 100644 index 0000000..59cbe64 --- /dev/null +++ b/New.go @@ -0,0 +1,10 @@ +package gcl + +// New +func New(accessKey string, endpoint string, zoneName string) Storage { + return Storage{ + accessKey: accessKey, + endpoint: endpoint, + zoneName: zoneName, + } +} diff --git a/Object.go b/Object.go new file mode 100644 index 0000000..87b919f --- /dev/null +++ b/Object.go @@ -0,0 +1,20 @@ +package gcl + +// Object +type Object struct { + Guid string `json:"Guid"` + StorageZoneName string `json:"StorageZoneName"` + Path string `json:"Path"` + ObjectName string `json:"ObjectName"` + Length int `json:"Length"` + LastChanged string `json:"LastChanged"` + ServerId int `json:"ServerId"` + ArrayNumber int `json:"ArrayNumber"` + IsDirectory bool `json:"IsDirectory"` + UserId string `json:"UserId"` + ContentType string `json:"ContentType"` + DateCreated string `json:"DateCreated"` + StorageZoneId int `json:"StorageZoneId"` + Checksum string `json:"Checksum"` + ReplicatedZones string `json:"ReplicatedZones"` +} diff --git a/Storage.go b/Storage.go new file mode 100644 index 0000000..816b4bf --- /dev/null +++ b/Storage.go @@ -0,0 +1,8 @@ +package gcl + +// Storage +type Storage struct { + accessKey string + endpoint string + zoneName string +} diff --git a/Upload.go b/Upload.go new file mode 100644 index 0000000..eda8f28 --- /dev/null +++ b/Upload.go @@ -0,0 +1,60 @@ +package gcl + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +// Upload +func (storage *Storage) Upload(path string, data []byte) (bool, error) { + // Create HTTP Request + request, err := http.NewRequest("PUT", fmt.Sprintf("https://%s/%s/%s", storage.endpoint, storage.zoneName, path), bytes.NewReader(data)) + // Handle Error + if err != nil { + return false, err + } + // Hasher + hasher := sha256.New() + hasher.Write(data) + // Add Headers + request.Header.Set("AccessKey", storage.accessKey) + request.Header.Set("Content-Type", "application/octet-stream") + request.Header.Set("Checksum", strings.ToUpper(hex.EncodeToString(hasher.Sum(nil)))) + // Do Request + response, err := http.DefaultClient.Do(request) + // Handle Error + if err != nil { + return false, err + } + // Close Response + defer response.Body.Close() + // Check Response + if response.StatusCode/100 != 2 { + // Read Body + body, err := io.ReadAll(response.Body) + // Handle Error + if err != nil { + return false, err + } + // Response Data + responseData := struct { + HttpCode int `json:"HttpCode"` + Message string `json:"Message"` + }{} + // Unmarshal Body + err = json.Unmarshal(body, &responseData) + // Handle Error + if err != nil { + return false, err + } + return false, fmt.Errorf("%d : %s", responseData.HttpCode, responseData.Message) + } + // Success + return true, err +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..feb138f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.tylantyson.com/The-Tysonator/gsl + +go 1.21.3