فهرست منبع

had to duplicate an html template and fixed the update post endpoint

AETH-erial 1 سال پیش
والد
کامیت
5b56eeedd8

+ 4 - 4
Makefile

@@ -4,11 +4,11 @@
 WEBSERVER = webserver
 SEED_CMD = seed
 SWAG := $(shell command -v swag 2> /dev/null)
-
+## Have to set the WEB_ROOT and DOMAIN_NAME environment variables when building
 build:
-	go build -ldflags "-X main.WEB_ROOT=/home/aeth/keiji/html \
-	-X main.DOMAIN_NAME=aetherial.dev" \
-	-o ./build/linux/$(WEBSERVER)/$(WEBSERVER) ./cmd/$(WEBSERVER)/$(WEBSERVER).go 
+	go build -ldflags "-X main.WEB_ROOT=$(WEB_ROOT) \
+	-X main.DOMAIN_NAME=$(DOMAIN_NAME)" \
+	-o ./build/linux/$(WEBSERVER)/$(WEBSERVER) ./cmd/$(WEBSERVER)/$(WEBSERVER).go
 
 format:
 	go fmt ./...

BIN
build/linux/webserver/webserver


+ 19 - 2
cmd/webserver/webserver.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"flag"
 	"fmt"
 	"log"
 	"os"
