user.go 4.5 KB

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