user.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package api // import "miniflux.app/api"
  5. import (
  6. "errors"
  7. "net/http"
  8. "miniflux.app/http/request"
  9. "miniflux.app/http/response/json"
  10. )
  11. func (h *handler) currentUser(w http.ResponseWriter, r *http.Request) {
  12. user, err := h.store.UserByID(request.UserID(r))
  13. if err != nil {
  14. json.ServerError(w, r, err)
  15. return
  16. }
  17. json.OK(w, r, user)
  18. }
  19. func (h *handler) createUser(w http.ResponseWriter, r *http.Request) {
  20. if !request.IsAdminUser(r) {
  21. json.Forbidden(w, r)
  22. return
  23. }
  24. user, err := decodeUserCreationPayload(r.Body)
  25. if err != nil {
  26. json.BadRequest(w, r, err)
  27. return
  28. }
  29. if err := user.ValidateUserCreation(); err != nil {
  30. json.BadRequest(w, r, err)
  31. return
  32. }
  33. if h.store.UserExists(user.Username) {
  34. json.BadRequest(w, r, errors.New("This user already exists"))
  35. return
  36. }
  37. err = h.store.CreateUser(user)
  38. if err != nil {
  39. json.ServerError(w, r, err)
  40. return
  41. }
  42. user.Password = ""
  43. json.Created(w, r, user)
  44. }
  45. func (h *handler) updateUser(w http.ResponseWriter, r *http.Request) {
  46. if !request.IsAdminUser(r) {
  47. json.Forbidden(w, r)
  48. return
  49. }
  50. userID := request.RouteInt64Param(r, "userID")
  51. userChanges, err := decodeUserModificationPayload(r.Body)
  52. if err != nil {
  53. json.BadRequest(w, r, err)
  54. return
  55. }
  56. originalUser, err := h.store.UserByID(userID)
  57. if err != nil {
  58. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  59. return
  60. }
  61. if originalUser == nil {
  62. json.NotFound(w, r)
  63. return
  64. }
  65. userChanges.Update(originalUser)
  66. if err := originalUser.ValidateUserModification(); err != nil {
  67. json.BadRequest(w, r, err)
  68. return
  69. }
  70. if err = h.store.UpdateUser(originalUser); err != nil {
  71. json.ServerError(w, r, err)
  72. return
  73. }
  74. json.Created(w, r, originalUser)
  75. }
  76. func (h *handler) users(w http.ResponseWriter, r *http.Request) {
  77. if !request.IsAdminUser(r) {
  78. json.Forbidden(w, r)
  79. return
  80. }
  81. users, err := h.store.Users()
  82. if err != nil {
  83. json.ServerError(w, r, err)
  84. return
  85. }
  86. users.UseTimezone(request.UserTimezone(r))
  87. json.OK(w, r, users)
  88. }
  89. func (h *handler) userByID(w http.ResponseWriter, r *http.Request) {
  90. if !request.IsAdminUser(r) {
  91. json.Forbidden(w, r)
  92. return
  93. }
  94. userID := request.RouteInt64Param(r, "userID")
  95. user, err := h.store.UserByID(userID)
  96. if err != nil {
  97. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  98. return
  99. }
  100. if user == nil {
  101. json.NotFound(w, r)
  102. return
  103. }
  104. user.UseTimezone(request.UserTimezone(r))
  105. json.OK(w, r, user)
  106. }
  107. func (h *handler) userByUsername(w http.ResponseWriter, r *http.Request) {
  108. if !request.IsAdminUser(r) {
  109. json.Forbidden(w, r)
  110. return
  111. }
  112. username := request.RouteStringParam(r, "username")
  113. user, err := h.store.UserByUsername(username)
  114. if err != nil {
  115. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  116. return
  117. }
  118. if user == nil {
  119. json.NotFound(w, r)
  120. return
  121. }
  122. json.OK(w, r, user)
  123. }
  124. func (h *handler) removeUser(w http.ResponseWriter, r *http.Request) {
  125. if !request.IsAdminUser(r) {
  126. json.Forbidden(w, r)
  127. return
  128. }
  129. userID := request.RouteInt64Param(r, "userID")
  130. user, err := h.store.UserByID(userID)
  131. if err != nil {
  132. json.ServerError(w, r, err)
  133. return
  134. }
  135. if user == nil {
  136. json.NotFound(w, r)
  137. return
  138. }
  139. if user.ID == request.UserID(r) {
  140. json.BadRequest(w, r, errors.New("You cannot remove yourself"))
  141. return
  142. }
  143. h.store.RemoveUserAsync(user.ID)
  144. json.NoContent(w, r)
  145. }