aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/dbasik-api/helpers.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/dbasik-api/helpers.go')
-rw-r--r--cmd/dbasik-api/helpers.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/cmd/dbasik-api/helpers.go b/cmd/dbasik-api/helpers.go
new file mode 100644
index 0000000..3b07dc2
--- /dev/null
+++ b/cmd/dbasik-api/helpers.go
@@ -0,0 +1,86 @@
+// dbasik provides a service with which to convert spreadsheets containing
+// data to JSON for further processing.
+
+// Copyright (C) 2024 M R Lemon
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+package main
+
+import (
+ "encoding/json"
+ "net/http"
+)
+
+// We want this so that our JSON is nested under a key at the top, e.g. "datamap:"...
+type envelope map[string]interface{}
+
+// writeJSON)Pretty() helper for sending responses - pretty prints output. This takes the destination http.ResponseWriter, the
+// HTTP status code to sned, the data to encode to JSON and a header map containing any additional
+// HTTP headers we want to include in the response.
+func (app *application) writeJSONPretty(w http.ResponseWriter, status int, data envelope, headers http.Header) error {
+ // Encode the data to JSON, returing the error if there was one.
+ js, err := json.MarshalIndent(data, "", "\t")
+ if err != nil {
+ return err
+ }
+
+ // Append a newline to make it easier tro view in terminal applications
+ js = append(js, '\n')
+
+ // We know now that we won't encounter any more errors before writing the response,
+ // so it's safe to add any headers that we want to include. We loop through the
+ // header map and add each header to the http.ResponseWriter header map.
+ // Note that it's okay if the provided header map is nil. Go doesn't throw an error
+ // if you wanmt to try to range over (or more generally reader from) a nil map.
+ for key, value := range headers {
+ w.Header()[key] = value
+ }
+ // Add the "Content-Type: application/json" header, then write the status code and
+ // JSON response.
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(status)
+ w.Write(js)
+
+ return nil
+}
+
+// writeJSON() helper for sending responses. This takes the destination http.ResponseWriter, the
+// HTTP status code to sned, the data to encode to JSON and a header map containing any additional
+// HTTP headers we want to include in the response.
+func (app *application) writeJSON(w http.ResponseWriter, status int, data any, headers http.Header) error {
+ // Encode the data to JSON, returing the error if there was one.
+ js, err := json.Marshal(data)
+ if err != nil {
+ return err
+ }
+
+ // Append a newline to make it easier tro view in terminal applications
+ js = append(js, '\n')
+
+ // We know now that we won't encounter any more errors before writing the response,
+ // so it's safe to add any headers that we want to include. We loop through the
+ // header map and add each header to the http.ResponseWriter header map.
+ // Note that it's okay if the provided header map is nil. Go doesn't throw an error
+ // if you wanmt to try to range over (or more generally reader from) a nil map.
+ for key, value := range headers {
+ w.Header()[key] = value
+ }
+ // Add the "Content-Type: application/json" header, then write the status code and
+ // JSON response.
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(status)
+ w.Write(js)
+
+ return nil
+}