summaryrefslogtreecommitdiff
path: root/cantree/tree.go
diff options
context:
space:
mode:
Diffstat (limited to 'cantree/tree.go')
-rw-r--r--cantree/tree.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/cantree/tree.go b/cantree/tree.go
new file mode 100644
index 0000000..8a7464f
--- /dev/null
+++ b/cantree/tree.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "os"
+ "encoding/json"
+ "errors"
+ "io/fs"
+ "strconv"
+)
+
+var downloadKey string
+
+func request(dirID string) []byte {
+ req, err := http.NewRequest("GET", base+dirID, nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ req.Header.Add("Authorization", "Bearer "+downloadKey)
+
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ rt, err := io.ReadAll(resp.Body)
+ if err != nil {
+ log.Fatal(err)
+ }
+ resp.Body.Close()
+
+ return rt
+}
+
+func traverse(j map[string]interface{}) {
+ name := j["name"].(string)
+ /* Internally stored as float64.
+ Must be converted to int before string. */
+ id := strconv.Itoa(int(j["id"].(float64)))
+ fmt.Println(name, id)
+
+ var files []map[string]interface{}
+ var err error
+ str := "folders/" + string(id) + "/files"
+ fmt.Println(str)
+ err = json.Unmarshal(request("folders/"+string(id)+"/files"),
+ &files)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, i := range files {
+ for i, j := range i {
+ fmt.Printf("%s %v\n", i, j)
+ }
+ }
+
+ return
+ err = os.Mkdir(name, 0777)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ _ = os.Chdir(name)
+ defer os.Chdir("..")
+
+
+}
+
+// Traverse and download the contents of the Canvas API.
+func main() {
+ var set bool
+ downloadKey, set = os.LookupEnv("CANKEY")
+ if !set {
+ log.Fatal("Set the environment variable CANKEY to persistently contain your Canvas account API key.")
+ }
+
+ _, err := os.Stat("root")
+ if errors.Is(err, fs.ErrNotExist) {
+ os.Mkdir("root", 0777)
+ }
+ err = os.Chdir("root")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ body := request("users/self/folders")
+
+ var m []map[string]interface{}
+ err = json.Unmarshal(body, &m)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, i := range m {
+ traverse(i)
+ }
+}