arnaucube
arnaucube/padArchiverPublic Self-hosted repository
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}