package main import ( "encoding/json" "fmt" "log" "net/http" "os" "path/filepath" "strings" padArchiver ".." "github.com/gorilla/mux" ) //PadModel is the data structure for each pad type PadModel struct { Link string `json:"link"` Dir string `json:"dir"` Title string `json:"title"` IpfsHash string `json:"ipfsHash"` } //Repo contains all the pads --currently not used-- type Repo struct { Pads []string `json:"pads"` } func main() { readConfig("config.json") router := mux.NewRouter() router.HandleFunc("/repos", GetReposList).Methods("GET") router.HandleFunc("/repos/{repoid}", GetRepoIDList).Methods("GET") router.HandleFunc("/repos/{repoid}/pad", PostStorePad).Methods("POST") log.Println("padArchiver API server running") log.Print("port: ") log.Println(config.Port) log.Fatal(http.ListenAndServe(":"+config.Port, router)) } //GetReposList is the endpoint to get the list of current repos func GetReposList(w http.ResponseWriter, r *http.Request) { file, err := os.Open(padArchiver.Storage) if err != nil { log.Fatalf("failed opening directory: %s", err) } defer file.Close() list, _ := file.Readdirnames(0) // 0 to read all files and folders var repos []string for _, name := range list { repos = append(repos, strings.Replace(name, padArchiver.Storage+"/", "", -1)) } jResp, err := json.Marshal(repos) check(err) fmt.Fprintln(w, string(jResp)) } //GetRepoIDList is the endpoint to get one repo by id func GetRepoIDList(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) repoid := vars["repoid"] fileList := []string{} err := filepath.Walk(padArchiver.Storage+"/"+repoid, func(path string, f os.FileInfo, err error) error { fileList = append(fileList, path) return nil }) var files []string for _, file := range fileList { files = append(files, strings.Replace(file, padArchiver.Storage+"/", "", -1)) } jResp, err := json.Marshal(files) check(err) fmt.Fprintln(w, string(jResp)) } //PostStorePad is the endpoint to post the signal to store one pad func PostStorePad(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) repoid := vars["repoid"] //open the repo repo := padArchiver.OpenRepo(repoid) //get the pad json var pad PadModel decoder := json.NewDecoder(r.Body) err := decoder.Decode(&pad) if err != nil { panic(err) } defer r.Body.Close() ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, true) if err != nil { http.Error(w, "error storing pad", http.StatusConflict) } pad.IpfsHash = ipfsHash jResp, err := json.Marshal(pad) check(err) fmt.Fprintln(w, string(jResp)) }