From 12dde94a39557d48fa18cae46a772ccba9c4bc4e Mon Sep 17 00:00:00 2001 From: The-Tysonator Date: Mon, 23 Oct 2023 23:40:48 +0100 Subject: [PATCH] first commit --- Delete.go | 51 +++++++++++++++++++++++++++++++++++++++++++++ Download.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++ List.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ New.go | 10 +++++++++ Object.go | 20 ++++++++++++++++++ Storage.go | 8 +++++++ Upload.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 3 +++ 8 files changed, 264 insertions(+) create mode 100644 Delete.go create mode 100644 Download.go create mode 100644 List.go create mode 100644 New.go create mode 100644 Object.go create mode 100644 Storage.go create mode 100644 Upload.go create mode 100644 go.mod 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