From a5ed110385da9f101c17e00351663c7f3f024358 Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@helsinki.at>
Date: Sun, 16 Sep 2018 16:55:13 +0200
Subject: [PATCH] some cleanup

---
 api/v1/api_uploads.go | 104 ++++++++++++++++++++++++++----------------
 1 file changed, 64 insertions(+), 40 deletions(-)

diff --git a/api/v1/api_uploads.go b/api/v1/api_uploads.go
index d79e172..4883a40 100644
--- a/api/v1/api_uploads.go
+++ b/api/v1/api_uploads.go
@@ -246,6 +246,15 @@ func getOrNewFlowJSFile(job *importer.Job, flowId string, chunk, totalChunks, to
 
 //***
 
+const (
+	FlowJSParamID               string = "flowIdentifier"
+	FlowJSParamChunk            string = "flowChunkNumber"
+	FlowJSParamTotalChunks      string = "flowTotalChunks"
+	FlowJSParamCurrentChunkSize string = "flowCurrentChunkSize"
+	FlowJSParamTotalSize        string = "flowTotalSize"
+	FlowJSParamFile             string = "file"
+)
+
 func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalChunks, chunkSize, totalSize uint64, data io.Reader, err error) {
 	var mr *multipart.Reader
 	if mr, err = r.MultipartReader(); err != nil {
@@ -263,7 +272,7 @@ func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalCh
 		}
 
 		pn := p.FormName()
-		if pn == "file" {
+		if pn == FlowJSParamFile {
 			data = p
 			break
 		}
@@ -272,51 +281,89 @@ func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalCh
 			return
 		}
 		switch pn {
-		case "flowIdentifier":
+		case FlowJSParamID:
 			id = string(pd)
-		case "flowChunkNumber":
+		case FlowJSParamChunk:
 			if chunk, err = strconv.ParseUint(string(pd), 10, 64); err != nil {
-				err = errors.New("invalid parameter 'flowChunkNumber': " + err.Error())
+				err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamChunk, err.Error())
 				return
 			}
-		case "flowTotalChunks":
+		case FlowJSParamTotalChunks:
 			if totalChunks, err = strconv.ParseUint(string(pd), 10, 64); err != nil {
-				err = errors.New("invalid parameter 'flowTotalChunk': " + err.Error())
+				err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalChunks, err.Error())
 				return
 			}
-		case "flowCurrentChunkSize":
+		case FlowJSParamCurrentChunkSize:
 			if chunkSize, err = strconv.ParseUint(string(pd), 10, 64); err != nil {
-				err = errors.New("invalid parameter 'flowCurrentChunkSize': " + err.Error())
+				err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamCurrentChunkSize, err.Error())
 				return
 			}
-		case "flowTotalSize":
+		case FlowJSParamTotalSize:
 			if totalSize, err = strconv.ParseUint(string(pd), 10, 64); err != nil {
-				err = errors.New("invalid parameter 'flowTotalSize': " + err.Error())
+				err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalSize, err.Error())
 				return
 			}
 		}
 	}
+
 	var missing []string
 	if id == "" {
-		missing = append(missing, "flowIdentifier")
+		missing = append(missing, FlowJSParamID)
 	}
 	if chunk == 0 {
-		missing = append(missing, "flowChunkNumber")
+		missing = append(missing, FlowJSParamChunk)
 	}
 	if totalChunks == 0 {
-		missing = append(missing, "flowTotalChunks")
+		missing = append(missing, FlowJSParamTotalChunks)
 	}
 	if chunkSize == 0 {
-		missing = append(missing, "flowCurrentChunkSize")
+		missing = append(missing, FlowJSParamCurrentChunkSize)
 	}
 	if totalSize == 0 {
-		missing = append(missing, "flowTotalSize")
+		missing = append(missing, FlowJSParamTotalSize)
 	}
 	if data == nil {
-		missing = append(missing, "file")
+		missing = append(missing, FlowJSParamFile)
+	}
+	if len(missing) > 0 {
+		err = errors.New("missing/invalid mandatory parameter: " + strings.Join(missing, ", "))
+	}
+	return
+}
+
+//***
+
+func getFlowJSParameterFromQuery(r *http.Request) (id string, chunk, totalChunks, totalSize uint64, err error) {
+	q := r.URL.Query()
+	id = q.Get(FlowJSParamID)
+	if chunk, err = strconv.ParseUint(q.Get(FlowJSParamChunk), 10, 64); err != nil {
+		err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamChunk, err.Error())
+		return
+	}
+	if totalChunks, err = strconv.ParseUint(q.Get(FlowJSParamTotalChunks), 10, 64); err != nil {
+		err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalChunks, err.Error())
+		return
+	}
+	if totalSize, err = strconv.ParseUint(q.Get(FlowJSParamTotalSize), 10, 64); err != nil {
+		err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalSize, err.Error())
+		return
+	}
+
+	var missing []string
+	if id == "" {
+		missing = append(missing, FlowJSParamID)
+	}
+	if chunk == 0 {
+		missing = append(missing, FlowJSParamChunk)
+	}
+	if totalChunks == 0 {
+		missing = append(missing, FlowJSParamTotalChunks)
+	}
+	if totalSize == 0 {
+		missing = append(missing, FlowJSParamTotalSize)
 	}
 	if len(missing) > 0 {
-		err = errors.New("missing mandatory parameter: " + strings.Join(missing, ", "))
+		err = errors.New("missing/invalid mandatory parameter: " + strings.Join(missing, ", "))
 	}
 	return
 }
@@ -380,33 +427,10 @@ func (api *API) UploadFileFlowJS() http.Handler {
 			sendWebResponse(w, http.StatusInternalServerError, ErrorResponse{Error: "failed to mark chunk completed: " + err.Error()})
 			return
 		}
-		// TODO: if this is the last chunk to be uploaded wait for fetch converter to finish?
 		sendWebResponse(w, http.StatusOK, nil)
 	})
 }
 
-func getFlowJSParameterFromQuery(r *http.Request) (id string, chunk, totalChunks, totalSize uint64, err error) {
-	q := r.URL.Query()
-	id = q.Get("flowIdentifier")
-	if chunk, err = strconv.ParseUint(q.Get("flowChunkNumber"), 10, 64); err != nil {
-		err = errors.New("invalid query parameter 'flowChunkNumber': " + err.Error())
-		return
-	}
-	if chunk < 1 {
-		err = errors.New("invalid chunk number: 0")
-		return
-	}
-	if totalChunks, err = strconv.ParseUint(q.Get("flowTotalChunks"), 10, 64); err != nil {
-		err = errors.New("invalid query parameter 'flowTotalChunks': " + err.Error())
-		return
-	}
-	if totalSize, err = strconv.ParseUint(q.Get("flowTotalSize"), 10, 64); err != nil {
-		err = errors.New("invalid query parameter 'flowTotalSize': " + err.Error())
-		return
-	}
-	return
-}
-
 func (api *API) TestFileFlowJS() http.Handler {
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		vars := mux.Vars(r)
-- 
GitLab