Skeleton files and http
This commit is contained in:
+2
-2
@@ -2,7 +2,7 @@ package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"log"
|
||||
"log/slog"
|
||||
"os"
|
||||
)
|
||||
|
||||
@@ -19,6 +19,6 @@ func Migrate(db *sql.DB, migrations []string) {
|
||||
res, err := db.Exec(string(data))
|
||||
_ = res
|
||||
CheckError(err)
|
||||
log.Print("Applied migration " + x)
|
||||
slog.Info("Applied migration", "name", x)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func PostHandler(w http.ResponseWriter, req *http.Request) {
|
||||
log.Print(req.URL.Path)
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func PostPage(w http.ResponseWriter, req *http.Request) {
|
||||
log.Printf("Serving a post")
|
||||
log.Print(req.URL.Path)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func Public(w http.ResponseWriter, req *http.Request) {
|
||||
log.Print(req.URL.Path)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func UserHandler(w http.ResponseWriter, req *http.Request) {
|
||||
log.Print(req.Method)
|
||||
}
|
||||
@@ -2,11 +2,12 @@ package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"log"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
dbpkg "nkeller.dev/blog_software/db"
|
||||
usrpkg "nkeller.dev/blog_software/user"
|
||||
"nkeller.dev/blog_software/handlers"
|
||||
)
|
||||
|
||||
type Post struct {
|
||||
@@ -31,10 +32,12 @@ func main() {
|
||||
}
|
||||
dbpkg.Migrate(db, migrations[:])
|
||||
|
||||
user, err := usrpkg.Create(db, "profilelag2", "Hello")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(user)
|
||||
fmt.Printf("user: %v\n", user)
|
||||
http.HandleFunc("/user", handlers.UserHandler)
|
||||
http.HandleFunc("/post", handlers.PostHandler)
|
||||
|
||||
http.HandleFunc("/", handlers.Public)
|
||||
http.HandleFunc("/post/", handlers.PostPage)
|
||||
|
||||
log.Print("Starting Blog_Software at http://localhost:8080")
|
||||
http.ListenAndServe(":8080", nil)
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,31 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Blog_Software</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="title">Nick's Blog</h1>
|
||||
<h2 id="subtitle">Thought I'd write a little bit</h2>
|
||||
|
||||
<div id="posts">
|
||||
<hr>
|
||||
<div class="post">
|
||||
<a href="/post/2"><h1>Diabetes Jokes</h1></a>
|
||||
<h2>Jul 25, 2026</h2>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="post">
|
||||
<a href="/post/1"><h1>We're Totally Doomed, So Here's The Plan</h1></a>
|
||||
<h2>Jul 5, 2026</h2>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="post">
|
||||
<a href="/post/0"><h1>Snippets are better than your Agentic slop</h1></a>
|
||||
<h2>Jun 26, 2026</h2>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,49 @@
|
||||
@font-face {
|
||||
font-family: "JetBrains Mono";
|
||||
src: url("JetBrainsMono-Regular.woff2") format("woff2");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
:root {
|
||||
--background: rgb(38, 38, 38);
|
||||
--foreground: rgb(240, 240, 240);
|
||||
--subtext: rgb(100, 100, 100);
|
||||
}
|
||||
html {
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
}
|
||||
body {
|
||||
background-color: var(--background);
|
||||
color: var(--foreground);
|
||||
width: 50%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#title {
|
||||
font-size: 3.5rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#subtitle {
|
||||
color:var(--subtext);
|
||||
font-size: 1rem;
|
||||
padding-bottom: 2rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
#posts {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.post > a > h1 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0;
|
||||
color:pink;
|
||||
}
|
||||
.post > a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.post > h2 {
|
||||
color: var(--subtext);
|
||||
font-size: 0.7rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
+16
-9
@@ -1,13 +1,20 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
import "database/sql"
|
||||
|
||||
dbpkg "nkeller.dev/blog_software/db"
|
||||
)
|
||||
|
||||
func Delete(db *sql.DB, id int) {
|
||||
func Delete(db *sql.DB, id int) (sql.Result, error) {
|
||||
result, err := db.Exec("DELETE FROM users WHERE id = ?;", id)
|
||||
dbpkg.CheckError(err)
|
||||
_ = result
|
||||
}
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
if rowsAffected == 0 {
|
||||
return result, sql.ErrNoRows
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -1,2 +1,19 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
type Password struct {
|
||||
password sql.NullString
|
||||
}
|
||||
|
||||
func Verify(db *sql.DB, username string, password string) (bool, error) {
|
||||
row := db.QueryRow("SELECT password FROM users WHERE username = ?;", username)
|
||||
dbPassword := &Password{}
|
||||
err := row.Scan(&dbPassword.password)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return (dbPassword.password.String == password), nil
|
||||
}
|
||||
Reference in New Issue
Block a user