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
16//PadModel is the data structure for each pad
17type PadModel struct {
18 Link string `json:"link"`
19 Dir string `json:"dir"`
20 Title string `json:"title"`
21 IpfsHash string `json:"ipfsHash"`
22}
23
24//Repo contains all the pads --currently not used--
25type Repo struct {
26 Pads []string `json:"pads"`
27}
28
29func main() {
30 readConfig("config.json")
31
32 router := mux.NewRouter()
33 router.HandleFunc("/repos", GetReposList).Methods("GET")
34 router.HandleFunc("/repos/{repoid}", GetRepoIDList).Methods("GET")
35 router.HandleFunc("/repos/{repoid}/pad", PostStorePad).Methods("POST")
36
37 log.Println("padArchiver API server running")
38 log.Print("port: ")
39 log.Println(config.Port)
40 log.Fatal(http.ListenAndServe(":"+config.Port, router))
41}
42
43//GetReposList is the endpoint to get the list of current repos
44func GetReposList(w http.ResponseWriter, r *http.Request) {
45 file, err := os.Open(padArchiver.Storage)
46 if err != nil {
47 log.Fatalf("failed opening directory: %s", err)
48 }
49 defer file.Close()
50
51 list, _ := file.Readdirnames(0) // 0 to read all files and folders
52
53 var repos []string
54 for _, name := range list {
55 repos = append(repos, strings.Replace(name, padArchiver.Storage+"/", "", -1))
56 }
57
58 jResp, err := json.Marshal(repos)
59 check(err)
60 fmt.Fprintln(w, string(jResp))
61}
62
63//GetRepoIDList is the endpoint to get one repo by id
64func GetRepoIDList(w http.ResponseWriter, r *http.Request) {
65 vars := mux.Vars(r)
66 repoid := vars["repoid"]
67
68 fileList := []string{}
69 err := filepath.Walk(padArchiver.Storage+"/"+repoid, func(path string, f os.FileInfo, err error) error {
70 fileList = append(fileList, path)
71 return nil
72 })
73
74 var files []string
75 for _, file := range fileList {
76 files = append(files, strings.Replace(file, padArchiver.Storage+"/", "", -1))
77 }
78 jResp, err := json.Marshal(files)
79 check(err)
80 fmt.Fprintln(w, string(jResp))
81}
82
83//PostStorePad is the endpoint to post the signal to store one pad
84func PostStorePad(w http.ResponseWriter, r *http.Request) {
85 vars := mux.Vars(r)
86 repoid := vars["repoid"]
87
88 //open the repo
89 repo := padArchiver.OpenRepo(repoid)
90 //get the pad json
91 var pad PadModel
92 decoder := json.NewDecoder(r.Body)
93 err := decoder.Decode(&pad)
94 if err != nil {
95 panic(err)
96 }
97 defer r.Body.Close()
98
99 ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, true)
100 if err != nil {
101 http.Error(w, "error storing pad", http.StatusConflict)
102 }
103 pad.IpfsHash = ipfsHash
104 jResp, err := json.Marshal(pad)
105 check(err)
106 fmt.Fprintln(w, string(jResp))
107}