user.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package api
  2. import (
  3. "database/sql"
  4. "errors"
  5. "net/http"
  6. "strconv"
  7. "github.com/drakkan/sftpgo/dataprovider"
  8. "github.com/go-chi/chi"
  9. "github.com/go-chi/render"
  10. )
  11. func getUsers(w http.ResponseWriter, r *http.Request) {
  12. limit := 100
  13. offset := 0
  14. order := "ASC"
  15. username := ""
  16. var err error
  17. if _, ok := r.URL.Query()["limit"]; ok {
  18. limit, err = strconv.Atoi(r.URL.Query().Get("limit"))
  19. if err != nil {
  20. err = errors.New("Invalid limit")
  21. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  22. return
  23. }
  24. if limit > 500 {
  25. limit = 500
  26. }
  27. }
  28. if _, ok := r.URL.Query()["offset"]; ok {
  29. offset, err = strconv.Atoi(r.URL.Query().Get("offset"))
  30. if err != nil {
  31. err = errors.New("Invalid offset")
  32. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  33. return
  34. }
  35. }
  36. if _, ok := r.URL.Query()["order"]; ok {
  37. order = r.URL.Query().Get("order")
  38. if order != "ASC" && order != "DESC" {
  39. err = errors.New("Invalid order")
  40. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  41. return
  42. }
  43. }
  44. if _, ok := r.URL.Query()["username"]; ok {
  45. username = r.URL.Query().Get("username")
  46. }
  47. users, err := dataprovider.GetUsers(dataProvider, limit, offset, order, username)
  48. if err == nil {
  49. render.JSON(w, r, users)
  50. } else {
  51. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  52. }
  53. }
  54. func getUserByID(w http.ResponseWriter, r *http.Request) {
  55. userID, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64)
  56. if err != nil {
  57. err = errors.New("Invalid userID")
  58. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  59. return
  60. }
  61. user, err := dataprovider.GetUserByID(dataProvider, userID)
  62. if err == nil {
  63. user.Password = ""
  64. user.PublicKeys = []string{}
  65. render.JSON(w, r, user)
  66. } else if err == sql.ErrNoRows {
  67. sendAPIResponse(w, r, err, "", http.StatusNotFound)
  68. } else {
  69. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  70. }
  71. }
  72. func addUser(w http.ResponseWriter, r *http.Request) {
  73. var user dataprovider.User
  74. err := render.DecodeJSON(r.Body, &user)
  75. if err != nil {
  76. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  77. return
  78. }
  79. err = dataprovider.AddUser(dataProvider, user)
  80. if err == nil {
  81. user, err = dataprovider.UserExists(dataProvider, user.Username)
  82. if err == nil {
  83. user.Password = ""
  84. user.PublicKeys = []string{}
  85. render.JSON(w, r, user)
  86. } else {
  87. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  88. }
  89. } else {
  90. sendAPIResponse(w, r, err, "", getRespStatus(err))
  91. }
  92. }
  93. func updateUser(w http.ResponseWriter, r *http.Request) {
  94. userID, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64)
  95. if err != nil {
  96. err = errors.New("Invalid userID")
  97. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  98. return
  99. }
  100. user, err := dataprovider.GetUserByID(dataProvider, userID)
  101. if err == sql.ErrNoRows {
  102. sendAPIResponse(w, r, err, "", http.StatusNotFound)
  103. return
  104. } else if err != nil {
  105. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  106. return
  107. }
  108. err = render.DecodeJSON(r.Body, &user)
  109. if err != nil {
  110. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  111. return
  112. }
  113. if user.ID != userID {
  114. sendAPIResponse(w, r, err, "user ID in request body does not match user ID in path parameter", http.StatusBadRequest)
  115. return
  116. }
  117. err = dataprovider.UpdateUser(dataProvider, user)
  118. if err != nil {
  119. sendAPIResponse(w, r, err, "", getRespStatus(err))
  120. } else {
  121. sendAPIResponse(w, r, err, "User updated", http.StatusOK)
  122. }
  123. }
  124. func deleteUser(w http.ResponseWriter, r *http.Request) {
  125. userID, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64)
  126. if err != nil {
  127. err = errors.New("Invalid userID")
  128. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  129. return
  130. }
  131. user, err := dataprovider.GetUserByID(dataProvider, userID)
  132. if err == sql.ErrNoRows {
  133. sendAPIResponse(w, r, err, "", http.StatusNotFound)
  134. return
  135. } else if err != nil {
  136. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  137. return
  138. }
  139. err = dataprovider.DeleteUser(dataProvider, user)
  140. if err != nil {
  141. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  142. } else {
  143. sendAPIResponse(w, r, err, "User deleted", http.StatusOK)
  144. }
  145. }