@@ -17,6 +18,8 @@ var DOMAIN_NAME string
 
 
 func main() {
+	ssl := flag.Bool("ssl", false, "Set this to true to run the server with ssl. Leave blank to run in plaintext.")
+	flag.Parse()
 	args := os.Args
 	err := env.LoadAndVerifyEnv(args[1], env.REQUIRED_VARS)
 	if err != nil {
@@ -60,6 +63,7 @@ func main() {
 		fmt.Sprintf("%s/templates/link.html", WEB_ROOT),
 		fmt.Sprintf("%s/templates/navigation.html", WEB_ROOT),
 		fmt.Sprintf("%s/templates/listing.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/blogpost_editor.html", WEB_ROOT),
 	)
 	renderer.AddFromFiles(
 		"blogpost_editor",
@@ -70,6 +74,15 @@ func main() {
 		fmt.Sprintf("%s/templates/navigation.html", WEB_ROOT),
 		fmt.Sprintf("%s/templates/listing.html", WEB_ROOT),
 	)
+	renderer.AddFromFiles(
+		"new_blogpost",
+		fmt.Sprintf("%s/templates/new_blogpost.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/menu.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/link.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/upload_status.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/navigation.html", WEB_ROOT),
+		fmt.Sprintf("%s/templates/listing.html", WEB_ROOT),
+	)
 	renderer.AddFromFiles(
 		"upload_status",
 		fmt.Sprintf("%s/templates/upload_status.html", WEB_ROOT),
@@ -77,7 +90,11 @@ func main() {
 	e := gin.Default()
 	e.HTMLRender = renderer
 	routes.Register(e, WEB_ROOT, DOMAIN_NAME, REDIS_PORT, REDIS_ADDR)
-	e.RunTLS(fmt.Sprintf("%s:%s", os.Getenv("HOST_ADDR"), os.Getenv("HOST_PORT")),
-				os.Getenv(env.CHAIN), os.Getenv(env.KEY))
+	if *ssl {
+		e.RunTLS(fmt.Sprintf("%s:%s", os.Getenv("HOST_ADDR"), os.Getenv("HOST_PORT")),
+		os.Getenv(env.CHAIN), os.Getenv(env.KEY))
+	}
+	e.Run(fmt.Sprintf("%s:%s", os.Getenv("HOST_ADDR"), os.Getenv("HOST_PORT")))
+
 
 }

+ 0 - 43
db_seed/admin-tables.json

@@ -1,43 +0,0 @@
-{
-    "category": "configuration",
-    "tables": [
-        {
-            "table_name": "digital_media_management",
-            "table_data": [
-                {
-                    "display_name": "Upload a new image",
-                    "link": "/images/upload"
-                },
-                {
-                    "display_name": "Rename image filename",
-                    "link": ""
-                },
-                {
-                    "display_name": "Rename image canonical name",
-                    "link": ""
-                },
-                {
-                    "display_name": "Edit image description",
-                    "link": ""
-                },
-                {
-                    "display_name": "Delete image",
-                    "link": ""
-                }
-            ]
-        },
-        {
-            "table_name": "blog_post_management",
-            "table_data": [
-                {
-                    "display_name": "Edit a blog post",
-                    "link": "/admin/posts/all"
-                },
-                {
-                    "display_name": "Create a blog post",
-                    "link": "/admin/posts"
-                }
-            ]
-        }
-    ]
-}

+ 1 - 1
html/templates/blogpost.html

@@ -25,7 +25,7 @@
             <div class="col"></div>
         </div>
         <script type="text/javascript" src="/api/v1/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
-        <script src="https://unpkg.com/htmx.org@1.9.4"></script> 
+        <script src="https://unpkg.com/htmx.org@1.9.4"></script>
         <script src="https://unpkg.com/htmx.org/dist/ext/json-enc.js"></script>
     </body>
 

+ 50 - 37
html/templates/blogpost_editor.html

@@ -1,51 +1,64 @@
 {{ define "blogpost_editor.html" }}
 <!DOCTYPE html>
 <html lang="en">
-    <head>
-        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1">
-        <link rel="stylesheet" href="/api/v1/style/bootstrap.min.css">
-        <link rel="stylesheet" href="/api/v1/style/mdb/mdb.min.css">
-    </head>
-    <body style="background-color: rgb(56, 56, 56);">
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="/api/v1/style/bootstrap.min.css">
+    <link rel="stylesheet" href="/api/v1/style/mdb/mdb.min.css">
+</head>
+
+<body style="background-color: rgb(56, 56, 56);">
     {{ template "navigation.html" .navigation }}
-    <div class="container-fluid p-2 position-relative" style="width: 80vw; max-width: 80%; background-color: rgb(22, 22, 22);">
+    <div class="container-fluid p-2 position-relative"
+        style="width: 80vw; max-width: 80%; background-color: rgb(22, 22, 22);">
         <div class="container">
             <div class="row">
                 <div class="col-sm"></div>
-                    <div class="container position-relative">
-                        <div class="col m-5">
-                            <div id="response"></div>
-                            <form method={{ .HttpMethod }} hx-post="/admin/posts" hx-ext="json-enc" hx-target="#response">
-                                <div class="row" style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
-                                    <a>Post Identifier:</a>
-                                    <textarea name="identifier" style="background-color: rgb(73, 73, 73); color: white;">{{ .Ident }}</textarea>
-                                </div>
-                                <div class="row" style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
-                                    <a>Category:</a>
-                                    <select name="category" class="form-select" style="background-color: rgb(73, 73, 73); color: white; height: fit-content; font-size: larger; font-family: monospace;">
-                                        <option selected>{{ .DefaultTopic }}</option>
-                                        {{ range .Topics }}
-                                            <option value={{ . }}>{{ . }}</option>
-                                        {{ end }}
-                                    </select>
-                                </div>
-                                <div class="row" style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: large; font-family: monospace;">
-                                    <a>Time of creation:</a>
-                                    <textarea name="created" style="background-color: rgb(73, 73, 73); color: white;">{{ .Created }}</textarea>
-                                </div>
-                                <div class="row" style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
-                                    <a>Post Body:</a>
-                                    <textarea name="body" rows="30" wrap="soft" style="background-color: rgb(73, 73, 73); color: white;">{{ .Body }}</textarea>
-                                </div>
-                            <button type="submit">Send</button>
-                            </form>
-                        </div>
+                <div class="container position-relative">
+                    <a style="color: white; height: fit-content; font-size:xx-large; font-weight: bold; font-family: monospace;">Editing Existing Post</a>
+                    <div class="col m-5">
+                        <form method="patch" hx-patch="/admin/posts" hx-ext="json-enc" hx-target="#response" hx-swap="outerHTML">
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Post ID:</a>
+                                <textarea name="identifier"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Ident }}</textarea>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Category:</a>
+                                <select name="category" class="form-select"
+                                    style="background-color: rgb(73, 73, 73); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                    <option selected>{{ .DefaultTopic }}</option>
+                                    {{ range .Topics }}
+                                    <option value="{{ . }}">{{ . }}</option>
+                                    {{ end }}
+                                </select>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: large; font-family: monospace;">
+                                <a>Time of creation:</a>
+                                <textarea name="created"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Created }}</textarea>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Post Body:</a>
+                                <textarea name="body" rows="30" wrap="soft"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Body }}</textarea>
+                            </div>
+                            <button type="submit">Send</button><div id="response"></div>
+                        </form>
                     </div>
+                </div>
                 <div class="col-sm"></div>
             </div>
         </div>
     </div>
-    </body>
+    <script type="text/javascript" src="/api/v1/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+    <script src="https://unpkg.com/htmx.org@1.9.4"></script>
+    <script src="https://unpkg.com/htmx.org/dist/ext/json-enc.js"></script>
+</body>
 </html>
 {{ end }}

+ 13 - 16
html/templates/navigation.html

@@ -1,22 +1,19 @@
 {{ define "navigation.html" }}
