Compare commits

...

2 Commits

Author SHA1 Message Date
williamp 9c24bdca1f add postgres connection test 2026-05-16 20:56:14 +00:00
williamp de106c61fe server: implement getuser 2026-05-16 20:47:53 +00:00
4 changed files with 42 additions and 2 deletions
+3
View File
@@ -25,6 +25,9 @@ func Start() {
r.Route("/users", func(r chi.Router) { r.Route("/users", func(r chi.Router) {
r.Get("/", ListUsers) r.Get("/", ListUsers)
r.Route("/{userID}", func(r chi.Router) {
r.Get("/", GetUser)
})
}) })
r.Route("/register", func(r chi.Router) { r.Route("/register", func(r chi.Router) {
+4 -2
View File
@@ -10,13 +10,15 @@ import (
"github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5"
) )
var ErrUserNotFound = errors.New("db: user not found")
func dbGetUser(id string) (*User, error) { func dbGetUser(id string) (*User, error) {
query := `SELECT id, name, password FROM users WHERE id = $1` query := `SELECT id, name, password FROM users WHERE id = $1`
var user User var user User
err := db.Pool.QueryRow(context.Background(), query, id).Scan(&user.ID, &user.Name, &user.Password) err := db.Pool.QueryRow(context.Background(), query, id).Scan(&user.ID, &user.Name, &user.Password)
if errors.Is(err, pgx.ErrNoRows) { if errors.Is(err, pgx.ErrNoRows) {
slog.Debug("db: user not found", "userid", id) slog.Debug("db: user not found", "userid", id)
return nil, errors.New("user not found") return nil, ErrUserNotFound
} else if err != nil { } else if err != nil {
slog.Error("db: failed to query user", "error", err) slog.Error("db: failed to query user", "error", err)
return nil, fmt.Errorf("failed to query user") return nil, fmt.Errorf("failed to query user")
@@ -32,7 +34,7 @@ func dbGetUserByName(username string) (*User, error) {
err := db.Pool.QueryRow(context.Background(), query, username).Scan(&user.ID, &user.Name, &user.Password) err := db.Pool.QueryRow(context.Background(), query, username).Scan(&user.ID, &user.Name, &user.Password)
if errors.Is(err, pgx.ErrNoRows) { if errors.Is(err, pgx.ErrNoRows) {
slog.Debug("db: user not found", "username", username) slog.Debug("db: user not found", "username", username)
return nil, errors.New("user not found") return nil, ErrUserNotFound
} else if err != nil { } else if err != nil {
slog.Error("db: failed to query user", "error", err) slog.Error("db: failed to query user", "error", err)
return nil, fmt.Errorf("failed to query user") return nil, fmt.Errorf("failed to query user")
+30
View File
@@ -1,9 +1,11 @@
package api package api
import ( import (
"errors"
"log/slog" "log/slog"
"net/http" "net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render" "github.com/go-chi/render"
"github.com/google/uuid" "github.com/google/uuid"
) )
@@ -35,6 +37,34 @@ func ListUsers(w http.ResponseWriter, r *http.Request) {
} }
} }
func GetUser(w http.ResponseWriter, r *http.Request) {
slog.Debug("user: entering GetUser handler")
userID := chi.URLParam(r, "userID")
parsed, err := uuid.Parse(userID)
if err != nil {
render.Render(w, r, ErrInvalidRequest(err))
return
}
user, err := dbGetUser(parsed.String())
if err != nil {
if errors.Is(err, ErrUserNotFound) {
render.Render(w, r, ErrNotFound)
} else {
slog.Error("user: failed to fetch user", "userid", parsed.String(), "error", err)
render.Render(w, r, ErrRender(err))
}
return
}
slog.Debug("user: rendering user", "userid", user.ID, "username", user.Name)
if err := render.Render(w, r, NewUserPayloadResponse(user)); err != nil {
slog.Error("user: failed to render user", "userid", parsed.String(), "error", err)
render.Render(w, r, ErrRender(err))
}
}
func newUserID() uuid.UUID { func newUserID() uuid.UUID {
return uuid.New() return uuid.New()
} }
+5
View File
@@ -17,6 +17,11 @@ func InitPostgres(ctx context.Context) {
os.Exit(1) os.Exit(1)
} }
Pool = pool Pool = pool
err = pool.Ping(ctx)
if err != nil {
slog.Error("Failed to connect to Postgres", "error", err)
os.Exit(1)
}
slog.Info("Connected to Postgres") slog.Info("Connected to Postgres")
} }