aboutsummaryrefslogblamecommitdiffstats
path: root/cmd/dbasik-api/handlers.go
blob: a36adf637e1f8ed6e0d763813699cf59d8ae26dc (plain) (tree)
1
2
3
4
5
6
7
8
9
10






                       
                   

                  
              

                 













                                                                                     
                                                           





                                                                    








                                                                          




                                                                                                                  



                                                                                                                        












                                                                    
                              














                                                                                  
                                                


                                          
                                          

                  
                                                                                         
 

                                                                      
                       
                                                  
         
 
                                                                                 




                                                               
                                                      

























                                                                                      

                              














                                                                                  
                                                


                                          
                                          

                  
                                                                                        
 
                                                                                 





























                                                                                    

                              














                                                                                  
                                                



                                          
                                          


                  
                                                                                        











                                                                                   
                                                                                           
 
                                                                                    














                                                                                    
                                                                   


                                                                                   
                             






                                                                           
package main

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"strconv"
	"time"
)

func (app *application) createReturnHandler(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")
	dmDesc := r.FormValue("description")

	// Get the return file and save it to a file
	returnFile, header, err := r.FormFile("returnfile")
	app.logger.Info("got excel file")
	if err != nil {
		http.Error(w, "Missing file", http.StatusBadRequest)
		return
	}
	defer returnFile.Close()

	tmpDir, err := ioutil.TempDir("", "dbasik-returns")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer os.RemoveAll(tmpDir) // clean the tempdir up

	dst, err := os.Create(path.Join(tmpDir, header.Filename))
	if err != nil {
		http.Error(w, "Cannot create new file object from uplaoded file.", http.StatusInternalServerError)
		return
	}
	defer dst.Close()

	// Write the uploaded file to the new file in the tempdir
	if _, err = io.Copy(dst, returnFile); err != nil {
		http.Error(w, "cannot copy contents of uploaded file to temporary file", http.StatusInternalServerError)
		return
	}

	// Get the uploaded csv 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

	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}

	// we can pass the file path to ParseXLSX.
	ret, err := ParseXLSX(path.Join(tmpDir, header.Filename), &dm)
	if err != nil {
		app.serverErrorResponse(w, r, err)
	}

	err = app.writeJSONPretty(w, http.StatusOK, envelope{"Return": ret}, nil)
	if err != nil {
		app.logger.Debug("writing out csv", "err", err)
		app.serverErrorResponse(w, r, err)
	}

	fmt.Fprintf(w, "file successfully uploaded\n")

}

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) saveDatamapHandler(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{
			ID:       0,
			Key:      line[0],
			Sheet:    line[1],
			DataType: line[2],
			CellRef:  line[3],
		})

	}
	dm = Datamap{Name: dmName, Description: dmDesc, Created: time.Now(), DMLs: dmls}

	// save to the database
	_, err = app.models.DatamapLines.Insert(dm, dmls)
	if err != nil {
		http.Error(w, "Cannot save to database", http.StatusBadRequest)
		return
	}

}

func (app *application) getJSONForDatamap(w http.ResponseWriter, r *http.Request) {
	// Get the DM out of the database
	// 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)
}