-<!DOCTYPE html>
-<html lang="en">
-    <div class="container-fluid sticky-top pb-0">
-        <div class="row align-items-center justify-content-center bg-dark h-100 shadow-lg p-0 mb-0 rounded">
-            <div class="col-sm-8 p-3">
-                <div style="color: whitesmoke; font-size: xx-large; font-family: monospace;">
-                    <a href="/home" style="color:whitesmoke">aetherial.dev homepage</a>
-                </div>
+<div class="container-fluid sticky-top pb-0">
+    <div class="row align-items-center justify-content-center bg-dark h-100 shadow-lg p-0 mb-0 rounded">
+        <div class="col-sm-8 p-3">
+            <div style="color: whitesmoke; font-size: xx-large; font-family: monospace;">
+                <a href="/home" style="color:whitesmoke">aetherial.dev homepage</a>
             </div>
-            <div class="col-sm">
-                <div class="row">
-                    {{ range .headers }}
-                        {{ template "link.html" . }}
-                    {{ end }}
-                    {{ template "menu.html" .menu }}
-                </div>
+        </div>
+        <div class="col-sm">
+            <div class="row">
+                {{ range .headers }}
+                    {{ template "link.html" . }}
+                {{ end }}
+                {{ template "menu.html" .menu }}
             </div>
         </div>
     </div>
-</html>
+</div>
 {{ end }}

+ 64 - 0
html/templates/new_blogpost.html

@@ -0,0 +1,64 @@
+{{ define "new_blogpost.html" }}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="/api/v1/style/bootstrap.min.css">
+    <link rel="stylesheet" href="/api/v1/style/mdb/mdb.min.css">
+</head>
+
+<body style="background-color: rgb(56, 56, 56);">
+    {{ template "navigation.html" .navigation }}
+    <div class="container-fluid p-2 position-relative"
+        style="width: 80vw; max-width: 80%; background-color: rgb(22, 22, 22);">
+        <div class="container">
+            <div class="row">
+                <div class="col-sm"></div>
+                <div class="container position-relative">
+                    <a style="color: white; height: fit-content; font-size: xx-large; font-weight: bold; font-family: monospace;">Making a New Post</a>
+                    <div class="col m-5">
+                        <form method="post" hx-post="/admin/posts" hx-ext="json-enc" hx-target="#response" hx-swap="innerHTML">
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Post ID:</a>
+                                <textarea name="identifier"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Ident }}</textarea>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Category:</a>
+                                <select name="category" class="form-select"
+                                    style="background-color: rgb(73, 73, 73); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                    <option selected>{{ .DefaultTopic }}</option>
+                                    {{ range .Topics }}
+                                    <option value="{{ . }}">{{ . }}</option>
+                                    {{ end }}
+                                </select>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: large; font-family: monospace;">
+                                <a>Time of creation:</a>
+                                <textarea name="created"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Created }}</textarea>
+                            </div>
+                            <div class="row"
+                                style="background-color: rgb(22, 22, 22); color: white; height: fit-content; font-size: larger; font-family: monospace;">
+                                <a>Post Body:</a>
+                                <textarea name="body" rows="30" wrap="soft"
+                                    style="background-color: rgb(73, 73, 73); color: white;">{{ .Body }}</textarea>
+                            </div>
+                            <button type="submit">Send</button><div id="response"></div>
+                        </form>
+                    </div>
+                </div>
+                <div class="col-sm"></div>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="/api/v1/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+    <script src="https://unpkg.com/htmx.org@1.9.4"></script>
+    <script src="https://unpkg.com/htmx.org/dist/ext/json-enc.js"></script>
+</body>
+</html>
+{{ end }}

+ 2 - 2
pkg/controller/admin_handlers.go

@@ -25,7 +25,7 @@ func (c *Controller) AddDocument(ctx *gin.Context) {
 		})
 		return
 	}
-	
+
 	doc := helpers.NewDocument(upload.Name, nil, upload.Text, upload.Category)
 	err = helpers.AddDocument(doc, c.RedisConfig); if err != nil {
 		ctx.JSON(400, map[string]string{
@@ -33,7 +33,7 @@ func (c *Controller) AddDocument(ctx *gin.Context) {
 		})
 		return
 	}
-	
+
 }
 
 // @Name ServeLogin

+ 4 - 8
pkg/controller/content_handlers.go

@@ -2,7 +2,6 @@ package controller
 
 import (
 	"fmt"
-	"log"
 	"os"
 	"time"
 
@@ -20,7 +19,7 @@ func (c *Controller) ServeBlogDirectory(ctx *gin.Context) {
 		"Tables": c.FormatDocTable().Tables,
 
 	})
-	
+
 }
 
 
@@ -63,20 +62,19 @@ func (c *Controller) UpdateBlogPost(ctx *gin.Context) {
 		return
 	}
 	rds := helpers.NewRedisClient(helpers.RedisConf{Addr: os.Getenv("REDIS_ADDR"), Port: os.Getenv("REDIS_PORT")})
