Skeleton files and http
This commit is contained in:
+2
-2
@@ -2,7 +2,7 @@ package db
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"log"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,6 +19,6 @@ func Migrate(db *sql.DB, migrations []string) {
|
|||||||
res, err := db.Exec(string(data))
|
res, err := db.Exec(string(data))
|
||||||
_ = res
|
_ = res
|
||||||
CheckError(err)
|
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 (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"net/http"
|
||||||
|
"log"
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
dbpkg "nkeller.dev/blog_software/db"
|
dbpkg "nkeller.dev/blog_software/db"
|
||||||
usrpkg "nkeller.dev/blog_software/user"
|
"nkeller.dev/blog_software/handlers"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Post struct {
|
type Post struct {
|
||||||
@@ -31,10 +32,12 @@ func main() {
|
|||||||
}
|
}
|
||||||
dbpkg.Migrate(db, migrations[:])
|
dbpkg.Migrate(db, migrations[:])
|
||||||
|
|
||||||
user, err := usrpkg.Create(db, "profilelag2", "Hello")
|
http.HandleFunc("/user", handlers.UserHandler)
|
||||||
if err != nil {
|
http.HandleFunc("/post", handlers.PostHandler)
|
||||||
panic(err)
|
|
||||||
}
|
http.HandleFunc("/", handlers.Public)
|
||||||
fmt.Println(user)
|
http.HandleFunc("/post/", handlers.PostPage)
|
||||||
fmt.Printf("user: %v\n", user)
|
|
||||||
|
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
|
package user
|
||||||
|
|
||||||
import (
|
import "database/sql"
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
dbpkg "nkeller.dev/blog_software/db"
|
func Delete(db *sql.DB, id int) (sql.Result, error) {
|
||||||
)
|
|
||||||
|
|
||||||
func Delete(db *sql.DB, id int) {
|
|
||||||
result, err := db.Exec("DELETE FROM users WHERE id = ?;", id)
|
result, err := db.Exec("DELETE FROM users WHERE id = ?;", id)
|
||||||
dbpkg.CheckError(err)
|
if err != nil {
|
||||||
_ = result
|
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
|
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