improves crud example

This commit is contained in:
thomashamburg 2025-11-11 11:13:38 +01:00
parent 1f1bad15ee
commit d7203062b5
5 changed files with 59 additions and 3 deletions

Binary file not shown.

View File

@ -2,9 +2,10 @@ package api
import ( import (
"context" "context"
"crud/sqlite"
"encoding/json"
"fmt" "fmt"
"html/template" "html/template"
"crud/sqlite"
"net/http" "net/http"
"strconv" "strconv"
) )
@ -123,3 +124,34 @@ func PatchRecord(ctx context.Context, db *sqlite.Database, templ *template.Templ
}, },
) )
} }
func RecordJson(ctx context.Context, db *sqlite.Database, templ *template.Template) http.Handler {
// Implementation of EditRecord handler
return http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
}
records, err := db.ReadRecords(ctx, baseQuery+" WHERE u.id = ?;", id)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
rec := records[0]
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(rec); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
},
)
}

Binary file not shown.

View File

@ -25,4 +25,6 @@ func addRoutes(
mux.Handle("GET /edit-record/{id}", api.EditRecord(ctx, database, templ)) mux.Handle("GET /edit-record/{id}", api.EditRecord(ctx, database, templ))
mux.Handle("PATCH /patch-record/{id}", api.PatchRecord(ctx, database, templ)) mux.Handle("PATCH /patch-record/{id}", api.PatchRecord(ctx, database, templ))
mux.Handle("DELETE /delete-record/{id}", api.DeleteRecord(ctx, database, templ)) mux.Handle("DELETE /delete-record/{id}", api.DeleteRecord(ctx, database, templ))
mux.Handle("GET /html/{id}", api.EditRecord(ctx, database, templ))
mux.Handle("GET /json/{id}", api.RecordJson(ctx, database, templ))
} }

View File

@ -26,14 +26,14 @@ func Board(ctx context.Context, db *sqlite.Database, templ *template.Template) h
func(w http.ResponseWriter, r *http.Request) { func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
records, err := sqlite.NoRowsOk(db.ReadRecords(ctx, query)) records, err := sqlite.NoRowsOk(db.ReadRecords(ctx, query))
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
w.Header().Set("Content-Type", "text/html")
// Execute template with proper error handling // Execute template with proper error handling
if err := templ.ExecuteTemplate(w, "board", sqlite.Record{"records": records}); err != nil { if err := templ.ExecuteTemplate(w, "board", sqlite.Record{"records": records}); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
@ -42,3 +42,25 @@ func Board(ctx context.Context, db *sqlite.Database, templ *template.Template) h
}, },
) )
} }
// load user data and return json
func BoardJson(ctx context.Context, db *sqlite.Database, templ *template.Template) http.Handler {
return http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
records, err := sqlite.NoRowsOk(db.ReadRecords(ctx, query))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(records); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
},
)
}