2025-11-11 11:13:38 +01:00

67 lines
2.0 KiB
Go

// addRoutes combines the URL endpoints with the applications's services
// and dependencies and required middleware
func addRoutes(
ctx context.Context,
mux *http.ServeMux,
database *sqlite.Database,
static fs.FS,
templ *template.Template,
) {
mux.Handle("GET /", http.FileServer(http.FS(static)))
mux.Handle("GET /board", api.Board(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("DELETE /delete-record/{id}", api.DeleteRecord(ctx, database, templ))
}
const query = `SELECT u.id, u.name, u.username, u.email, u.phone, u.website, a.street, a.suite, a.zipcode, a.city, c.name as company, c.catch_phrase, c.bs
FROM user u
JOIN company c ON u.company_id = c.id
JOIN address a ON u.address_id = a.id;
`
// load user data and fill template
func Board(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", "text/html")
// Execute template with proper error handling
if err := templ.ExecuteTemplate(w, "board", sqlite.Record{"records": records}); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
},
)
}
// 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
}
},
)
}