user.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. "miniflux.app/model"
  11. )
  12. func (h *handler) currentUser(w http.ResponseWriter, r *http.Request) {
  13. user, err := h.store.UserByID(request.UserID(r))
  14. if err != nil {
  15. json.ServerError(w, r, err)
  16. return
  17. }
  18. json.OK(w, r, user)
  19. }
  20. func (h *handler) createUser(w http.ResponseWriter, r *http.Request) {
  21. if !request.IsAdminUser(r) {
  22. json.Forbidden(w, r)
  23. return
  24. }
  25. userCreationRequest, err := decodeUserCreationRequest(r.Body)
  26. if err != nil {
  27. json.BadRequest(w, r, err)
  28. return
  29. }
  30. user := model.NewUser()
  31. user.Username = userCreationRequest.Username
  32. user.Password = userCreationRequest.Password
  33. user.IsAdmin = userCreationRequest.IsAdmin
  34. user.GoogleID = userCreationRequest.GoogleID
  35. user.OpenIDConnectID = userCreationRequest.OpenIDConnectID
  36. if err := user.ValidateUserCreation(); err != nil {
  37. json.BadRequest(w, r, err)
  38. return
  39. }
  40. if h.store.UserExists(user.Username) {
  41. json.BadRequest(w, r, errors.New("This user already exists"))
  42. return
  43. }
  44. err = h.store.CreateUser(user)
  45. if err != nil {
  46. json.ServerError(w, r, err)
  47. return
  48. }
  49. user.Password = ""
  50. json.Created(w, r, user)
  51. }
  52. func (h *handler) updateUser(w http.ResponseWriter, r *http.Request) {
  53. if !request.IsAdminUser(r) {
  54. json.Forbidden(w, r)
  55. return
  56. }
  57. userID := request.RouteInt64Param(r, "userID")
  58. userChanges, err := decodeUserModificationRequest(r.Body)
  59. if err != nil {
  60. json.BadRequest(w, r, err)
  61. return
  62. }
  63. originalUser, err := h.store.UserByID(userID)
  64. if err != nil {
  65. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  66. return
  67. }
  68. if originalUser == nil {
  69. json.NotFound(w, r)
  70. return
  71. }
  72. userChanges.Update(originalUser)
  73. if err := originalUser.ValidateUserModification(); err != nil {
  74. json.BadRequest(w, r, err)
  75. return
  76. }
  77. if err = h.store.UpdateUser(originalUser); err != nil {
  78. json.ServerError(w, r, err)
  79. return
  80. }
  81. json.Created(w, r, originalUser)
  82. }
  83. func (h *handler) markUserAsRead(w http.ResponseWriter, r *http.Request) {
  84. userID := request.RouteInt64Param(r, "userID")
  85. if userID != request.UserID(r) {
  86. json.Forbidden(w, r)
  87. return
  88. }
  89. if _, err := h.store.UserByID(userID); err != nil {
  90. json.NotFound(w, r)
  91. return
  92. }
  93. if err := h.store.MarkAllAsRead(userID); err != nil {
  94. json.ServerError(w, r, err)
  95. return
  96. }
  97. json.NoContent(w, r)
  98. }
  99. func (h *handler) users(w http.ResponseWriter, r *http.Request) {
  100. if !request.IsAdminUser(r) {
  101. json.Forbidden(w, r)
  102. return
  103. }
  104. users, err := h.store.Users()
  105. if err != nil {
  106. json.ServerError(w, r, err)
  107. return
  108. }
  109. users.UseTimezone(request.UserTimezone(r))
  110. json.OK(w, r, users)
  111. }
  112. func (h *handler) userByID(w http.ResponseWriter, r *http.Request) {
  113. if !request.IsAdminUser(r) {
  114. json.Forbidden(w, r)
  115. return
  116. }
  117. userID := request.RouteInt64Param(r, "userID")
  118. user, err := h.store.UserByID(userID)
  119. if err != nil {
  120. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  121. return
  122. }
  123. if user == nil {
  124. json.NotFound(w, r)
  125. return
  126. }
  127. user.UseTimezone(request.UserTimezone(r))
  128. json.OK(w, r, user)
  129. }
  130. func (h *handler) userByUsername(w http.ResponseWriter, r *http.Request) {
  131. if !request.IsAdminUser(r) {
  132. json.Forbidden(w, r)
  133. return
  134. }
  135. username := request.RouteStringParam(r, "username")
  136. user, err := h.store.UserByUsername(username)
  137. if err != nil {
  138. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  139. return
  140. }
  141. if user == nil {
  142. json.NotFound(w, r)
  143. return
  144. }
  145. json.OK(w, r, user)
  146. }
  147. func (h *handler) removeUser(w http.ResponseWriter, r *http.Request) {
  148. if !request.IsAdminUser(r) {
  149. json.Forbidden(w, r)
  150. return
  151. }
  152. userID := request.RouteInt64Param(r, "userID")
  153. user, err := h.store.UserByID(userID)
  154. if err != nil {
  155. json.ServerError(w, r, err)
  156. return
  157. }
  158. if user == nil {
  159. json.NotFound(w, r)
  160. return
  161. }
  162. if user.ID == request.UserID(r) {
  163. json.BadRequest(w, r, errors.New("You cannot remove yourself"))
  164. return
  165. }
  166. h.store.RemoveUserAsync(user.ID)
  167. json.NoContent(w, r)
  168. }