func()

in api.go [260:310]


func (h apiHandlers) postOrderCSV(c *gin.Context) {
	customerID, err := strconv.Atoi(c.PostForm("customer"))
	if err != nil {
		err := errors.Wrap(err, "failed to parse customer ID")
		c.AbortWithError(http.StatusBadRequest, err)
		return
	}
	fileHeader, err := c.FormFile("file")
	if err != nil {
		err := errors.Wrap(err, "failed get CSV file")
		c.AbortWithError(http.StatusBadRequest, err)
		return
	}
	file, err := fileHeader.Open()
	if err != nil {
		err := errors.Wrap(err, "failed open CSV file")
		c.AbortWithError(http.StatusInternalServerError, err)
		return
	}
	defer file.Close()

	var lines []ProductOrderLine
	r := csv.NewReader(file)
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		} else if err != nil {
			err := errors.Wrap(err, "failed to parse CSV file")
			c.AbortWithError(http.StatusBadRequest, err)
			return
		}
		productID, err := strconv.Atoi(record[0])
		if err != nil {
			err := errors.Wrap(err, "failed to parse product ID")
			c.AbortWithError(http.StatusBadRequest, err)
			return
		}
		amount, err := strconv.Atoi(record[1])
		if err != nil {
			err := errors.Wrap(err, "failed to parse order amount")
			c.AbortWithError(http.StatusBadRequest, err)
			return
		}
		lines = append(lines, ProductOrderLine{
			Product: Product{ID: productID},
			Amount:  amount,
		})
	}
	h.postOrderCommon(c, customerID, lines)
}