diff options
author | 2018-01-02 22:04:48 -0800 | |
---|---|---|
committer | 2018-01-02 22:04:48 -0800 | |
commit | 320d1b016747ba4501da9417d9ce5f99368a5768 (patch) | |
tree | 1054d96afde6022951b76cc4a09b78e1e3f05058 /server/api/controller | |
parent | c39f2e1a8d2de6d412bcc673d29eb0f7a2d1f5f7 (diff) | |
download | v2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.gz v2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.zst v2-320d1b016747ba4501da9417d9ce5f99368a5768.zip |
Refactor packages to have more idiomatic code base
Diffstat (limited to 'server/api/controller')
-rw-r--r-- | server/api/controller/category.go | 104 | ||||
-rw-r--r-- | server/api/controller/controller.go | 21 | ||||
-rw-r--r-- | server/api/controller/entry.go | 224 | ||||
-rw-r--r-- | server/api/controller/feed.go | 179 | ||||
-rw-r--r-- | server/api/controller/icon.go | 44 | ||||
-rw-r--r-- | server/api/controller/subscription.go | 36 | ||||
-rw-r--r-- | server/api/controller/user.go | 186 |
7 files changed, 0 insertions, 794 deletions
diff --git a/server/api/controller/category.go b/server/api/controller/category.go deleted file mode 100644 index d7b2922b..00000000 --- a/server/api/controller/category.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// CreateCategory is the API handler to create a new category. -func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - category, err := payload.DecodeCategoryPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - category.UserID = userID - if err := category.ValidateCategoryCreation(); err != nil { - response.JSON().BadRequest(err) - return - } - - if c, err := c.store.CategoryByTitle(userID, category.Title); err != nil || c != nil { - response.JSON().BadRequest(errors.New("This category already exists")) - return - } - - err = c.store.CreateCategory(category) - if err != nil { - response.JSON().ServerError(errors.New("Unable to create this category")) - return - } - - response.JSON().Created(category) -} - -// UpdateCategory is the API handler to update a category. -func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, response *core.Response) { - categoryID, err := request.IntegerParam("categoryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - category, err := payload.DecodeCategoryPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - category.UserID = ctx.UserID() - category.ID = categoryID - if err := category.ValidateCategoryModification(); err != nil { - response.JSON().BadRequest(err) - return - } - - err = c.store.UpdateCategory(category) - if err != nil { - response.JSON().ServerError(errors.New("Unable to update this category")) - return - } - - response.JSON().Created(category) -} - -// GetCategories is the API handler to get a list of categories for a given user. -func (c *Controller) GetCategories(ctx *core.Context, request *core.Request, response *core.Response) { - categories, err := c.store.Categories(ctx.UserID()) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch categories")) - return - } - - response.JSON().Standard(categories) -} - -// RemoveCategory is the API handler to remove a category. -func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - categoryID, err := request.IntegerParam("categoryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - if !c.store.CategoryExists(userID, categoryID) { - response.JSON().NotFound(errors.New("Category not found")) - return - } - - if err := c.store.RemoveCategory(userID, categoryID); err != nil { - response.JSON().ServerError(errors.New("Unable to remove this category")) - return - } - - response.JSON().NoContent() -} diff --git a/server/api/controller/controller.go b/server/api/controller/controller.go deleted file mode 100644 index c9798e3c..00000000 --- a/server/api/controller/controller.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "github.com/miniflux/miniflux/reader/feed" - "github.com/miniflux/miniflux/storage" -) - -// Controller holds all handlers for the API. -type Controller struct { - store *storage.Storage - feedHandler *feed.Handler -} - -// NewController creates a new controller. -func NewController(store *storage.Storage, feedHandler *feed.Handler) *Controller { - return &Controller{store: store, feedHandler: feedHandler} -} diff --git a/server/api/controller/entry.go b/server/api/controller/entry.go deleted file mode 100644 index 9c86a7a5..00000000 --- a/server/api/controller/entry.go +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - - "github.com/miniflux/miniflux/model" - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// GetFeedEntry is the API handler to get a single feed entry. -func (c *Controller) GetFeedEntry(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - entryID, err := request.IntegerParam("entryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - builder := c.store.NewEntryQueryBuilder(userID) - builder.WithFeedID(feedID) - builder.WithEntryID(entryID) - - entry, err := builder.GetEntry() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this entry from the database")) - return - } - - if entry == nil { - response.JSON().NotFound(errors.New("Entry not found")) - return - } - - response.JSON().Standard(entry) -} - -// GetEntry is the API handler to get a single entry. -func (c *Controller) GetEntry(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - entryID, err := request.IntegerParam("entryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - builder := c.store.NewEntryQueryBuilder(userID) - builder.WithEntryID(entryID) - - entry, err := builder.GetEntry() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this entry from the database")) - return - } - - if entry == nil { - response.JSON().NotFound(errors.New("Entry not found")) - return - } - - response.JSON().Standard(entry) -} - -// GetFeedEntries is the API handler to get all feed entries. -func (c *Controller) GetFeedEntries(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - status := request.QueryStringParam("status", "") - if status != "" { - if err := model.ValidateEntryStatus(status); err != nil { - response.JSON().BadRequest(err) - return - } - } - - order := request.QueryStringParam("order", model.DefaultSortingOrder) - if err := model.ValidateEntryOrder(order); err != nil { - response.JSON().BadRequest(err) - return - } - - direction := request.QueryStringParam("direction", model.DefaultSortingDirection) - if err := model.ValidateDirection(direction); err != nil { - response.JSON().BadRequest(err) - return - } - - limit := request.QueryIntegerParam("limit", 100) - offset := request.QueryIntegerParam("offset", 0) - if err := model.ValidateRange(offset, limit); err != nil { - response.JSON().BadRequest(err) - return - } - - builder := c.store.NewEntryQueryBuilder(userID) - builder.WithFeedID(feedID) - builder.WithStatus(status) - builder.WithOrder(order) - builder.WithDirection(direction) - builder.WithOffset(offset) - builder.WithLimit(limit) - - entries, err := builder.GetEntries() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch the list of entries")) - return - } - - count, err := builder.CountEntries() - if err != nil { - response.JSON().ServerError(errors.New("Unable to count the number of entries")) - return - } - - response.JSON().Standard(&payload.EntriesResponse{Total: count, Entries: entries}) -} - -// GetEntries is the API handler to fetch entries. -func (c *Controller) GetEntries(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - - status := request.QueryStringParam("status", "") - if status != "" { - if err := model.ValidateEntryStatus(status); err != nil { - response.JSON().BadRequest(err) - return - } - } - - order := request.QueryStringParam("order", model.DefaultSortingOrder) - if err := model.ValidateEntryOrder(order); err != nil { - response.JSON().BadRequest(err) - return - } - - direction := request.QueryStringParam("direction", model.DefaultSortingDirection) - if err := model.ValidateDirection(direction); err != nil { - response.JSON().BadRequest(err) - return - } - - limit := request.QueryIntegerParam("limit", 100) - offset := request.QueryIntegerParam("offset", 0) - if err := model.ValidateRange(offset, limit); err != nil { - response.JSON().BadRequest(err) - return - } - - builder := c.store.NewEntryQueryBuilder(userID) - builder.WithStatus(status) - builder.WithOrder(order) - builder.WithDirection(direction) - builder.WithOffset(offset) - builder.WithLimit(limit) - - entries, err := builder.GetEntries() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch the list of entries")) - return - } - - count, err := builder.CountEntries() - if err != nil { - response.JSON().ServerError(errors.New("Unable to count the number of entries")) - return - } - - response.JSON().Standard(&payload.EntriesResponse{Total: count, Entries: entries}) -} - -// SetEntryStatus is the API handler to change the status of entries. -func (c *Controller) SetEntryStatus(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - - entryIDs, status, err := payload.DecodeEntryStatusPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(errors.New("Invalid JSON payload")) - return - } - - if err := model.ValidateEntryStatus(status); err != nil { - response.JSON().BadRequest(err) - return - } - - if err := c.store.SetEntriesStatus(userID, entryIDs, status); err != nil { - response.JSON().ServerError(errors.New("Unable to change entries status")) - return - } - - response.JSON().NoContent() -} - -// ToggleBookmark is the API handler to toggle bookmark status. -func (c *Controller) ToggleBookmark(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - entryID, err := request.IntegerParam("entryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - if err := c.store.ToggleBookmark(userID, entryID); err != nil { - response.JSON().ServerError(errors.New("Unable to toggle bookmark value")) - return - } - - response.JSON().NoContent() -} diff --git a/server/api/controller/feed.go b/server/api/controller/feed.go deleted file mode 100644 index fcaeee78..00000000 --- a/server/api/controller/feed.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// CreateFeed is the API handler to create a new feed. -func (c *Controller) CreateFeed(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedURL, categoryID, err := payload.DecodeFeedCreationPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - if feedURL == "" { - response.JSON().BadRequest(errors.New("The feed_url is required")) - return - } - - if categoryID <= 0 { - response.JSON().BadRequest(errors.New("The category_id is required")) - return - } - - if c.store.FeedURLExists(userID, feedURL) { - response.JSON().BadRequest(errors.New("This feed_url already exists")) - return - } - - if !c.store.CategoryExists(userID, categoryID) { - response.JSON().BadRequest(errors.New("This category_id doesn't exists or doesn't belongs to this user")) - return - } - - feed, err := c.feedHandler.CreateFeed(userID, categoryID, feedURL, false) - if err != nil { - response.JSON().ServerError(errors.New("Unable to create this feed")) - return - } - - type result struct { - FeedID int64 `json:"feed_id"` - } - - response.JSON().Created(&result{FeedID: feed.ID}) -} - -// RefreshFeed is the API handler to refresh a feed. -func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - if !c.store.FeedExists(userID, feedID) { - response.JSON().NotFound(errors.New("Unable to find this feed")) - return - } - - err = c.feedHandler.RefreshFeed(userID, feedID) - if err != nil { - response.JSON().ServerError(errors.New("Unable to refresh this feed")) - return - } - - response.JSON().NoContent() -} - -// UpdateFeed is the API handler that is used to update a feed. -func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - newFeed, err := payload.DecodeFeedModificationPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - if newFeed.Category != nil && newFeed.Category.ID != 0 && !c.store.CategoryExists(userID, newFeed.Category.ID) { - response.JSON().BadRequest(errors.New("This category_id doesn't exists or doesn't belongs to this user")) - return - } - - originalFeed, err := c.store.FeedByID(userID, feedID) - if err != nil { - response.JSON().NotFound(errors.New("Unable to find this feed")) - return - } - - if originalFeed == nil { - response.JSON().NotFound(errors.New("Feed not found")) - return - } - - originalFeed.Merge(newFeed) - if err := c.store.UpdateFeed(originalFeed); err != nil { - response.JSON().ServerError(errors.New("Unable to update this feed")) - return - } - - originalFeed, err = c.store.FeedByID(userID, feedID) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this feed")) - return - } - - response.JSON().Created(originalFeed) -} - -// GetFeeds is the API handler that get all feeds that belongs to the given user. -func (c *Controller) GetFeeds(ctx *core.Context, request *core.Request, response *core.Response) { - feeds, err := c.store.Feeds(ctx.UserID()) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch feeds from the database")) - return - } - - response.JSON().Standard(feeds) -} - -// GetFeed is the API handler to get a feed. -func (c *Controller) GetFeed(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - feed, err := c.store.FeedByID(userID, feedID) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this feed")) - return - } - - if feed == nil { - response.JSON().NotFound(errors.New("Feed not found")) - return - } - - response.JSON().Standard(feed) -} - -// RemoveFeed is the API handler to remove a feed. -func (c *Controller) RemoveFeed(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - if !c.store.FeedExists(userID, feedID) { - response.JSON().NotFound(errors.New("Feed not found")) - return - } - - if err := c.store.RemoveFeed(userID, feedID); err != nil { - response.JSON().ServerError(errors.New("Unable to remove this feed")) - return - } - - response.JSON().NoContent() -} diff --git a/server/api/controller/icon.go b/server/api/controller/icon.go deleted file mode 100644 index b8e7a61e..00000000 --- a/server/api/controller/icon.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// FeedIcon returns a feed icon. -func (c *Controller) FeedIcon(ctx *core.Context, request *core.Request, response *core.Response) { - userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - if !c.store.HasIcon(feedID) { - response.JSON().NotFound(errors.New("This feed doesn't have any icon")) - return - } - - icon, err := c.store.IconByFeedID(userID, feedID) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch feed icon")) - return - } - - if icon == nil { - response.JSON().NotFound(errors.New("This feed doesn't have any icon")) - return - } - - response.JSON().Standard(&payload.FeedIcon{ - ID: icon.ID, - MimeType: icon.MimeType, - Data: icon.DataURL(), - }) -} diff --git a/server/api/controller/subscription.go b/server/api/controller/subscription.go deleted file mode 100644 index aa2a26f9..00000000 --- a/server/api/controller/subscription.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - "fmt" - - "github.com/miniflux/miniflux/reader/subscription" - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// GetSubscriptions is the API handler to find subscriptions. -func (c *Controller) GetSubscriptions(ctx *core.Context, request *core.Request, response *core.Response) { - websiteURL, err := payload.DecodeURLPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - subscriptions, err := subscription.FindSubscriptions(websiteURL) - if err != nil { - response.JSON().ServerError(errors.New("Unable to discover subscriptions")) - return - } - - if subscriptions == nil { - response.JSON().NotFound(fmt.Errorf("No subscription found")) - return - } - - response.JSON().Standard(subscriptions) -} diff --git a/server/api/controller/user.go b/server/api/controller/user.go deleted file mode 100644 index a9259081..00000000 --- a/server/api/controller/user.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 Frédéric Guillot. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package api - -import ( - "errors" - - "github.com/miniflux/miniflux/server/api/payload" - "github.com/miniflux/miniflux/server/core" -) - -// CreateUser is the API handler to create a new user. -func (c *Controller) CreateUser(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - user, err := payload.DecodeUserPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - if err := user.ValidateUserCreation(); err != nil { - response.JSON().BadRequest(err) - return - } - - if c.store.UserExists(user.Username) { - response.JSON().BadRequest(errors.New("This user already exists")) - return - } - - err = c.store.CreateUser(user) - if err != nil { - response.JSON().ServerError(errors.New("Unable to create this user")) - return - } - - user.Password = "" - response.JSON().Created(user) -} - -// UpdateUser is the API handler to update the given user. -func (c *Controller) UpdateUser(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - userID, err := request.IntegerParam("userID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - user, err := payload.DecodeUserPayload(request.Body()) - if err != nil { - response.JSON().BadRequest(err) - return - } - - if err := user.ValidateUserModification(); err != nil { - response.JSON().BadRequest(err) - return - } - - originalUser, err := c.store.UserByID(userID) - if err != nil { - response.JSON().BadRequest(errors.New("Unable to fetch this user from the database")) - return - } - - if originalUser == nil { - response.JSON().NotFound(errors.New("User not found")) - return - } - - originalUser.Merge(user) - if err = c.store.UpdateUser(originalUser); err != nil { - response.JSON().ServerError(errors.New("Unable to update this user")) - return - } - - response.JSON().Created(originalUser) -} - -// Users is the API handler to get the list of users. -func (c *Controller) Users(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - users, err := c.store.Users() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch the list of users")) - return - } - - response.JSON().Standard(users) -} - -// UserByID is the API handler to fetch the given user by the ID. -func (c *Controller) UserByID(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - userID, err := request.IntegerParam("userID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - user, err := c.store.UserByID(userID) - if err != nil { - response.JSON().BadRequest(errors.New("Unable to fetch this user from the database")) - return - } - - if user == nil { - response.JSON().NotFound(errors.New("User not found")) - return - } - - response.JSON().Standard(user) -} - -// UserByUsername is the API handler to fetch the given user by the username. -func (c *Controller) UserByUsername(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - username := request.StringParam("username", "") - user, err := c.store.UserByUsername(username) - if err != nil { - response.JSON().BadRequest(errors.New("Unable to fetch this user from the database")) - return - } - - if user == nil { - response.JSON().NotFound(errors.New("User not found")) - return - } - - response.JSON().Standard(user) -} - -// RemoveUser is the API handler to remove an existing user. -func (c *Controller) RemoveUser(ctx *core.Context, request *core.Request, response *core.Response) { - if !ctx.IsAdminUser() { - response.JSON().Forbidden() - return - } - - userID, err := request.IntegerParam("userID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - user, err := c.store.UserByID(userID) - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this user from the database")) - return - } - - if user == nil { - response.JSON().NotFound(errors.New("User not found")) - return - } - - if err := c.store.RemoveUser(user.ID); err != nil { - response.JSON().BadRequest(errors.New("Unable to remove this user from the database")) - return - } - - response.JSON().NoContent() -} |