entry.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. "github.com/miniflux/miniflux/http/handler"
  8. "github.com/miniflux/miniflux/model"
  9. )
  10. // GetFeedEntry is the API handler to get a single feed entry.
  11. func (c *Controller) GetFeedEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  12. userID := ctx.UserID()
  13. feedID, err := request.IntegerParam("feedID")
  14. if err != nil {
  15. response.JSON().BadRequest(err)
  16. return
  17. }
  18. entryID, err := request.IntegerParam("entryID")
  19. if err != nil {
  20. response.JSON().BadRequest(err)
  21. return
  22. }
  23. builder := c.store.NewEntryQueryBuilder(userID)
  24. builder.WithFeedID(feedID)
  25. builder.WithEntryID(entryID)
  26. entry, err := builder.GetEntry()
  27. if err != nil {
  28. response.JSON().ServerError(errors.New("Unable to fetch this entry from the database"))
  29. return
  30. }
  31. if entry == nil {
  32. response.JSON().NotFound(errors.New("Entry not found"))
  33. return
  34. }
  35. response.JSON().Standard(entry)
  36. }
  37. // GetEntry is the API handler to get a single entry.
  38. func (c *Controller) GetEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  39. userID := ctx.UserID()
  40. entryID, err := request.IntegerParam("entryID")
  41. if err != nil {
  42. response.JSON().BadRequest(err)
  43. return
  44. }
  45. builder := c.store.NewEntryQueryBuilder(userID)
  46. builder.WithEntryID(entryID)
  47. entry, err := builder.GetEntry()
  48. if err != nil {
  49. response.JSON().ServerError(errors.New("Unable to fetch this entry from the database"))
  50. return
  51. }
  52. if entry == nil {
  53. response.JSON().NotFound(errors.New("Entry not found"))
  54. return
  55. }
  56. response.JSON().Standard(entry)
  57. }
  58. // GetFeedEntries is the API handler to get all feed entries.
  59. func (c *Controller) GetFeedEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  60. userID := ctx.UserID()
  61. feedID, err := request.IntegerParam("feedID")
  62. if err != nil {
  63. response.JSON().BadRequest(err)
  64. return
  65. }
  66. status := request.QueryStringParam("status", "")
  67. if status != "" {
  68. if err := model.ValidateEntryStatus(status); err != nil {
  69. response.JSON().BadRequest(err)
  70. return
  71. }
  72. }
  73. order := request.QueryStringParam("order", model.DefaultSortingOrder)
  74. if err := model.ValidateEntryOrder(order); err != nil {
  75. response.JSON().BadRequest(err)
  76. return
  77. }
  78. direction := request.QueryStringParam("direction", model.DefaultSortingDirection)
  79. if err := model.ValidateDirection(direction); err != nil {
  80. response.JSON().BadRequest(err)
  81. return
  82. }
  83. limit := request.QueryIntegerParam("limit", 100)
  84. offset := request.QueryIntegerParam("offset", 0)
  85. if err := model.ValidateRange(offset, limit); err != nil {
  86. response.JSON().BadRequest(err)
  87. return
  88. }
  89. builder := c.store.NewEntryQueryBuilder(userID)
  90. builder.WithFeedID(feedID)
  91. builder.WithStatus(status)
  92. builder.WithOrder(order)
  93. builder.WithDirection(direction)
  94. builder.WithOffset(offset)
  95. builder.WithLimit(limit)
  96. entries, err := builder.GetEntries()
  97. if err != nil {
  98. response.JSON().ServerError(errors.New("Unable to fetch the list of entries"))
  99. return
  100. }
  101. count, err := builder.CountEntries()
  102. if err != nil {
  103. response.JSON().ServerError(errors.New("Unable to count the number of entries"))
  104. return
  105. }
  106. response.JSON().Standard(&entriesResponse{Total: count, Entries: entries})
  107. }
  108. // GetEntries is the API handler to fetch entries.
  109. func (c *Controller) GetEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  110. userID := ctx.UserID()
  111. status := request.QueryStringParam("status", "")
  112. if status != "" {
  113. if err := model.ValidateEntryStatus(status); err != nil {
  114. response.JSON().BadRequest(err)
  115. return
  116. }
  117. }
  118. order := request.QueryStringParam("order", model.DefaultSortingOrder)
  119. if err := model.ValidateEntryOrder(order); err != nil {
  120. response.JSON().BadRequest(err)
  121. return
  122. }
  123. direction := request.QueryStringParam("direction", model.DefaultSortingDirection)
  124. if err := model.ValidateDirection(direction); err != nil {
  125. response.JSON().BadRequest(err)
  126. return
  127. }
  128. limit := request.QueryIntegerParam("limit", 100)
  129. offset := request.QueryIntegerParam("offset", 0)
  130. if err := model.ValidateRange(offset, limit); err != nil {
  131. response.JSON().BadRequest(err)
  132. return
  133. }
  134. builder := c.store.NewEntryQueryBuilder(userID)
  135. builder.WithStatus(status)
  136. builder.WithOrder(order)
  137. builder.WithDirection(direction)
  138. builder.WithOffset(offset)
  139. builder.WithLimit(limit)
  140. entries, err := builder.GetEntries()
  141. if err != nil {
  142. response.JSON().ServerError(errors.New("Unable to fetch the list of entries"))
  143. return
  144. }
  145. count, err := builder.CountEntries()
  146. if err != nil {
  147. response.JSON().ServerError(errors.New("Unable to count the number of entries"))
  148. return
  149. }
  150. response.JSON().Standard(&entriesResponse{Total: count, Entries: entries})
  151. }
  152. // SetEntryStatus is the API handler to change the status of entries.
  153. func (c *Controller) SetEntryStatus(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  154. userID := ctx.UserID()
  155. entryIDs, status, err := decodeEntryStatusPayload(request.Body())
  156. if err != nil {
  157. response.JSON().BadRequest(errors.New("Invalid JSON payload"))
  158. return
  159. }
  160. if err := model.ValidateEntryStatus(status); err != nil {
  161. response.JSON().BadRequest(err)
  162. return
  163. }
  164. if err := c.store.SetEntriesStatus(userID, entryIDs, status); err != nil {
  165. response.JSON().ServerError(errors.New("Unable to change entries status"))
  166. return
  167. }
  168. response.JSON().NoContent()
  169. }
  170. // ToggleBookmark is the API handler to toggle bookmark status.
  171. func (c *Controller) ToggleBookmark(ctx *handler.Context, request *handler.Request, response *handler.Response) {
  172. userID := ctx.UserID()
  173. entryID, err := request.IntegerParam("entryID")
  174. if err != nil {
  175. response.JSON().BadRequest(err)
  176. return
  177. }
  178. if err := c.store.ToggleBookmark(userID, entryID); err != nil {
  179. response.JSON().ServerError(errors.New("Unable to toggle bookmark value"))
  180. return
  181. }
  182. response.JSON().NoContent()
  183. }