diff options
author | Matthew Lemon <y@yulqen.org> | 2024-04-06 11:48:32 +0100 |
---|---|---|
committer | Matthew Lemon <y@yulqen.org> | 2024-04-06 11:51:12 +0100 |
commit | e7e517b822333188ea34f4a4ba83de2253cfe869 (patch) | |
tree | 7c467051ec95e13e1db3925bf80c8b27c40a97db /cmd/dbasik-api/datamaps.go | |
parent | a931a4637f6d51de4059df6d0d72d147e4775018 (diff) |
Reorganises cmd/ structure for publication on pkg.go.dev
Adds key commands to Makefile
Diffstat (limited to 'cmd/dbasik-api/datamaps.go')
-rw-r--r-- | cmd/dbasik-api/datamaps.go | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/cmd/dbasik-api/datamaps.go b/cmd/dbasik-api/datamaps.go new file mode 100644 index 0000000..8d371ab --- /dev/null +++ b/cmd/dbasik-api/datamaps.go @@ -0,0 +1,123 @@ +// 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/csv" + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" +) + +// datamapLine holds the data parsed from each line of a submitted datamap CSV file. +// The fields need to be exported otherwise they won't be included when encoding +// the struct to json. +type datamapLine struct { + Key string `json:"key"` + Sheet string `json:"sheet"` + DataType string `json:"datatype"` + Cellref string `json:"cellref"` +} + +// datamap includes a slice of datamapLine objects alongside header metadata +type datamap struct { + Name string `json:"name"` + Description string `json:"description"` + Created time.Time `json:"created"` + DMLs []datamapLine `json:"datamap_lines"` +} + +func (app *application) createDatamapHandler(w http.ResponseWriter, r *http.Request) { + // Parse the multipart form + err := r.ParseMultipartForm(10 << 20) // 10Mb max + if err != nil { + app.serverErrorResponse(w, r, err) + } + + // Get form values + dmName := r.FormValue("name") + app.logger.Info("obtain value from form", "name", dmName) + dmDesc := r.FormValue("description") + app.logger.Info("obtain value from form", "description", dmDesc) + + // Get the uploaded file and name + file, _, err := r.FormFile("file") + if err != nil { + http.Error(w, "Missing file", http.StatusBadRequest) + return + } + defer file.Close() + + // parse the csv + reader := csv.NewReader(file) + var dmls []datamapLine + var dm datamap + + for { + line, err := reader.Read() + if err != nil { + if err.Error() == "EOF" { + break // end of file + } + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if len(line) != 4 { + http.Error(w, "Invalid CSV Format", http.StatusBadRequest) + return + } + + dmls = append(dmls, datamapLine{ + Key: line[0], + Sheet: line[1], + DataType: line[2], + Cellref: line[3], + }) + } + dm = datamap{Name: dmName, Description: dmDesc, Created: time.Now(), DMLs: dmls} + + err = app.writeJSONPretty(w, http.StatusOK, envelope{"datamap": dm}, nil) + if err != nil { + app.logger.Debug("writing out csv", "err", err) + app.serverErrorResponse(w, r, err) + } + + // fmt.Fprintf(w, "file successfully uploaded") +} + +func (app *application) showDatamapHandler(w http.ResponseWriter, r *http.Request) { + id := r.PathValue("id") + app.logger.Info("the id requested", "id", id) + id_int, err := strconv.ParseInt(id, 10, 64) + if err != nil || id_int < 1 { + app.notFoundResponse(w, r) + } + fmt.Fprintf(w, "show the details for datamap %d\n", id_int) +} + +func (app *application) createDatamapLine(w http.ResponseWriter, r *http.Request) { + var input datamapLine + err := json.NewDecoder(r.Body).Decode(&input) + if err != nil { + app.errorResponse(w, r, http.StatusBadRequest, err.Error()) + return + } + fmt.Fprintf(w, "%v\n", input) +} |