user.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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) markUserAsRead(w http.ResponseWriter, r *http.Request) {
  77. userID := request.RouteInt64Param(r, "userID")
  78. if userID != request.UserID(r) {
  79. json.Forbidden(w, r)
  80. return
  81. }
  82. if _, err := h.store.UserByID(userID); err != nil {
  83. json.NotFound(w, r)
  84. return
  85. }
  86. if err := h.store.MarkAllAsRead(userID); err != nil {
  87. json.ServerError(w, r, err)
  88. return
  89. }
  90. json.NoContent(w, r)
  91. }
  92. func (h *handler) users(w http.ResponseWriter, r *http.Request) {
  93. if !request.IsAdminUser(r) {
  94. json.Forbidden(w, r)
  95. return
  96. }
  97. users, err := h.store.Users()
  98. if err != nil {
  99. json.ServerError(w, r, err)
  100. return
  101. }
  102. users.UseTimezone(request.UserTimezone(r))
  103. json.OK(w, r, users)
  104. }
  105. func (h *handler) userByID(w http.ResponseWriter, r *http.Request) {
  106. if !request.IsAdminUser(r) {
  107. json.Forbidden(w, r)
  108. return
  109. }
  110. userID := request.RouteInt64Param(r, "userID")
  111. user, err := h.store.UserByID(userID)
  112. if err != nil {
  113. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  114. return
  115. }
  116. if user == nil {
  117. json.NotFound(w, r)
  118. return
  119. }
  120. user.UseTimezone(request.UserTimezone(r))
  121. json.OK(w, r, user)
  122. }
  123. func (h *handler) userByUsername(w http.ResponseWriter, r *http.Request) {
  124. if !request.IsAdminUser(r) {
  125. json.Forbidden(w, r)
  126. return
  127. }
  128. username := request.RouteStringParam(r, "username")
  129. user, err := h.store.UserByUsername(username)
  130. if err != nil {
  131. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  132. return
  133. }
  134. if user == nil {
  135. json.NotFound(w, r)
  136. return
  137. }
  138. json.OK(w, r, user)
  139. }
  140. func (h *handler) removeUser(w http.ResponseWriter, r *http.Request) {
  141. if !request.IsAdminUser(r) {
  142. json.Forbidden(w, r)
  143. return
  144. }
  145. userID := request.RouteInt64Param(r, "userID")
  146. user, err := h.store.UserByID(userID)
  147. if err != nil {
  148. json.ServerError(w, r, err)
  149. return
  150. }
  151. if user == nil {
  152. json.NotFound(w, r)
  153. return
  154. }
  155. if user.ID == request.UserID(r) {
  156. json.BadRequest(w, r, errors.New("You cannot remove yourself"))
  157. return
  158. }
  159. h.store.RemoveUserAsync(user.ID)
  160. json.NoContent(w, r)
  161. }