package main import ( "biukop.com/sfm/loan" "bytes" "database/sql" "encoding/json" log "github.com/sirupsen/logrus" "io" "net/http" "strings" "time" ) func apiV1StepUploadsPost(w http.ResponseWriter, r *http.Request, ss *loan.Session) { id := r.URL.Path[len(apiV1Prefix+"step-upload/"):] //remove prefix s := loan.Steps{} e := s.Read(id) if e != nil { apiV1Client404Error(w, r, ss) return } if e != nil { log.Error("cannot read step Id for new upload", s, e) apiV1Server500Error(w, r) return } if s.LoanId != s.LoanId { log.Error("loanId mis-match for step upload", s) apiV1Client403Error(w, r, ss) return } s.UploadedAt = time.Now() e = saveStepUploadToDb(&s, r) if e != nil { s.FileContent = s.FileContent[0:512] //only keep first 512 byte for log purpose log.Println("failed to save step uploads", s, e) apiV1Server500Error(w, r) return } s.FileContent = nil apiV1SendJson(s, w, r, ss) } func saveStepUploadToDb(step *loan.Steps, r *http.Request) (e error) { e = r.ParseMultipartForm(10 << 20) if e != nil { return } file, header, e := r.FormFile("files") if e != nil { log.Error("Error Getting StepUpload File", e) return } buf := new(strings.Builder) n, err := io.Copy(buf, file) if err != nil { log.Error("Error copy StepUpload File to memory", e, n) return err } step.FileName = header.Filename step.FileSize = int(header.Size) step.FileMime = header.Header.Get("Content-type") step.FileContent = []byte(buf.String()) e = step.Write() return } func apiV1StepUploadsDownload(w http.ResponseWriter, r *http.Request, ss *loan.Session) { id := r.URL.Path[len(apiV1Prefix+"step-download/"):] //remove prefix s := loan.Steps{} e := s.ReadWithContent(id) if e != nil { if e != sql.ErrNoRows { log.Warn("invalid upload id", e, id) apiV1Client403Error(w, r, ss) } return } w.Header().Set("Content-Disposition", "attachment; filename="+s.FileName) w.Header().Set("Content-Type", s.FileMime) http.ServeContent(w, r, s.FileName, s.UploadedAt, bytes.NewReader(s.FileContent)) } func decodeJsonStep(r *http.Request) (ret loan.Steps, e error) { decoder := json.NewDecoder(r.Body) //decoder.DisallowUnknownFields() e = decoder.Decode(&ret) if e != nil { log.Error("failed decoding json for Filtering full_loan_summary ", e.Error()) return } return } func apiV1StepUploadsGetID(w http.ResponseWriter, r *http.Request, ss *loan.Session) { step, e := decodeJsonStep(r) if e != nil || step.StepIndex <= 0 { log.Error("unauthorized parameters for upload step attachment", step) apiV1Client403Error(w, r, ss) return } e = step.GetIdByLoanIdAndIdx(step.LoanId, step.StepIndex) if e != nil { log.Error("cannot get step id for Loan, and index", step, e) apiV1Client404Error(w, r, ss) } else { apiV1SendJson(step, w, r, ss) } } func apiV1StepUploadsMetaPost(w http.ResponseWriter, r *http.Request, ss *loan.Session) { step, e := decodeJsonStep(r) if e != nil || step.StepIndex <= 0 { log.Error("unauthorized parameters for upload step attachment", step) apiV1Client403Error(w, r, ss) return } e = step.Write() if e != nil { log.Error("cannot get step id for Loan, and index", step, e) apiV1Client404Error(w, r, ss) } else { apiV1SendJson(step, w, r, ss) } } func apiV1StepDelete(w http.ResponseWriter, r *http.Request, ss *loan.Session) { id := r.URL.Path[len(apiV1Prefix+"step/"):] //remove prefix step := loan.Steps{Id: id} e := step.Read(id) if e != nil { apiV1Client404Error(w, r, ss) return } e = step.Delete() if e != nil { apiV1Server500Error(w, r) } else { apiV1SendJson(true, w, r, ss) } return } func apiV1StepDeleteFile(w http.ResponseWriter, r *http.Request, ss *loan.Session) { id := r.URL.Path[len(apiV1Prefix+"step-file/"):] //remove prefix step := loan.Steps{Id: id} e := step.Read(id) if e != nil { apiV1Client404Error(w, r, ss) return } e = step.DeleteFile() if e != nil { apiV1Server500Error(w, r) } else { apiV1SendJson(true, w, r, ss) } return }