arnaucube
arnaucube/padArchiverPublic Self-hosted repository
padArchiver/padArchiver-APIserver/main.go
padArchiver-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}