Another Post
This is another post
My name
is Christian.
- This is
- Some content
// main.go
package main
import (
"context"
"database/sql"
"encoding/json"
"flag"
"log/slog"
"net/http"
"os"
"cdb.dev/goserve/internal/cli"
"cdb.dev/goserve/internal/handlers"
)
func main() {
ctx := context.Background()
args := cli.ParseArgs()
mux := http.NewServeMux()
server := &http.Server{
Addr: args.Addr,
Handler: mux,
}
db, err := sql.Open("sqlite3", args.DBFile)
if err != nil {
slog.Log(ctx, slog.LevelError, "failed to open database", "error", err)
os.Exit(1)
}
slog.Log(ctx, slog.LevelInfo, "database opened", "path", args.DBFile)
usersHandler := &handlers.usersHandler{db: db}
mux.HandleFunc("/users", usersHandler.GetUsers)
slog.Log(ctx, slog.LevelInfo, "starting server", "addr", args.Addr)
server.ListenAndServe()
}
// internal/cli/args.go
type args struct {
Addr string
DBFile string
}
func ParseArgs() *args {
var args args
flag.StringVar(&args.Addr, "addr", ":8080", "address to listen on")
flag.StringVar(&args.DBFile, "db", "db.json", "path to the database file")
flag.Parse()
return &args
}
// handlers/users.go
package handlers
type usersHandler struct {
db *sql.DB
}
type user struct {
ID int `json:"id"`
Name string `json:"name"`
}
func (h *usersHandler) GetUsers(w http.ResponseWriter, r *http.Request) {
rows, err := h.db.Query("SELECT id, name FROM users")
if err != nil {
slog.Log(r.Context(), slog.LevelError, "failed to query users", "error", err)
http.Error(w, "failed to query users", http.StatusInternalServerError)
return
}
defer rows.Close()
users := []user{}
for rows.Next() {
var user user
if err := rows.Scan(&user.id, &user.name); err != nil {
slog.Log(r.Context(), slog.LevelError, "failed to scan user", "error", err)
http.Error(w, "failed to scan user", http.StatusInternalServerError)
return
}
users = append(users, user)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(users)
}