aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Johnson <[email protected]>2025-11-24 00:38:12 -0500
committerSamuel Johnson <[email protected]>2025-11-24 00:38:12 -0500
commit177663c73f3d708120b975a74eebd0951177a53b (patch)
tree9629bfced318c645496a31cc7844c7840605113c
parent1692aea0951f1d46af01211bd3e32920c443505f (diff)
Add blog posts to front page
-rw-r--r--cmd/parser/main.go9
-rw-r--r--cmd/web/handlers/blog.go30
-rw-r--r--cmd/web/handlers/routes.go5
-rw-r--r--cmd/web/main.go24
-rw-r--r--internal/context/environment.go2
-rw-r--r--internal/models/post.go10
-rw-r--r--ui/html/pages/index.tmpl.html8
7 files changed, 83 insertions, 5 deletions
diff --git a/cmd/parser/main.go b/cmd/parser/main.go
index c9c80c8..bf79439 100644
--- a/cmd/parser/main.go
+++ b/cmd/parser/main.go
@@ -104,8 +104,11 @@ func main() {
),
)
- host := "localhost"
- port := 5432
+ host := os.Getenv("db_host")
+ port, err := strconv.ParseUint(os.Getenv("db_port"), 10, 64)
+ if err != nil {
+ port = 5432
+ }
dbName := os.Getenv("db_name")
user := os.Getenv("db_user")
pass := os.Getenv("db_pass")
@@ -131,7 +134,7 @@ func main() {
passOne := os.Getenv("blog_pass1")
passTwo := os.Getenv("blog_pass2")
- _, table_check = db.Query("SELECT * FROM users;")
+ _, table_check = db.Query("SELECT * FROM logins;")
if table_check != nil {
_, err = db.Exec("CREATE TABLE logins (id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, time DATE DEFAULT CURRENT_DATE, pass_one TEXT NOT NULL, pass_two TEXT NOT NULL);")
if err != nil {
diff --git a/cmd/web/handlers/blog.go b/cmd/web/handlers/blog.go
index d995583..07ab361 100644
--- a/cmd/web/handlers/blog.go
+++ b/cmd/web/handlers/blog.go
@@ -1,14 +1,19 @@
package handlers
import (
+ "database/sql"
"html/template"
"log"
"net/http"
+
+ "paterissa.net/mblog/internal/models"
)
type blogContext struct {
err *log.Logger
+ db *sql.DB
+ Rows []models.Post
Name string
}
@@ -18,6 +23,31 @@ func (ctx *blogContext) index(w http.ResponseWriter, r *http.Request) {
return
}
+ offset := r.URL.Query().Get("offset")
+ if offset == "" {
+ offset = "20"
+ }
+
+ rows, err := ctx.db.Query("SELECT * FROM posts WHERE id < " + offset + " ORDER BY id DESC LIMIT 20;")
+ if err != nil {
+ ctx.err.Print(err.Error())
+ http.Error(w, "Internal Server Error", 500)
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var p models.Post
+
+ if err = rows.Scan(&p.Id, &p.Name, &p.Time, &p.Content); err != nil {
+ ctx.err.Print(err.Error())
+ http.Error(w, "Internal Server Error", 500)
+ return
+ }
+
+ ctx.Rows = append(ctx.Rows, p)
+ }
+
files := []string{
"ui/html/base.tmpl.html",
"ui/html/music_player.tmpl.html",
diff --git a/cmd/web/handlers/routes.go b/cmd/web/handlers/routes.go
index 91c27a2..e9fd0f5 100644
--- a/cmd/web/handlers/routes.go
+++ b/cmd/web/handlers/routes.go
@@ -1,13 +1,16 @@
package handlers
import (
+ "database/sql"
"net/http"
+
"paterissa.net/mblog/cmd/web/types"
)
-func RegisterEndpoints(app types.Application) *http.ServeMux {
+func RegisterEndpoints(app types.Application, db *sql.DB) *http.ServeMux {
blog := blogContext{
err: app.Err,
+ db: db,
Name: app.Env.Webmaster,
}
audio := fsContext{
diff --git a/cmd/web/main.go b/cmd/web/main.go
index 619cc93..42b672a 100644
--- a/cmd/web/main.go
+++ b/cmd/web/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "database/sql"
"fmt"
"log"
"net/http"
@@ -9,6 +10,8 @@ import (
"github.com/joho/godotenv"
+ _ "github.com/jackc/pgx/v5/stdlib"
+
"paterissa.net/mblog/cmd/web/handlers"
"paterissa.net/mblog/cmd/web/types"
)
@@ -28,6 +31,11 @@ func main() {
app.Env.Webmaster = os.Getenv("webmaster")
app.Env.Db.Name = os.Getenv("db_name")
+ app.Env.Db.Port, err = strconv.ParseUint(os.Getenv("db_port"), 10, 64)
+ if err != nil {
+ app.Env.Db.Port = 5432
+ }
+ app.Env.Db.Host = os.Getenv("db_host")
app.Env.Db.Username = os.Getenv("db_user")
app.Env.Db.Password = os.Getenv("db_pass")
app.Env.AppPort, err = strconv.ParseUint(os.Getenv("web_port"), 10, 64)
@@ -35,7 +43,21 @@ func main() {
app.Env.AppPort = 5005
}
- router := handlers.RegisterEndpoints(app)
+ connStr := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
+ app.Env.Db.Host,
+ app.Env.Db.Port,
+ app.Env.Db.Username,
+ app.Env.Db.Password,
+ app.Env.Db.Name,
+ )
+ db, err := sql.Open("pgx", connStr)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to open DB: %v\n", err)
+ os.Exit(1)
+ }
+ defer db.Close()
+
+ router := handlers.RegisterEndpoints(app, db)
srv := &http.Server{
Addr: fmt.Sprintf(":%d", app.Env.AppPort),
ErrorLog: app.Err,
diff --git a/internal/context/environment.go b/internal/context/environment.go
index 7d52978..35cb9d8 100644
--- a/internal/context/environment.go
+++ b/internal/context/environment.go
@@ -2,6 +2,8 @@ package context
type DbCredentials struct {
Name string
+ Host string
+ Port uint64
Username string
Password string
}
diff --git a/internal/models/post.go b/internal/models/post.go
new file mode 100644
index 0000000..d7b006d
--- /dev/null
+++ b/internal/models/post.go
@@ -0,0 +1,10 @@
+package models
+
+import "html/template"
+
+type Post struct {
+ Id int
+ Name string
+ Time string
+ Content template.HTML
+}
diff --git a/ui/html/pages/index.tmpl.html b/ui/html/pages/index.tmpl.html
index 46a58e8..ec98623 100644
--- a/ui/html/pages/index.tmpl.html
+++ b/ui/html/pages/index.tmpl.html
@@ -3,4 +3,12 @@
{{define "main"}}
<h2>Blog</h2>
<p>Home of {{.Name}}</p>
+ {{range .Rows}}
+ <div class="card">
+ <div class="header">
+ <h4><b>{{.Name}} - {{.Time}}</b></h4>
+ {{.Content}}
+ </div>
+ </div>
+ {{end}}
{{end}}