-
 	err = rds.UpdatePost(doc.Ident, doc); if err != nil {
 		ctx.HTML(400, "upload_status", gin.H{"UpdateMessage": "Update Failed!", "Color": "red"})
 		return
 	}
 	ctx.HTML(200, "upload_status", gin.H{"UpdateMessage": "Update Successful!", "Color": "green"})
-	
+
 }
 
 
 
 func (c *Controller) ServeNewBlogPage(ctx *gin.Context) {
 
-	ctx.HTML(200, "blogpost_editor", gin.H{
+	ctx.HTML(200, "new_blogpost", gin.H{
 		"navigation": gin.H{
 			"menu": c.Menu(),
 			"headers": c.Headers().Elements,
@@ -97,14 +95,12 @@ func (c *Controller) MakeBlogPost(ctx *gin.Context) {
 		return
 	}
 	rds := helpers.NewRedisClient(helpers.RedisConf{Addr: os.Getenv("REDIS_ADDR"), Port: os.Getenv("REDIS_PORT")})
-
 	err = rds.AddDoc(doc); if err != nil {
 		ctx.HTML(400, "upload_status", gin.H{"UpdateMessage": "Update Failed!", "Color": "red"})
-		log.Default().Print(err, "\n")
 		return
 	}
 	ctx.HTML(200, "upload_status", gin.H{"UpdateMessage": "Update Successful!", "Color": "green"})
-	
+
 }
 
 func (c *Controller) SaveFile(ctx *gin.Context) {

+ 6 - 0
pkg/helpers/helpers.go

@@ -26,6 +26,12 @@ var Topics = []string{
 	CREATIVE,
 }
 
+var TopicMap = map[string]string{
+	TECHNICAL: TECHNICAL,
+	BLOG: BLOG,
+	CREATIVE: CREATIVE,
+}
+
 type HeaderCollection struct {
 	Category	string		`json:"category"`
 	Elements	[]HeaderElem	`json:"elements"`

+ 15 - 5
pkg/helpers/redis.go

@@ -29,6 +29,12 @@ func (d *DocDoesntExist) Error() string {
 	return fmt.Sprintf("Document with ID: '%s' does not exist.", d.Key)
 }
 
+type InvalidTopic struct {Topic string}
+
+func (i *InvalidTopic) Error() string {
+	return fmt.Sprintf("Topic: %s is not a valid topic category.", i.Topic)
+	}
+
 type RedisConf struct {
 	Addr	string
 	Port	string
@@ -58,7 +64,6 @@ retrieves all of the document IDs in the Redis database
 */
 func (r *RedisCaller) AllDocIds() ([]string, error) {
 	return r.Client.Keys(r.ctx, "*").Result()
-	
 }
 
 /*
@@ -66,13 +71,18 @@ Sets the item (id) to the value supplied in value
 	:param doc: the documents.Document struct to input to the database
 */
 func (r *RedisCaller) AddDoc(doc Document) error {
+	_, ok := TopicMap[doc.Category]
+	if !ok {
+		return &InvalidTopic{Topic: doc.Category}
+	}
+
 	val, err := r.Client.Get(r.ctx, doc.Ident).Result()
 	if err == redis.Nil {
 		data, err := json.Marshal(&doc)
 		if err != nil {
 			return err
 		}
-	
+
 		err = r.Client.Set(r.ctx, doc.Ident, data, 0).Err()
 		if err != nil {
 			return err
@@ -119,7 +129,7 @@ func (r *RedisCaller) DeleteDoc(id string) error {
     } else if err != nil {
         return err
     }
-	
+
 	err = r.Client.Del(r.ctx, id).Err()
 	if err != nil {
 		return err
@@ -144,13 +154,13 @@ func (r *RedisCaller) editVal(id string, in interface{}) error {
 		if err != nil {
 			return err
 		}
-	
+
 		err = r.Client.Set(r.ctx, id, data, 0).Err()
 		if err != nil {
 			return err
 		}
 		return nil
-    } 
+    }
 
 func (r *RedisCaller) SeedData(seedLoc string) error {
 	dirs, err := os.ReadDir(seedLoc)

+ 3 - 3
pkg/routes/register.go

@@ -17,7 +17,7 @@ func Register(e *gin.Engine, root string, domain string, redisPort string, redis
 	web.GET("/login", c.ServeLogin)
 	web.POST("/login", c.Auth)
 
-	
+
 	cdn := e.Group("/api/v1")
 	cdn.GET("/style/:file", c.ServeCss)
 	cdn.GET("/js/:file", c.ServeJs)
@@ -25,8 +25,8 @@ func Register(e *gin.Engine, root string, domain string, redisPort string, redis
 	cdn.GET("/assets/:file", c.ServeAsset)
 	cdn.GET("/images/:file", c.ServeImage)
 
-	
-	
+
+
 	priv := e.Group("/admin")
 	priv.Use(c.IsAuthenticated)
 	priv.GET("/panel", c.AdminPanel)