Browse Source

added build, and added side menu to webserver

master
arnaucode 6 years ago
parent
commit
9bd5a48bcc
23 changed files with 266 additions and 122 deletions
  1. +10
    -8
      README.md
  2. BIN
      apiServer/apiServer
  3. +1
    -1
      apiServer/main.go
  4. +31
    -0
      build.sh
  5. BIN
      build/apiServer
  6. BIN
      build/cli
  7. BIN
      build/listPadsImporter
  8. +18
    -0
      build/templates/menuTemplate.html
  9. +98
    -0
      build/templates/pageTemplate.html
  10. +7
    -0
      build/templates/wellcome.md
  11. BIN
      build/webServer
  12. BIN
      cli/cli
  13. +1
    -1
      cli/main.go
  14. +5
    -0
      listPadsImporter/list.json
  15. BIN
      listPadsImporter/listPadsImporter
  16. +1
    -1
      listPadsImporter/main.go
  17. +4
    -1
      padArchiver.go
  18. +1
    -1
      padArchiver_test.go
  19. +36
    -14
      webServer/main.go
  20. +16
    -89
      webServer/templates/menuTemplate.html
  21. +30
    -6
      webServer/templates/pageTemplate.html
  22. +7
    -0
      webServer/templates/wellcome.md
  23. BIN
      webServer/webServer

+ 10
- 8
README.md

@ -1,14 +1,16 @@
# padArchiver
Tool to store a pad (from the link) into IPFS and Git.
## webServer
All the necessary files are in the /build directory.
## 1.- webServer
This is a webserver that automatically generates a web from the pads directories and files stored.
To run:
To run, inside 'build' directory:
```
./webServer
```
## listPadsImporter
## 2.- listPadsImporter
This is to import all pads from the json file 'list.json'.
Just need to edit the json file, for example:
```json
@ -33,12 +35,12 @@ Just need to edit the json file, for example:
]
}
```
And then execute the importer:
To run, inside 'build' directory:
```
./importFromList
```
## apiServer
## 3.- apiServer
This is an API to run in localhost.
#### Run
@ -56,7 +58,7 @@ To run using the compiled binary:
}
```
- Execute the API server:
- Execute the API server, inside the directory 'build':
```
> ./padArchiver-APIserver
```
@ -108,8 +110,8 @@ this returns:
```
The IPFS hash is also added to the first line of the document, before adding the document to Git.
## cli
To run the CLI, just need to run:
## 4.- cli
To run the CLI, just need to run inside the directory 'build':
```
./padArchiver-cli
```

BIN
apiServer/apiServer


+ 1
- 1
apiServer/main.go

@ -89,7 +89,7 @@ func PostStorePad(w http.ResponseWriter, r *http.Request) {
}
defer r.Body.Close()
ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title)
ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, true)
if err != nil {
http.Error(w, "error storing pad", http.StatusConflict)
}

+ 31
- 0
build.sh

@ -0,0 +1,31 @@
echo "starting build process"
rm -rf build
mkdir build
cd webServer
echo "building webServer"
go build
cp webServer ../build
cp -r templates ../build
cd ..
cd listPadsImporter
echo "building listPadsImporter"
go build
cp listPadsImporter ../build
cd ..
cd apiServer
echo "building apiServer"
go build
cp apiServer ../build
cd ..
cd cli
echo "building cli"
go build
cp cli ../build
cd ..
echo "build process complete, all the necessary files are in the /build directory"

BIN
build/apiServer


BIN
build/cli


BIN
build/listPadsImporter


+ 18
- 0
build/templates/menuTemplate.html

@ -0,0 +1,18 @@
<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}}">
<i class="fas fa-folder"></i> {{.Name}}
</a>
</li>
</ol>
</nav>
{{else}}
<a href="{{.Path}}" class="list-group-item">
<i class="fas fa-file-alt"></i> {{.Name}}
</a> {{end}} {{end}}
</ul>

+ 98
- 0
build/templates/pageTemplate.html

@ -0,0 +1,98 @@
<!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>
body {
word-wrap: break-word;
}
footer {
width:100%;
background: #38414f;
color: #bec0c4;
margin-top: 80px;
padding: 20px;
}
a:link {
color: #008ae6;
}
a:visited {
color: #008ae6;
}
a:hover {
color: #33adff;
}
</style>
<title>padArchiver</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">
<img src="https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png" height="30" class="d-inline-block align-top" alt="">
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>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-info my-2 my-sm-0" type="submit">Search</button>
</form>
</nav>
<br><br>
<div class="container">
<div class="row">
<div class="col-sm-3">
{{.MenuContent}}
</div>
<div class="col-sm-9">
<h3>{{.Title}}</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>
<!-- font awesome icons -->
<script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script>
</body>
</html>

+ 7
- 0
build/templates/wellcome.md

@ -0,0 +1,7 @@
### Wellcome to the padArchiver.
Select one pad from the side menu to visualize.
![golang logo](https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png)
This is the wellcome message, from the 'templates/wellcome.md' file.

BIN
build/webServer


BIN
cli/cli


+ 1
- 1
cli/main.go

@ -87,7 +87,7 @@ func option1() {
repo := padArchiver.OpenRepo(repoID)
ipfsHash, err := repo.StorePad(link, subdirectory, title)
ipfsHash, err := repo.StorePad(link, subdirectory, title, true)
if err != nil {
color.Red(err.Error())
} else {

+ 5
- 0
listPadsImporter/list.json

@ -15,6 +15,11 @@
"link": "http://board.net/p/pad3",
"dir": "Group2",
"title": "Pad3"
},
{
"link": "http://board.net/p/loremipsum",
"dir": "SubArea1",
"title": "loremipsum"
}
]
}

