Преглед изворни кода

Add API endpoint for OPML export

Rogier Lommers пре 8 година
родитељ
комит
4aec2453f4
3 измењених фајлова са 21 додато и 0 уклоњено
  1. 14 0
      api/feed.go
  2. 1 0
      daemon/routes.go
  3. 6 0
      http/handler/xml_response.go

+ 14 - 0
api/feed.go

@@ -7,6 +7,8 @@ package api
 import (
 	"errors"
 
+	"github.com/miniflux/miniflux/reader/opml"
+
 	"github.com/miniflux/miniflux/http/handler"
 )
 
@@ -132,6 +134,18 @@ func (c *Controller) GetFeeds(ctx *handler.Context, request *handler.Request, re
 	response.JSON().Standard(feeds)
 }
 
+// Export is the API handler that incoves an OPML export.
+func (c *Controller) Export(ctx *handler.Context, request *handler.Request, response *handler.Response) {
+	opmlHandler := opml.NewHandler(c.store)
+
+	opml, err := opmlHandler.Export(ctx.LoggedUser().ID)
+	if err != nil {
+		response.JSON().ServerError(errors.New("unable to export feeds to OPML"))
+	}
+
+	response.XML().Serve(opml)
+}
+
 // GetFeed is the API handler to get a feed.
 func (c *Controller) GetFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
 	userID := ctx.UserID()

+ 1 - 0
daemon/routes.go

@@ -68,6 +68,7 @@ func routes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handle
 	router.Handle("/v1/feeds/{feedID}", apiHandler.Use(apiController.UpdateFeed)).Methods("PUT")
 	router.Handle("/v1/feeds/{feedID}", apiHandler.Use(apiController.RemoveFeed)).Methods("DELETE")
 	router.Handle("/v1/feeds/{feedID}/icon", apiHandler.Use(apiController.FeedIcon)).Methods("GET")
+	router.Handle("/v1/export", apiHandler.Use(apiController.Export)).Methods("GET")
 
 	router.Handle("/v1/feeds/{feedID}/entries", apiHandler.Use(apiController.GetFeedEntries)).Methods("GET")
 	router.Handle("/v1/feeds/{feedID}/entries/{entryID}", apiHandler.Use(apiController.GetFeedEntry)).Methods("GET")

+ 6 - 0
http/handler/xml_response.go

@@ -21,3 +21,9 @@ func (x *XMLResponse) Download(filename, data string) {
 	x.writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
 	x.writer.Write([]byte(data))
 }
+
+// Serve forces the XML to be sent to browser.
+func (x *XMLResponse) Serve(data string) {
+	x.writer.Header().Set("Content-Type", "text/xml")
+	x.writer.Write([]byte(data))
+}