Another Post

Another Post

This is another post

My name is Christian.

// 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)
}