user.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. // CurrentUser is the API handler to retrieve the authenticated user.
  12. func (c *Controller) CurrentUser(w http.ResponseWriter, r *http.Request) {
  13. user, err := c.store.UserByID(request.UserID(r))
  14. if err != nil {
  15. json.ServerError(w, err)
  16. return
  17. }
  18. json.OK(w, r, user)
  19. }
  20. // CreateUser is the API handler to create a new user.
  21. func (c *Controller) CreateUser(w http.ResponseWriter, r *http.Request) {
  22. if !request.IsAdminUser(r) {
  23. json.Forbidden(w)
  24. return
  25. }
  26. user, err := decodeUserCreationPayload(r.Body)
  27. if err != nil {
  28. json.BadRequest(w, err)
  29. return
  30. }
  31. if err := user.ValidateUserCreation(); err != nil {
  32. json.BadRequest(w, err)
  33. return
  34. }
  35. if c.store.UserExists(user.Username) {
  36. json.BadRequest(w, errors.New("This user already exists"))
  37. return
  38. }
  39. err = c.store.CreateUser(user)
  40. if err != nil {
  41. json.ServerError(w, err)
  42. return
  43. }
  44. user.Password = ""
  45. json.Created(w, user)
  46. }
  47. // UpdateUser is the API handler to update the given user.
  48. func (c *Controller) UpdateUser(w http.ResponseWriter, r *http.Request) {
  49. if !request.IsAdminUser(r) {
  50. json.Forbidden(w)
  51. return
  52. }
  53. userID, err := request.IntParam(r, "userID")
  54. if err != nil {
  55. json.BadRequest(w, err)
  56. return
  57. }
  58. userChanges, err := decodeUserModificationPayload(r.Body)
  59. if err != nil {
  60. json.BadRequest(w, err)
  61. return
  62. }
  63. originalUser, err := c.store.UserByID(userID)
  64. if err != nil {
  65. json.BadRequest(w, errors.New("Unable to fetch this user from the database"))
  66. return
  67. }
  68. if originalUser == nil {
  69. json.NotFound(w, errors.New("User not found"))
  70. return
  71. }
  72. userChanges.Update(originalUser)
  73. if err := originalUser.ValidateUserModification(); err != nil {
  74. json.BadRequest(w, err)
  75. return
  76. }
  77. if err = c.store.UpdateUser(originalUser); err != nil {
  78. json.ServerError(w, err)
  79. return
  80. }
  81. json.Created(w, originalUser)
  82. }
  83. // Users is the API handler to get the list of users.
  84. func (c *Controller) Users(w http.ResponseWriter, r *http.Request) {
  85. if !request.IsAdminUser(r) {
  86. json.Forbidden(w)
  87. return
  88. }
  89. users, err := c.store.Users()
  90. if err != nil {
  91. json.ServerError(w, err)
  92. return
  93. }
  94. users.UseTimezone(request.UserTimezone(r))
  95. json.OK(w, r, users)
  96. }
  97. // UserByID is the API handler to fetch the given user by the ID.
  98. func (c *Controller) UserByID(w http.ResponseWriter, r *http.Request) {
  99. if !request.IsAdminUser(r) {
  100. json.Forbidden(w)
  101. return
  102. }
  103. userID, err := request.IntParam(r, "userID")
  104. if err != nil {
  105. json.BadRequest(w, err)
  106. return
  107. }
  108. user, err := c.store.UserByID(userID)
  109. if err != nil {
  110. json.BadRequest(w, errors.New("Unable to fetch this user from the database"))
  111. return
  112. }
  113. if user == nil {
  114. json.NotFound(w, errors.New("User not found"))
  115. return
  116. }
  117. user.UseTimezone(request.UserTimezone(r))
  118. json.OK(w, r, user)
  119. }
  120. // UserByUsername is the API handler to fetch the given user by the username.
  121. func (c *Controller) UserByUsername(w http.ResponseWriter, r *http.Request) {
  122. if !request.IsAdminUser(r) {
  123. json.Forbidden(w)
  124. return
  125. }
  126. username := request.Param(r, "username", "")
  127. user, err := c.store.UserByUsername(username)
  128. if err != nil {
  129. json.BadRequest(w, errors.New("Unable to fetch this user from the database"))
  130. return
  131. }
  132. if user == nil {
  133. json.NotFound(w, errors.New("User not found"))
  134. return
  135. }
  136. json.OK(w, r, user)
  137. }
  138. // RemoveUser is the API handler to remove an existing user.
  139. func (c *Controller) RemoveUser(w http.ResponseWriter, r *http.Request) {
  140. if !request.IsAdminUser(r) {
  141. json.Forbidden(w)
  142. return
  143. }
  144. userID, err := request.IntParam(r, "userID")
  145. if err != nil {
  146. json.BadRequest(w, err)
  147. return
  148. }
  149. user, err := c.store.UserByID(userID)
  150. if err != nil {
  151. json.ServerError(w, err)
  152. return
  153. }
  154. if user == nil {
  155. json.NotFound(w, errors.New("User not found"))
  156. return
  157. }
  158. if err := c.store.RemoveUser(user.ID); err != nil {
  159. json.BadRequest(w, errors.New("Unable to remove this user from the database"))
  160. return
  161. }
  162. json.NoContent(w)
  163. }