Skip to content

Commit 384a716

Browse files
committed
Added a basic webserver with view, save, edit functionality as a part of the go learning course to view and edit files
1 parent eb2526d commit 384a716

File tree

8 files changed

+142
-0
lines changed

8 files changed

+142
-0
lines changed

create_a_webserver/go.work

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
go 1.20
2+
3+
use (
4+
./webserver
5+
./wiki
6+
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
This is my own file, what are you gonna do man
2+

create_a_webserver/webserver/go.mod

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module aniketbatabyal.com/webserver
2+
3+
go 1.20
4+
5+
replace batsy.com/wiki => ../wiki
6+
7+
require batsy.com/wiki v0.0.0-00010101000000-000000000000
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<h1>Editing {{.Title}}</h1>
2+
3+
<form action="/save/{{.Title}}" method="POST">
4+
<div>
5+
<textarea name="body" rows="20" cols="80">
6+
{{printf "%s" .Body}}
7+
</textarea>
8+
</div>
9+
<div>
10+
<input type="submit" value="Save">
11+
</div>
12+
</form>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<h1>Viewing {{ .Title }}</h1>
2+
3+
<div>
4+
[<a href="/edit/">edit</a>]
5+
</div>
6+
<p>
7+
The body is
8+
{{ printf "%s" .Body }}
9+
</p>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"html/template"
6+
"log"
7+
"net/http"
8+
9+
"batsy.com/wiki"
10+
)
11+
12+
func handlerFunc(w http.ResponseWriter, req *http.Request) {
13+
w.Header().Add("Content-Type", "text/html")
14+
fmt.Fprintf(w, "This is so awesome %s", req.URL.Path[1:])
15+
}
16+
17+
// remove duplicacy
18+
19+
func renderTemplate(htmlFileLocation string, writer http.ResponseWriter, page *wiki.Page) {
20+
respTemplate, err := template.ParseFiles(htmlFileLocation)
21+
22+
if err != nil {
23+
log.Fatal("Something went wrong", err)
24+
}
25+
26+
respTemplate.Execute(writer, page)
27+
}
28+
29+
func viewHandler(w http.ResponseWriter, req *http.Request) {
30+
title := req.URL.Path[len("/view/"):]
31+
32+
p, err := wiki.LoadPage(title)
33+
34+
if err != nil {
35+
http.Redirect(w, req, "/edit/"+title, http.StatusFound)
36+
return
37+
}
38+
39+
renderTemplate("./public/view.html", w, p)
40+
}
41+
42+
func editHandler(w http.ResponseWriter, req *http.Request) {
43+
title := req.URL.Path[len("/edit/"):]
44+
45+
page, err := wiki.LoadPage(title)
46+
47+
if err != nil {
48+
page = &wiki.Page{Title: "Tempfile"}
49+
}
50+
51+
renderTemplate("./public/template.html", w, page)
52+
}
53+
54+
func saveHandler(w http.ResponseWriter, req *http.Request) {
55+
title := req.URL.Path[len("/save/"):]
56+
body := req.FormValue("body")
57+
58+
page := &wiki.Page{Title: title, Body: []byte(body)}
59+
page.Save()
60+
61+
http.Redirect(w, req, "/view/"+title, http.StatusFound)
62+
}
63+
64+
func main() {
65+
66+
http.HandleFunc("/", handlerFunc)
67+
http.HandleFunc("/view/", viewHandler)
68+
http.HandleFunc("/edit/", editHandler)
69+
http.HandleFunc("/save/", saveHandler)
70+
71+
log.Fatal(http.ListenAndServe(":8080", nil))
72+
}

create_a_webserver/wiki/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module batsy.com/wiki
2+
3+
go 1.20

create_a_webserver/wiki/wiki.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package wiki
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
type Page struct {
9+
Title string
10+
Body []byte
11+
}
12+
13+
const EXTENTION = "txt"
14+
15+
// This is a method named save that takes as its receiver p, a pointer to Page . It takes no parameters, and returns a value of type error.
16+
func (p *Page) Save() error {
17+
fileName := fmt.Sprintf("%s.%s", p.Title, EXTENTION)
18+
19+
// 0600 means read write permissions
20+
return os.WriteFile(fileName, p.Body, 0600)
21+
}
22+
23+
func LoadPage(title string) (*Page, error) {
24+
fileName := fmt.Sprintf("%s.%s", title, EXTENTION)
25+
body, error := os.ReadFile(fileName)
26+
27+
if error != nil {
28+
return nil, error
29+
}
30+
return &Page{Title: title, Body: body}, nil
31+
}

0 commit comments

Comments
 (0)