Browse Source

implemented webServer, and implemented listPadsImporter

master
arnaucode 6 years ago
parent
commit
3e0ef09e55
19 changed files with 420 additions and 5 deletions
  1. +40
    -5
      README.md
  2. BIN
      apiServer/apiServer
  3. +0
    -0
      apiServer/config.json
  4. +0
    -0
      apiServer/error.go
  5. +0
    -0
      apiServer/main.go
  6. +0
    -0
      apiServer/readConfig.go
  7. +0
    -0
      apiServer/test.py
  8. BIN
      cli/cli
  9. +0
    -0
      cli/main.go
  10. +9
    -0
      listPadsImporter/error.go
  11. +20
    -0
      listPadsImporter/list.json
  12. BIN
      listPadsImporter/listPadsImporter
  13. +66
    -0
      listPadsImporter/main.go
  14. +9
    -0
      webServer/error.go
  15. +23
    -0
      webServer/files.go
  16. +88
    -0
      webServer/main.go
  17. +91
    -0
      webServer/templates/menuTemplate.html
  18. +74
    -0
      webServer/templates/pageTemplate.html
  19. BIN
      webServer/webServer

+ 40
- 5
README.md

@ -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

BIN
padArchiver-APIserver/padArchiver-APIserver → apiServer/apiServer


padArchiver-APIserver/config.json → apiServer/config.json


padArchiver-APIserver/error.go → apiServer/error.go


padArchiver-APIserver/main.go → apiServer/main.go


padArchiver-APIserver/readConfig.go → apiServer/readConfig.go


padArchiver-APIserver/test.py → apiServer/test.py


BIN
padArchiver-cli/padArchiver-cli → cli/cli


padArchiver-cli/main.go → cli/main.go


+ 9
- 0
listPadsImporter/error.go

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

+ 20
- 0
listPadsImporter/list.json

@ -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


+ 66
- 0
listPadsImporter/main.go

@ -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
- 0
webServer/error.go

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

+ 23
- 0
webServer/files.go

@ -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
- 0
webServer/main.go

@ -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)
}

+ 91
- 0
webServer/templates/menuTemplate.html

@ -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>

+ 74
- 0
webServer/templates/pageTemplate.html

@ -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


Loading…
Cancel
Save