From 121ac0b2457d5f5617916aad38f5c05d94570260 Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 31 Dec 2023 06:18:38 +0100 Subject: Added GET /entries?[from=N] Endpoint name changed to plural --- main.go | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 036b47c..e28f72b 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "log" "net/http" "os" + "strconv" "github.com/gorilla/mux" ) @@ -16,14 +17,14 @@ var content embed.FS func handleEntryOptions(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS") + w.Header().Set("Access-Control-Allow-Methods", "OPTIONS, POST, GET") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") w.WriteHeader(http.StatusNoContent) } func handleEntryPost(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS") + w.Header().Set("Access-Control-Allow-Methods", "OPTIONS, POST, GET") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") var entry Entry err := json.NewDecoder(r.Body).Decode(&entry) @@ -39,10 +40,46 @@ func handleEntryPost(w http.ResponseWriter, r *http.Request) { log.Println("New entry for", entry.Location) } +type EntriesPage struct { + Total uint `json:"total"` + Offset uint `json:"offset"` + Size uint `json:"size"` + Entries []Entry `json:"entries"` +} + + +func handleEntryGet(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "OPTIONS, POST, GET") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + from64, _ := strconv.ParseUint(r.FormValue("from"), 10, 32) + from := uint(from64) + count, err := CountEntries() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + entries, err := ListEntries(from, 1000) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if entries == nil { + entries = []Entry{} + } + page := EntriesPage{Total: count, Offset: from, Size: uint(len(entries)), Entries: entries} + err = json.NewEncoder(w).Encode(&page) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} + func handleRequests() { router := mux.NewRouter() - router.HandleFunc("/entry", handleEntryPost).Methods("POST") - router.HandleFunc("/entry", handleEntryOptions).Methods("OPTIONS") + router.HandleFunc("/entries", handleEntryOptions).Methods("OPTIONS") + router.HandleFunc("/entries", handleEntryPost).Methods("POST") + router.HandleFunc("/entries", handleEntryGet).Methods("GET") router.PathPrefix("/").Handler(http.FileServer(http.FS(content))) log.Fatal(http.ListenAndServe(configure(), router)) } -- cgit v1.1