BIN
listPadsImporter/listPadsImporter


+ 1
- 1
listPadsImporter/main.go

@ -58,7 +58,7 @@ func main() {
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)
ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, false)
check(err)
fmt.Println(" ipfs hash: " + ipfsHash)
}

+ 4
- 1
padArchiver.go

@ -23,13 +23,16 @@ func OpenRepo(directory string) Repo {
return repo
}
func (repo *Repo) StorePad(link string, directory string, title string) (string, error) {
func (repo *Repo) StorePad(link string, directory string, title string, ipfsActive bool) (string, error) {
path, err := repo.GetPad(link, "md", directory, title)
if err != nil {
color.Red(err.Error())
return "", err
}
if !ipfsActive {
return "", nil
}
hash, err := IpfsAdd(path)
if err != nil {
color.Red(err.Error())

+ 1
- 1
padArchiver_test.go

@ -11,7 +11,7 @@ const checkIcon = "\xE2\x9C\x94 "
func TestAddPad(t *testing.T) {
color.Blue("TestAddPad")
repo := OpenRepo("Repo01")
_, err := repo.StorePad("http://board.net/p/pad1", "Group1", "pad1")
_, err := repo.StorePad("http://board.net/p/pad1", "Group1", "pad1", true)
if err == nil {
color.Green(checkIcon + "checked AddPad")

+ 36
- 14
webServer/main.go

@ -1,6 +1,7 @@
package main
import (
"bytes"
"html/template"
"log"
"net/http"
@ -13,15 +14,19 @@ import (
)
type ItemModel struct {
Name string
Path string
IsDir bool
Content template.HTML
Name string
Path string
IsDir bool
}
type MenuModel struct {
PageTitle string
Items []ItemModel
}
type PageModel struct {
Title string
MenuContent template.HTML
Content template.HTML
}
func main() {
@ -35,7 +40,7 @@ func main() {
log.Fatal(http.ListenAndServe(":8080", router))
}
func generateMenu(dirpath string) MenuModel {
func generateMenuItems(dirpath string) MenuModel {
var menuPage MenuModel
menuPage.PageTitle = "padArchiver - Menu"
_ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {
@ -56,6 +61,14 @@ func generateMenu(dirpath string) MenuModel {
})
return menuPage
}
func generateMenuHTML(dirpath string) template.HTML {
menuItems := generateMenuItems(dirpath)
tmplMenu := template.Must(template.ParseFiles("templates/menuTemplate.html"))
var tpl bytes.Buffer
err := tmplMenu.Execute(&tpl, menuItems)
check(err)
return template.HTML(tpl.String())
}
func getDir(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
var dirpath string
@ -63,11 +76,18 @@ func getDir(w http.ResponseWriter, r *http.Request) {
dirpath = vars["path"]
dirpath = strings.Replace(dirpath, "%", "/", -1)
}
var page PageModel
page.Title = dirpath
if dirpath == "" {
page.Title = "padArchiver"
}
page.MenuContent = generateMenuHTML(dirpath)
content, err := fileToHTML("templates/wellcome.md")
check(err)
page.Content = template.HTML(content)
menuPage := generateMenu(dirpath)
tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html"))
tmpl.Execute(w, menuPage)
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmpl.Execute(w, page)
}
func getPage(w http.ResponseWriter, r *http.Request) {
@ -79,10 +99,12 @@ func getPage(w http.ResponseWriter, r *http.Request) {
content, err := fileToHTML(path)
check(err)
var item ItemModel
item.Name = path
item.Content = template.HTML(content)
var page PageModel
page.Title = path
page.Content = template.HTML(content)
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmpl.Execute(w, item)
page.MenuContent = generateMenuHTML("")
tmplPage := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmplPage.Execute(w, page)
}

+ 16
- 89
webServer/templates/menuTemplate.html

@ -1,91 +1,18 @@
<!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>
<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}}">
<i class="fas fa-folder"></i> {{.Name}}
</a>
</li>
</ol>
</nav>
<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>
{{else}}
<a href="{{.Path}}" class="list-group-item">
<i class="fas fa-file-alt"></i> {{.Name}}
</a> {{end}} {{end}}
</ul>

+ 30
- 6
webServer/templates/pageTemplate.html

@ -10,6 +10,9 @@
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
<style>
body {
word-wrap: break-word;
}
footer {
width:100%;
background: #38414f;
@ -17,6 +20,15 @@
margin-top: 80px;
padding: 20px;
}
a:link {
color: #008ae6;
}
a:visited {
color: #008ae6;
}
a:hover {
color: #33adff;
}
</style>
<title>padArchiver</title>
@ -24,26 +36,35 @@
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">padArchiver</a>
<a class="navbar-brand" href="/">
<img src="https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png" height="30" class="d-inline-block align-top" alt="">
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">
<!--<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>
</ul>-->
</div>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-info my-2 my-sm-0" type="submit">Search</button>
</form>
</nav>
<br><br>
<div class="container">
<div class="row">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<h3>{{.Name}}</h3>
<div class="col-sm-3">
{{.MenuContent}}
</div>
<div class="col-sm-9">
<h3>{{.Title}}</h3>
<hr> {{.Content}}
</div>
</div>
@ -69,6 +90,9 @@
<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>
<!-- font awesome icons -->
<script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script>
</body>
</html>

+ 7
- 0
webServer/templates/wellcome.md

@ -0,0 +1,7 @@
### Wellcome to the padArchiver.
Select one pad from the side menu to visualize.
![golang logo](https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png)
This is the wellcome message, from the 'templates/wellcome.md' file.

BIN
webServer/webServer


Loading…
Cancel
Save