padArchiver/apiServer/main.go
apiServer/main.goRaw
1package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "log"
7 "net/http"
8 "os"
9 "path/filepath"
10 "strings"
11
12 padArchiver ".."
13 "github.com/gorilla/mux"
14)
15
16type PadModel struct {
17 Link string `json:"link"`
18 Dir string `json:"dir"`
19 Title string `json:"title"`
20 IpfsHash string `json:"ipfsHash"`
21}
22type Repo struct {
23 Pads []string `json:"pads"`
24}
25
26func main() {
27 readConfig("config.json")
28
29 router := mux.NewRouter()
30 router.HandleFunc("/repos", GetReposList).Methods("GET")
31 router.HandleFunc("/repos/{repoid}", GetRepoIDList).Methods("GET")
32 router.HandleFunc("/repos/{repoid}/pad", PostStorePad).Methods("POST")
33
34 log.Println("padArchiver API server running")
35 log.Print("port: ")
36 log.Println(config.Port)
37 log.Fatal(http.ListenAndServe(":"+config.Port, router))
38}
39
40func GetReposList(w http.ResponseWriter, r *http.Request) {
41 file, err := os.Open(padArchiver.Storage)
42 if err != nil {
43 log.Fatalf("failed opening directory: %s", err)
44 }
45 defer file.Close()
46
47 list, _ := file.Readdirnames(0) // 0 to read all files and folders
48
49 var repos []string
50 for _, name := range list {
51 repos = append(repos, strings.Replace(name, padArchiver.Storage+"/", "", -1))
52 }
53
54 jResp, err := json.Marshal(repos)
55 check(err)
56 fmt.Fprintln(w, string(jResp))
57}
58
59func GetRepoIDList(w http.ResponseWriter, r *http.Request) {
60 vars := mux.Vars(r)
61 repoid := vars["repoid"]
62
63 fileList := []string{}
64 err := filepath.Walk(padArchiver.Storage+"/"+repoid, func(path string, f os.FileInfo, err error) error {
65 fileList = append(fileList, path)
66 return nil
67 })
68
69 var files []string
70 for _, file := range fileList {
71 files = append(files, strings.Replace(file, padArchiver.Storage+"/", "", -1))
72 }
73 jResp, err := json.Marshal(files)
74 check(err)
75 fmt.Fprintln(w, string(jResp))
76}
77func PostStorePad(w http.ResponseWriter, r *http.Request) {
78 vars := mux.Vars(r)
79 repoid := vars["repoid"]
80
81 //open the repo
82 repo := padArchiver.OpenRepo(repoid)
83 //get the pad json
84 var pad PadModel
85 decoder := json.NewDecoder(r.Body)
86 err := decoder.Decode(&pad)
87 if err != nil {
88 panic(err)
89 }
90 defer r.Body.Close()
91
92 ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title)
93 if err != nil {
94 http.Error(w, "error storing pad", http.StatusConflict)
95 }
96 pad.IpfsHash = ipfsHash
97 jResp, err := json.Marshal(pad)
98 check(err)
99 fmt.Fprintln(w, string(jResp))
100}