|
- 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
- }
|