|
|
@@ -8,74 +8,70 @@ import (
|
|
|
|
|
|
"miniflux.app/v2/internal/storage"
|
|
|
"miniflux.app/v2/internal/worker"
|
|
|
-
|
|
|
- "github.com/gorilla/mux"
|
|
|
)
|
|
|
|
|
|
type handler struct {
|
|
|
- store *storage.Storage
|
|
|
- pool *worker.Pool
|
|
|
- router *mux.Router
|
|
|
+ store *storage.Storage
|
|
|
+ pool *worker.Pool
|
|
|
}
|
|
|
|
|
|
-// Serve declares API routes for the application.
|
|
|
-func Serve(router *mux.Router, store *storage.Storage, pool *worker.Pool) {
|
|
|
- handler := &handler{store, pool, router}
|
|
|
-
|
|
|
- sr := router.PathPrefix("/v1").Subrouter()
|
|
|
+// NewHandler returns an http.Handler that handles API v1 calls.
|
|
|
+// The returned handler expects the base path to be stripped from the request URL.
|
|
|
+func NewHandler(store *storage.Storage, pool *worker.Pool) http.Handler {
|
|
|
+ handler := &handler{store: store, pool: pool}
|
|
|
middleware := newMiddleware(store)
|
|
|
- sr.Use(middleware.handleCORS)
|
|
|
- sr.Use(middleware.apiKeyAuth)
|
|
|
- sr.Use(middleware.basicAuth)
|
|
|
- sr.Methods(http.MethodOptions)
|
|
|
- sr.HandleFunc("/users", handler.createUserHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/users", handler.usersHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/users/{userID:[0-9]+}", handler.userByIDHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/users/{userID:[0-9]+}", handler.updateUserHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/users/{userID:[0-9]+}", handler.removeUserHandler).Methods(http.MethodDelete)
|
|
|
- sr.HandleFunc("/users/{userID:[0-9]+}/mark-all-as-read", handler.markUserAsReadHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/users/{username}", handler.userByUsernameHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/me", handler.currentUserHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/categories", handler.createCategoryHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/categories", handler.getCategoriesHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/categories/{categoryID}", handler.updateCategoryHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/categories/{categoryID}", handler.removeCategoryHandler).Methods(http.MethodDelete)
|
|
|
- sr.HandleFunc("/categories/{categoryID}/mark-all-as-read", handler.markCategoryAsReadHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/categories/{categoryID}/feeds", handler.getCategoryFeedsHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/categories/{categoryID}/refresh", handler.refreshCategoryHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/categories/{categoryID}/entries", handler.getCategoryEntriesHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/categories/{categoryID}/entries/{entryID}", handler.getCategoryEntryHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/discover", handler.discoverSubscriptionsHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/feeds", handler.createFeedHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/feeds", handler.getFeedsHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/feeds/counters", handler.fetchCountersHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/feeds/refresh", handler.refreshAllFeedsHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/refresh", handler.refreshFeedHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/feeds/{feedID}", handler.getFeedHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/feeds/{feedID}", handler.updateFeedHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/feeds/{feedID}", handler.removeFeedHandler).Methods(http.MethodDelete)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/icon", handler.getIconByFeedIDHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/mark-all-as-read", handler.markFeedAsReadHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/export", handler.exportFeedsHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/import", handler.importFeedsHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/entries", handler.getFeedEntriesHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/entries/import", handler.importFeedEntryHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/feeds/{feedID}/entries/{entryID}", handler.getFeedEntryHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/entries", handler.getEntriesHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/entries", handler.setEntryStatusHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/entries/{entryID}", handler.getEntryHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/entries/{entryID}", handler.updateEntryHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/entries/{entryID}/bookmark", handler.toggleStarredHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/entries/{entryID}/star", handler.toggleStarredHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/entries/{entryID}/save", handler.saveEntryHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/entries/{entryID}/fetch-content", handler.fetchContentHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/flush-history", handler.flushHistoryHandler).Methods(http.MethodPut, http.MethodDelete)
|
|
|
- sr.HandleFunc("/icons/{iconID}", handler.getIconByIconIDHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/enclosures/{enclosureID}", handler.getEnclosureByIDHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/enclosures/{enclosureID}", handler.updateEnclosureByIDHandler).Methods(http.MethodPut)
|
|
|
- sr.HandleFunc("/integrations/status", handler.getIntegrationsStatusHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/version", handler.versionHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/api-keys", handler.createAPIKeyHandler).Methods(http.MethodPost)
|
|
|
- sr.HandleFunc("/api-keys", handler.getAPIKeysHandler).Methods(http.MethodGet)
|
|
|
- sr.HandleFunc("/api-keys/{apiKeyID}", handler.deleteAPIKeyHandler).Methods(http.MethodDelete)
|
|
|
+
|
|
|
+ mux := http.NewServeMux()
|
|
|
+ mux.HandleFunc("POST /v1/users", handler.createUserHandler)
|
|
|
+ mux.HandleFunc("GET /v1/users", handler.usersHandler)
|
|
|
+ mux.HandleFunc("GET /v1/users/{identifier}", handler.dispatchUserLookupHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/users/{userID}", handler.updateUserHandler)
|
|
|
+ mux.HandleFunc("DELETE /v1/users/{userID}", handler.removeUserHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/users/{userID}/mark-all-as-read", handler.markUserAsReadHandler)
|
|
|
+ mux.HandleFunc("GET /v1/me", handler.currentUserHandler)
|
|
|
+ mux.HandleFunc("POST /v1/categories", handler.createCategoryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/categories", handler.getCategoriesHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/categories/{categoryID}", handler.updateCategoryHandler)
|
|
|
+ mux.HandleFunc("DELETE /v1/categories/{categoryID}", handler.removeCategoryHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/categories/{categoryID}/mark-all-as-read", handler.markCategoryAsReadHandler)
|
|
|
+ mux.HandleFunc("GET /v1/categories/{categoryID}/feeds", handler.getCategoryFeedsHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/categories/{categoryID}/refresh", handler.refreshCategoryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/categories/{categoryID}/entries", handler.getCategoryEntriesHandler)
|
|
|
+ mux.HandleFunc("GET /v1/categories/{categoryID}/entries/{entryID}", handler.getCategoryEntryHandler)
|
|
|
+ mux.HandleFunc("POST /v1/discover", handler.discoverSubscriptionsHandler)
|
|
|
+ mux.HandleFunc("POST /v1/feeds", handler.createFeedHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds", handler.getFeedsHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds/counters", handler.fetchCountersHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/feeds/refresh", handler.refreshAllFeedsHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/feeds/{feedID}/refresh", handler.refreshFeedHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds/{feedID}", handler.getFeedHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/feeds/{feedID}", handler.updateFeedHandler)
|
|
|
+ mux.HandleFunc("DELETE /v1/feeds/{feedID}", handler.removeFeedHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds/{feedID}/icon", handler.getIconByFeedIDHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/feeds/{feedID}/mark-all-as-read", handler.markFeedAsReadHandler)
|
|
|
+ mux.HandleFunc("GET /v1/export", handler.exportFeedsHandler)
|
|
|
+ mux.HandleFunc("POST /v1/import", handler.importFeedsHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds/{feedID}/entries", handler.getFeedEntriesHandler)
|
|
|
+ mux.HandleFunc("POST /v1/feeds/{feedID}/entries/import", handler.importFeedEntryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/feeds/{feedID}/entries/{entryID}", handler.getFeedEntryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/entries", handler.getEntriesHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/entries", handler.setEntryStatusHandler)
|
|
|
+ mux.HandleFunc("GET /v1/entries/{entryID}", handler.getEntryHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/entries/{entryID}", handler.updateEntryHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/entries/{entryID}/bookmark", handler.toggleStarredHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/entries/{entryID}/star", handler.toggleStarredHandler)
|
|
|
+ mux.HandleFunc("POST /v1/entries/{entryID}/save", handler.saveEntryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/entries/{entryID}/fetch-content", handler.fetchContentHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/flush-history", handler.flushHistoryHandler)
|
|
|
+ mux.HandleFunc("DELETE /v1/flush-history", handler.flushHistoryHandler)
|
|
|
+ mux.HandleFunc("GET /v1/icons/{iconID}", handler.getIconByIconIDHandler)
|
|
|
+ mux.HandleFunc("GET /v1/enclosures/{enclosureID}", handler.getEnclosureByIDHandler)
|
|
|
+ mux.HandleFunc("PUT /v1/enclosures/{enclosureID}", handler.updateEnclosureByIDHandler)
|
|
|
+ mux.HandleFunc("GET /v1/integrations/status", handler.getIntegrationsStatusHandler)
|
|
|
+ mux.HandleFunc("GET /v1/version", handler.versionHandler)
|
|
|
+ mux.HandleFunc("POST /v1/api-keys", handler.createAPIKeyHandler)
|
|
|
+ mux.HandleFunc("GET /v1/api-keys", handler.getAPIKeysHandler)
|
|
|
+ mux.HandleFunc("DELETE /v1/api-keys/{apiKeyID}", handler.deleteAPIKeyHandler)
|
|
|
+
|
|
|
+ return middleware.handleCORS(middleware.apiKeyAuth(middleware.basicAuth(mux)))
|
|
|
}
|