diff options
| author | Samuel Johnson <[email protected]> | 2025-11-24 00:38:12 -0500 |
|---|---|---|
| committer | Samuel Johnson <[email protected]> | 2025-11-24 00:38:12 -0500 |
| commit | 177663c73f3d708120b975a74eebd0951177a53b (patch) | |
| tree | 9629bfced318c645496a31cc7844c7840605113c | |
| parent | 1692aea0951f1d46af01211bd3e32920c443505f (diff) | |
Add blog posts to front page
| -rw-r--r-- | cmd/parser/main.go | 9 | ||||
| -rw-r--r-- | cmd/web/handlers/blog.go | 30 | ||||
| -rw-r--r-- | cmd/web/handlers/routes.go | 5 | ||||
| -rw-r--r-- | cmd/web/main.go | 24 | ||||
| -rw-r--r-- | internal/context/environment.go | 2 | ||||
| -rw-r--r-- | internal/models/post.go | 10 | ||||
| -rw-r--r-- | ui/html/pages/index.tmpl.html | 8 |
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}} |
