implemented webServer, and implemented listPadsImporter

This commit is contained in:
arnaucode
2018-04-15 00:21:36 +02:00
parent 3691547c68
commit 3e0ef09e55
19 changed files with 420 additions and 5 deletions

View File

@@ -1,9 +1,44 @@
# padArchiver # padArchiver
Tool to store a pad (from the link) into IPFS and Git. Tool to store a pad (from the link) into IPFS and Git.
## webServer
This is a webserver that automatically generates a web from the pads directories and files stored.
To run:
```
./webServer
```
## listPadsImporter
This is to import all pads from the json file 'list.json'.
Just need to edit the json file, for example:
```json
{
"repoid": "repo01",
"pads": [
{
"link": "http://board.net/p/pad1",
"dir": "Group1",
"title": "Pad1"
},
{
"link": "http://board.net/p/pad2",
"dir": "Group1",
"title": "Pad2"
},
{
"link": "http://board.net/p/pad3",
"dir": "Group2",
"title": "Pad3"
}
]
}
```
And then execute the importer:
```
./importFromList
```
## padArchiver-APIserver ## apiServer
This is an API to run in localhost. This is an API to run in localhost.
#### Run #### Run
@@ -28,7 +63,7 @@ To run using the compiled binary:
#### API Routes #### API Routes
###### - GET /repos ##### - GET /repos
this returns: this returns:
``` ```
[ [
@@ -38,7 +73,7 @@ this returns:
``` ```
###### - GET /repos/{repoid} ##### - GET /repos/{repoid}
this returns: this returns:
``` ```
[ [
@@ -53,7 +88,7 @@ this returns:
``` ```
###### - POST /repos/{repoid}/pad ##### - POST /repos/{repoid}/pad
data to send: data to send:
``` ```
json: { json: {
@@ -73,7 +108,7 @@ this returns:
``` ```
The IPFS hash is also added to the first line of the document, before adding the document to Git. The IPFS hash is also added to the first line of the document, before adding the document to Git.
## padArchiver-cli ## cli
To run the CLI, just need to run: To run the CLI, just need to run:
``` ```
./padArchiver-cli ./padArchiver-cli

View File

@@ -0,0 +1,9 @@
package main
import "github.com/fatih/color"
func check(err error) {
if err != nil {
color.Red(err.Error())
}
}

View File

@@ -0,0 +1,20 @@
{
"repoid": "repo01",
"pads": [
{
"link": "http://board.net/p/pad1",
"dir": "Group1",
"title": "Pad1"
},
{
"link": "http://board.net/p/pad2",
"dir": "Group1",
"title": "Pad2"
},
{
"link": "http://board.net/p/pad3",
"dir": "Group2",
"title": "Pad3"
}
]
}

BIN
listPadsImporter/listPadsImporter Executable file

Binary file not shown.

66
listPadsImporter/main.go Normal file
View File

@@ -0,0 +1,66 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
padArchiver ".."
"github.com/fatih/color"
)
type PadModel struct {
Link string `json:"link"`
Dir string `json:"dir"`
Title string `json:"title"`
}
type ListModel struct {
RepoID string `json:"repoid"`
Pads []PadModel `json:"pads"`
}
func readList(path string) ListModel {
file, err := ioutil.ReadFile(path)
check(err)
content := string(file)
var list ListModel
json.Unmarshal([]byte(content), &list)
return list
}
func main() {
asciiart := `
.
. _ _ _
. | | /\ | | (_)
_ __ __ _ __| | / \ _ __ ___| |__ ___ _____ _ __
| '_ \ / _ |/ _ | / /\ \ | '__/ __| '_ \| \ \ / / _ \ '__|
| |_) | (_| | (_| |/ ____ \| | | (__| | | | |\ V / __/ |
| .__/ \__,_|\__,_/_/ \_\_| \___|_| |_|_| \_/ \___|_| - listPadsImporter
| |
|_|
`
color.Blue(asciiart)
fmt.Println(" v0.0.1")
color.Blue("https://github.com/arnaucode/padArchiver")
fmt.Println("")
fmt.Println("")
fmt.Println("")
list := readList("list.json")
//open the repo
repo := padArchiver.OpenRepo(list.RepoID)
fmt.Println("repo opened")
for _, pad := range list.Pads {
fmt.Println("importing pad:")
fmt.Println(" link: " + pad.Link)
fmt.Println(" dir: " + pad.Dir)
fmt.Println(" title: " + pad.Title)
ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title)
check(err)
fmt.Println(" ipfs hash: " + ipfsHash)
}
color.Green("listPadsImporter finished")
}

9
webServer/error.go Normal file
View File

@@ -0,0 +1,9 @@
package main
import "github.com/fatih/color"
func check(err error) {
if err != nil {
color.Red(err.Error())
}
}

23
webServer/files.go Normal file
View File

@@ -0,0 +1,23 @@
package main
import (
"io/ioutil"
"github.com/fatih/color"
blackfriday "gopkg.in/russross/blackfriday.v2"
)
func readFile(path string) string {
dat, err := ioutil.ReadFile(path)
if err != nil {
color.Red(path)
}
check(err)
return string(dat)
}
func fileToHTML(path string) (string, error) {
mdcontent := readFile(path)
htmlcontent := string(blackfriday.Run([]byte(mdcontent)))
return htmlcontent, nil
}

88
webServer/main.go Normal file
View File

@@ -0,0 +1,88 @@
package main
import (
"html/template"
"log"
"net/http"
"os"
"path/filepath"
"strings"
padArchiver ".."
"github.com/gorilla/mux"
)
type ItemModel struct {
Name string
Path string
IsDir bool
Content template.HTML
}
type MenuModel struct {
PageTitle string
Items []ItemModel
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/", getDir).Methods("GET")
router.HandleFunc("/dir/{path}", getDir).Methods("GET")
router.HandleFunc("/page/{path}", getPage).Methods("GET")
log.Println("padArchiver web server running")
log.Print("port: 8080")
log.Fatal(http.ListenAndServe(":8080", router))
}
func generateMenu(dirpath string) MenuModel {
var menuPage MenuModel
menuPage.PageTitle = "padArchiver - Menu"
_ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {
if path != padArchiver.Storage {
path = strings.Replace(path, padArchiver.Storage, "", -1)
var item ItemModel
item.Name = path
path = strings.Replace(path, "/", "%", -1)
if f.IsDir() {
item.Path = "/dir/" + path
} else {
item.Path = "/page/" + path
}
item.IsDir = f.IsDir()
menuPage.Items = append(menuPage.Items, item)
}
return nil
})
return menuPage
}
func getDir(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
var dirpath string
if _, ok := vars["path"]; ok {
dirpath = vars["path"]
dirpath = strings.Replace(dirpath, "%", "/", -1)
}
menuPage := generateMenu(dirpath)
tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html"))
tmpl.Execute(w, menuPage)
}
func getPage(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
path := vars["path"]
path = strings.Replace(path, "%", "/", -1)
path = padArchiver.Storage + path
content, err := fileToHTML(path)
check(err)
var item ItemModel
item.Name = path
item.Content = template.HTML(content)
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmpl.Execute(w, item)
}

View File

@@ -0,0 +1,91 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
<style>
footer {
width:100%;
background: #38414f;
color: #bec0c4;
margin-top: 80px;
padding: 20px;
}
</style>
<title>padArchiver</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">padArchiver</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
</li>
</ul>
</div>
</nav>
<br><br>
<div class="container">
<div class="row">
<div class="col-sm-2"></div>
<div class="col-sm-8">
<h3>{{.PageTitle}}</h3>
<ul class="list-group">
{{range .Items}}
{{if .IsDir}}
<br><br>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item active" aria-current="page">
<a href="{{.Path}}">{{.Name}}</a>
</li>
</ol>
</nav>
{{else}}
<a href="{{.Path}}" class="list-group-item">{{.Name}}</a>
{{end}}
{{end}}
</ul>
</div>
</div>
</div>
<footer>
<div class="container">
<p class="float-right">
<a href="#">Back to top</a>
</p>
<p>
padArchiver - webServer
</p>
<p>
Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a>
</p>
</div>
</footer>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,74 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
<style>
footer {
width:100%;
background: #38414f;
color: #bec0c4;
margin-top: 80px;
padding: 20px;
}
</style>
<title>padArchiver</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">padArchiver</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
</li>
</ul>
</div>
</nav>
<br><br>
<div class="container">
<div class="row">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<h3>{{.Name}}</h3>
<hr> {{.Content}}
</div>
</div>
</div>
<footer class="text-muted">
<div class="container">
<p class="float-right">
<a href="#">Back to top</a>
</p>
<p>
padArchiver - webServer
</p>
<p>
Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a>
</p>
</div>
</footer>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
</body>
</html>

BIN
webServer/webServer Executable file

Binary file not shown.