diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 45 |
1 files changed, 41 insertions, 4 deletions
@@ -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)) } |