Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

171 lines
4.0KB

  1. package main
  2. import (
  3. "biukop.com/sfm/loan"
  4. "bytes"
  5. "database/sql"
  6. "encoding/json"
  7. log "github.com/sirupsen/logrus"
  8. "io"
  9. "net/http"
  10. "strings"
  11. "time"
  12. )
  13. func apiV1StepUploadsPost(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  14. id := r.URL.Path[len(apiV1Prefix+"step-upload/"):] //remove prefix
  15. s := loan.Steps{}
  16. e := s.Read(id)
  17. if e != nil {
  18. apiV1Client404Error(w, r, ss)
  19. return
  20. }
  21. if e != nil {
  22. log.Error("cannot read step Id for new upload", s, e)
  23. apiV1Server500Error(w, r)
  24. return
  25. }
  26. if s.LoanId != s.LoanId {
  27. log.Error("loanId mis-match for step upload", s)
  28. apiV1Client403Error(w, r, ss)
  29. return
  30. }
  31. s.UploadedAt = time.Now()
  32. e = saveStepUploadToDb(&s, r)
  33. if e != nil {
  34. s.FileContent = s.FileContent[0:512] //only keep first 512 byte for log purpose
  35. log.Println("failed to save step uploads", s, e)
  36. apiV1Server500Error(w, r)
  37. return
  38. }
  39. s.FileContent = nil
  40. apiV1SendJson(s, w, r, ss)
  41. }
  42. func saveStepUploadToDb(step *loan.Steps, r *http.Request) (e error) {
  43. e = r.ParseMultipartForm(10 << 20)
  44. if e != nil {
  45. return
  46. }
  47. file, header, e := r.FormFile("files")
  48. if e != nil {
  49. log.Error("Error Getting StepUpload File", e)
  50. return
  51. }
  52. buf := new(strings.Builder)
  53. n, err := io.Copy(buf, file)
  54. if err != nil {
  55. log.Error("Error copy StepUpload File to memory", e, n)
  56. return err
  57. }
  58. step.FileName = header.Filename
  59. step.FileSize = int(header.Size)
  60. step.FileMime = header.Header.Get("Content-type")
  61. step.FileContent = []byte(buf.String())
  62. e = step.Write()
  63. return
  64. }
  65. func apiV1StepUploadsDownload(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  66. id := r.URL.Path[len(apiV1Prefix+"step-download/"):] //remove prefix
  67. s := loan.Steps{}
  68. e := s.ReadWithContent(id)
  69. if e != nil {
  70. if e != sql.ErrNoRows {
  71. log.Warn("invalid upload id", e, id)
  72. apiV1Client403Error(w, r, ss)
  73. }
  74. return
  75. }
  76. w.Header().Set("Content-Disposition", "attachment; filename="+s.FileName)
  77. w.Header().Set("Content-Type", s.FileMime)
  78. http.ServeContent(w, r, s.FileName, s.UploadedAt, bytes.NewReader(s.FileContent))
  79. }
  80. func decodeJsonStep(r *http.Request) (ret loan.Steps, e error) {
  81. decoder := json.NewDecoder(r.Body)
  82. //decoder.DisallowUnknownFields()
  83. e = decoder.Decode(&ret)
  84. if e != nil {
  85. log.Error("failed decoding json for Filtering full_loan_summary ", e.Error())
  86. return
  87. }
  88. return
  89. }
  90. func apiV1StepUploadsGetID(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  91. step, e := decodeJsonStep(r)
  92. if e != nil || step.StepIndex <= 0 {
  93. log.Error("unauthorized parameters for upload step attachment", step)
  94. apiV1Client403Error(w, r, ss)
  95. return
  96. }
  97. e = step.GetIdByLoanIdAndIdx(step.LoanId, step.StepIndex)
  98. if e != nil {
  99. log.Error("cannot get step id for Loan, and index", step, e)
  100. apiV1Client404Error(w, r, ss)
  101. } else {
  102. apiV1SendJson(step, w, r, ss)
  103. }
  104. }
  105. func apiV1StepUploadsMetaPost(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  106. step, e := decodeJsonStep(r)
  107. if e != nil || step.StepIndex <= 0 {
  108. log.Error("unauthorized parameters for upload step attachment", step)
  109. apiV1Client403Error(w, r, ss)
  110. return
  111. }
  112. e = step.Write()
  113. if e != nil {
  114. log.Error("cannot get step id for Loan, and index", step, e)
  115. apiV1Client404Error(w, r, ss)
  116. } else {
  117. apiV1SendJson(step, w, r, ss)
  118. }
  119. }
  120. func apiV1StepDelete(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  121. id := r.URL.Path[len(apiV1Prefix+"step/"):] //remove prefix
  122. step := loan.Steps{Id: id}
  123. e := step.Read(id)
  124. if e != nil {
  125. apiV1Client404Error(w, r, ss)
  126. return
  127. }
  128. e = step.Delete()
  129. if e != nil {
  130. apiV1Server500Error(w, r)
  131. } else {
  132. apiV1SendJson(true, w, r, ss)
  133. }
  134. return
  135. }
  136. func apiV1StepDeleteFile(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  137. id := r.URL.Path[len(apiV1Prefix+"step-file/"):] //remove prefix
  138. step := loan.Steps{Id: id}
  139. e := step.Read(id)
  140. if e != nil {
  141. apiV1Client404Error(w, r, ss)
  142. return
  143. }
  144. e = step.DeleteFile()
  145. if e != nil {
  146. apiV1Server500Error(w, r)
  147. } else {
  148. apiV1SendJson(true, w, r, ss)
  149. }
  150. return
  151. }