Refactor packages to have more idiomatic code base

This commit is contained in:
Frédéric Guillot 2018-01-02 22:04:48 -08:00
parent c39f2e1a8d
commit 320d1b0167
109 changed files with 449 additions and 402 deletions

View File

@ -7,14 +7,13 @@ package api
import (
"errors"
"github.com/miniflux/miniflux/server/api/payload"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
)
// CreateCategory is the API handler to create a new category.
func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) CreateCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
category, err := payload.DecodeCategoryPayload(request.Body())
category, err := decodeCategoryPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -41,14 +40,14 @@ func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, re
}
// UpdateCategory is the API handler to update a category.
func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
categoryID, err := request.IntegerParam("categoryID")
if err != nil {
response.JSON().BadRequest(err)
return
}
category, err := payload.DecodeCategoryPayload(request.Body())
category, err := decodeCategoryPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -71,7 +70,7 @@ func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, re
}
// 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) {
func (c *Controller) GetCategories(ctx *handler.Context, request *handler.Request, response *handler.Response) {
categories, err := c.store.Categories(ctx.UserID())
if err != nil {
response.JSON().ServerError(errors.New("Unable to fetch categories"))
@ -82,7 +81,7 @@ func (c *Controller) GetCategories(ctx *core.Context, request *core.Request, res
}
// RemoveCategory is the API handler to remove a category.
func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
categoryID, err := request.IntegerParam("categoryID")
if err != nil {

View File

@ -7,13 +7,12 @@ package api
import (
"errors"
"github.com/miniflux/miniflux/http/handler"
"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) {
func (c *Controller) GetFeedEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -46,7 +45,7 @@ func (c *Controller) GetFeedEntry(ctx *core.Context, request *core.Request, resp
}
// GetEntry is the API handler to get a single entry.
func (c *Controller) GetEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) GetEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
entryID, err := request.IntegerParam("entryID")
if err != nil {
@ -72,7 +71,7 @@ func (c *Controller) GetEntry(ctx *core.Context, request *core.Request, response
}
// GetFeedEntries is the API handler to get all feed entries.
func (c *Controller) GetFeedEntries(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) GetFeedEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -127,11 +126,11 @@ func (c *Controller) GetFeedEntries(ctx *core.Context, request *core.Request, re
return
}
response.JSON().Standard(&payload.EntriesResponse{Total: count, Entries: entries})
response.JSON().Standard(&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) {
func (c *Controller) GetEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
status := request.QueryStringParam("status", "")
@ -180,14 +179,14 @@ func (c *Controller) GetEntries(ctx *core.Context, request *core.Request, respon
return
}
response.JSON().Standard(&payload.EntriesResponse{Total: count, Entries: entries})
response.JSON().Standard(&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) {
func (c *Controller) SetEntryStatus(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
entryIDs, status, err := payload.DecodeEntryStatusPayload(request.Body())
entryIDs, status, err := decodeEntryStatusPayload(request.Body())
if err != nil {
response.JSON().BadRequest(errors.New("Invalid JSON payload"))
return
@ -207,7 +206,7 @@ func (c *Controller) SetEntryStatus(ctx *core.Context, request *core.Request, re
}
// ToggleBookmark is the API handler to toggle bookmark status.
func (c *Controller) ToggleBookmark(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ToggleBookmark(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
entryID, err := request.IntegerParam("entryID")
if err != nil {

View File

@ -7,14 +7,13 @@ package api
import (
"errors"
"github.com/miniflux/miniflux/server/api/payload"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
)
// CreateFeed is the API handler to create a new feed.
func (c *Controller) CreateFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) CreateFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedURL, categoryID, err := payload.DecodeFeedCreationPayload(request.Body())
feedURL, categoryID, err := decodeFeedCreationPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -54,7 +53,7 @@ func (c *Controller) CreateFeed(ctx *core.Context, request *core.Request, respon
}
// RefreshFeed is the API handler to refresh a feed.
func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RefreshFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -77,7 +76,7 @@ func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, respo
}
// 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) {
func (c *Controller) UpdateFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -85,7 +84,7 @@ func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, respon
return
}
newFeed, err := payload.DecodeFeedModificationPayload(request.Body())
newFeed, err := decodeFeedModificationPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -123,7 +122,7 @@ func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, respon
}
// 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) {
func (c *Controller) GetFeeds(ctx *handler.Context, request *handler.Request, response *handler.Response) {
feeds, err := c.store.Feeds(ctx.UserID())
if err != nil {
response.JSON().ServerError(errors.New("Unable to fetch feeds from the database"))
@ -134,7 +133,7 @@ func (c *Controller) GetFeeds(ctx *core.Context, request *core.Request, response
}
// GetFeed is the API handler to get a feed.
func (c *Controller) GetFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) GetFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -157,7 +156,7 @@ func (c *Controller) GetFeed(ctx *core.Context, request *core.Request, response
}
// RemoveFeed is the API handler to remove a feed.
func (c *Controller) RemoveFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {

View File

@ -7,12 +7,11 @@ package api
import (
"errors"
"github.com/miniflux/miniflux/server/api/payload"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
)
// FeedIcon returns a feed icon.
func (c *Controller) FeedIcon(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) FeedIcon(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
feedID, err := request.IntegerParam("feedID")
if err != nil {
@ -36,7 +35,7 @@ func (c *Controller) FeedIcon(ctx *core.Context, request *core.Request, response
return
}
response.JSON().Standard(&payload.FeedIcon{
response.JSON().Standard(&feedIcon{
ID: icon.ID,
MimeType: icon.MimeType,
Data: icon.DataURL(),

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package payload
package api
import (
"encoding/json"
@ -12,21 +12,18 @@ import (
"github.com/miniflux/miniflux/model"
)
// FeedIcon represents the feed icon response.
type FeedIcon struct {
type feedIcon struct {
ID int64 `json:"id"`
MimeType string `json:"mime_type"`
Data string `json:"data"`
}
// EntriesResponse represents the response sent when fetching entries.
type EntriesResponse struct {
type entriesResponse struct {
Total int `json:"total"`
Entries model.Entries `json:"entries"`
}
// DecodeUserPayload unserialize JSON user object.
func DecodeUserPayload(data io.Reader) (*model.User, error) {
func decodeUserPayload(data io.Reader) (*model.User, error) {
var user model.User
decoder := json.NewDecoder(data)
@ -37,8 +34,7 @@ func DecodeUserPayload(data io.Reader) (*model.User, error) {
return &user, nil
}
// DecodeURLPayload unserialize JSON subscription object.
func DecodeURLPayload(data io.Reader) (string, error) {
func decodeURLPayload(data io.Reader) (string, error) {
type payload struct {
URL string `json:"url"`
}
@ -52,8 +48,7 @@ func DecodeURLPayload(data io.Reader) (string, error) {
return p.URL, nil
}
// DecodeEntryStatusPayload unserialize JSON entry statuses object.
func DecodeEntryStatusPayload(data io.Reader) ([]int64, string, error) {
func decodeEntryStatusPayload(data io.Reader) ([]int64, string, error) {
type payload struct {
EntryIDs []int64 `json:"entry_ids"`
Status string `json:"status"`
@ -68,8 +63,7 @@ func DecodeEntryStatusPayload(data io.Reader) ([]int64, string, error) {
return p.EntryIDs, p.Status, nil
}
// DecodeFeedCreationPayload unserialize JSON feed creation object.
func DecodeFeedCreationPayload(data io.Reader) (string, int64, error) {
func decodeFeedCreationPayload(data io.Reader) (string, int64, error) {
type payload struct {
FeedURL string `json:"feed_url"`
CategoryID int64 `json:"category_id"`
@ -84,8 +78,7 @@ func DecodeFeedCreationPayload(data io.Reader) (string, int64, error) {
return p.FeedURL, p.CategoryID, nil
}
// DecodeFeedModificationPayload unserialize JSON feed object.
func DecodeFeedModificationPayload(data io.Reader) (*model.Feed, error) {
func decodeFeedModificationPayload(data io.Reader) (*model.Feed, error) {
var feed model.Feed
decoder := json.NewDecoder(data)
@ -96,8 +89,7 @@ func DecodeFeedModificationPayload(data io.Reader) (*model.Feed, error) {
return &feed, nil
}
// DecodeCategoryPayload unserialize JSON category object.
func DecodeCategoryPayload(data io.Reader) (*model.Category, error) {
func decodeCategoryPayload(data io.Reader) (*model.Category, error) {
var category model.Category
decoder := json.NewDecoder(data)

View File

@ -8,14 +8,13 @@ import (
"errors"
"fmt"
"github.com/miniflux/miniflux/http/handler"
"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())
func (c *Controller) GetSubscriptions(ctx *handler.Context, request *handler.Request, response *handler.Response) {
websiteURL, err := decodeURLPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return

View File

@ -7,18 +7,17 @@ package api
import (
"errors"
"github.com/miniflux/miniflux/server/api/payload"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
)
// CreateUser is the API handler to create a new user.
func (c *Controller) CreateUser(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) CreateUser(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return
}
user, err := payload.DecodeUserPayload(request.Body())
user, err := decodeUserPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -45,7 +44,7 @@ func (c *Controller) CreateUser(ctx *core.Context, request *core.Request, respon
}
// UpdateUser is the API handler to update the given user.
func (c *Controller) UpdateUser(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateUser(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return
@ -57,7 +56,7 @@ func (c *Controller) UpdateUser(ctx *core.Context, request *core.Request, respon
return
}
user, err := payload.DecodeUserPayload(request.Body())
user, err := decodeUserPayload(request.Body())
if err != nil {
response.JSON().BadRequest(err)
return
@ -89,7 +88,7 @@ func (c *Controller) UpdateUser(ctx *core.Context, request *core.Request, respon
}
// Users is the API handler to get the list of users.
func (c *Controller) Users(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Users(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return
@ -105,7 +104,7 @@ func (c *Controller) Users(ctx *core.Context, request *core.Request, response *c
}
// 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) {
func (c *Controller) UserByID(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return
@ -132,7 +131,7 @@ func (c *Controller) UserByID(ctx *core.Context, request *core.Request, response
}
// 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) {
func (c *Controller) UserByUsername(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return
@ -154,7 +153,7 @@ func (c *Controller) UserByUsername(ctx *core.Context, request *core.Request, re
}
// RemoveUser is the API handler to remove an existing user.
func (c *Controller) RemoveUser(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveUser(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if !ctx.IsAdminUser() {
response.JSON().Forbidden()
return

58
cli/cli.go Normal file
View File

@ -0,0 +1,58 @@
// Copyright 2018 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 cli
import (
"flag"
"fmt"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/daemon"
"github.com/miniflux/miniflux/storage"
"github.com/miniflux/miniflux/version"
)
// Parse parses command line arguments.
func Parse() {
flagInfo := flag.Bool("info", false, "Show application information")
flagVersion := flag.Bool("version", false, "Show application version")
flagMigrate := flag.Bool("migrate", false, "Migrate database schema")
flagFlushSessions := flag.Bool("flush-sessions", false, "Flush all sessions (disconnect users)")
flagCreateAdmin := flag.Bool("create-admin", false, "Create admin user")
flag.Parse()
cfg := config.NewConfig()
store := storage.NewStorage(
cfg.Get("DATABASE_URL", config.DefaultDatabaseURL),
cfg.GetInt("DATABASE_MAX_CONNS", config.DefaultDatabaseMaxConns),
)
if *flagInfo {
info()
return
}
if *flagVersion {
fmt.Println(version.Version)
return
}
if *flagMigrate {
store.Migrate()
return
}
if *flagFlushSessions {
flushSessions(store)
return
}
if *flagCreateAdmin {
createAdmin(store)
return
}
daemon.Run(cfg, store)
}

52
cli/create_admin.go Normal file
View File

@ -0,0 +1,52 @@
// Copyright 2018 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 cli
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/storage"
"golang.org/x/crypto/ssh/terminal"
)
func askCredentials() (string, string) {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter Username: ")
username, _ := reader.ReadString('\n')
fmt.Print("Enter Password: ")
bytePassword, _ := terminal.ReadPassword(0)
fmt.Printf("\n")
return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword))
}
func createAdmin(store *storage.Storage) {
user := &model.User{
Username: os.Getenv("ADMIN_USERNAME"),
Password: os.Getenv("ADMIN_PASSWORD"),
IsAdmin: true,
}
if user.Username == "" || user.Password == "" {
user.Username, user.Password = askCredentials()
}
if err := user.ValidateUserCreation(); err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := store.CreateUser(user); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

20
cli/flush_sessions.go Normal file
View File

@ -0,0 +1,20 @@
// Copyright 2018 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 cli
import (
"fmt"
"os"
"github.com/miniflux/miniflux/storage"
)
func flushSessions(store *storage.Storage) {
fmt.Println("Flushing all sessions (disconnect users)")
if err := store.FlushAllSessions(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

18
cli/info.go Normal file
View File

@ -0,0 +1,18 @@
// Copyright 2018 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 cli
import (
"fmt"
"runtime"
"github.com/miniflux/miniflux/version"
)
func info() {
fmt.Println("Version:", version.Version)
fmt.Println("Build Date:", version.BuildDate)
fmt.Println("Go Version:", runtime.Version())
}

46
daemon/daemon.go Normal file
View File

@ -0,0 +1,46 @@
// Copyright 2018 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 daemon
import (
"context"
"os"
"os/signal"
"time"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/reader/feed"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/storage"
)
// Run starts the daemon.
func Run(cfg *config.Config, store *storage.Storage) {
logger.Info("Starting Miniflux...")
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
feedHandler := feed.NewFeedHandler(store)
pool := scheduler.NewWorkerPool(feedHandler, cfg.GetInt("WORKER_POOL_SIZE", config.DefaultWorkerPoolSize))
server := newServer(cfg, store, pool, feedHandler)
scheduler.NewFeedScheduler(
store,
pool,
cfg.GetInt("POLLING_FREQUENCY", config.DefaultPollingFrequency),
cfg.GetInt("BATCH_SIZE", config.DefaultBatchSize),
)
scheduler.NewSessionScheduler(store, config.DefaultSessionCleanupFrequency)
<-stop
logger.Info("Shutting down the server...")
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
server.Shutdown(ctx)
store.Close()
logger.Info("Server gracefully stopped")
}

View File

@ -1,47 +1,46 @@
// Copyright 2017 Frédéric Guillot. All rights reserved.
// Copyright 2018 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 server
package daemon
import (
"net/http"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/api"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/fever"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/http/middleware"
"github.com/miniflux/miniflux/locale"
"github.com/miniflux/miniflux/reader/feed"
"github.com/miniflux/miniflux/reader/opml"
api_controller "github.com/miniflux/miniflux/server/api/controller"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/fever"
"github.com/miniflux/miniflux/server/middleware"
"github.com/miniflux/miniflux/server/template"
ui_controller "github.com/miniflux/miniflux/server/ui/controller"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/storage"
"github.com/miniflux/miniflux/template"
"github.com/miniflux/miniflux/ui"
"github.com/gorilla/mux"
)
func getRoutes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handler, pool *scheduler.WorkerPool) *mux.Router {
func routes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handler, pool *scheduler.WorkerPool) *mux.Router {
router := mux.NewRouter()
translator := locale.Load()
templateEngine := template.NewEngine(cfg, router, translator)
apiController := api_controller.NewController(store, feedHandler)
apiController := api.NewController(store, feedHandler)
feverController := fever.NewController(store)
uiController := ui_controller.NewController(cfg, store, pool, feedHandler, opml.NewHandler(store))
uiController := ui.NewController(cfg, store, pool, feedHandler, opml.NewHandler(store))
apiHandler := core.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
apiHandler := handler.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
middleware.NewBasicAuthMiddleware(store).Handler,
))
feverHandler := core.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
feverHandler := handler.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
middleware.NewFeverMiddleware(store).Handler,
))
uiHandler := core.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
uiHandler := handler.NewHandler(cfg, store, router, templateEngine, translator, middleware.NewChain(
middleware.NewUserSessionMiddleware(store, router).Handler,
middleware.NewSessionMiddleware(cfg, store).Handler,
))

View File

@ -1,30 +1,24 @@
// Copyright 2017 Frédéric Guillot. All rights reserved.
// Copyright 2018 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 server
package daemon
import (
"crypto/tls"
"net/http"
"time"
"github.com/gorilla/mux"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/scheduler"
"golang.org/x/crypto/acme/autocert"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/reader/feed"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/storage"
"golang.org/x/crypto/acme/autocert"
)
// NewServer returns a new HTTP server.
func NewServer(cfg *config.Config, store *storage.Storage, pool *scheduler.WorkerPool, feedHandler *feed.Handler) *http.Server {
return startServer(cfg, getRoutes(cfg, store, feedHandler, pool))
}
func startServer(cfg *config.Config, handler *mux.Router) *http.Server {
func newServer(cfg *config.Config, store *storage.Storage, pool *scheduler.WorkerPool, feedHandler *feed.Handler) *http.Server {
certFile := cfg.Get("CERT_FILE", config.DefaultCertFile)
keyFile := cfg.Get("KEY_FILE", config.DefaultKeyFile)
certDomain := cfg.Get("CERT_DOMAIN", config.DefaultCertDomain)
@ -34,7 +28,7 @@ func startServer(cfg *config.Config, handler *mux.Router) *http.Server {
WriteTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
Addr: cfg.Get("LISTEN_ADDR", config.DefaultListenAddr),
Handler: handler,
Handler: routes(cfg, store, feedHandler, pool),
}
if certDomain != "" && certCache != "" {

View File

@ -9,10 +9,10 @@ import (
"strings"
"time"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/integration"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/storage"
)
@ -129,7 +129,7 @@ type Controller struct {
}
// Handler handles Fever API calls
func (c *Controller) Handler(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Handler(ctx *handler.Context, request *handler.Request, response *handler.Response) {
switch {
case request.HasQueryParam("groups"):
c.handleGroups(ctx, request, response)
@ -174,7 +174,7 @@ The “Sparks” super group is not included in this response and is composed of
is_spark equal to 1.
*/
func (c *Controller) handleGroups(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleGroups(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Fetching groups for userID=%d", userID)
@ -224,7 +224,7 @@ should be limited to feeds with an is_spark equal to 0.
For the Sparks super group the items should be limited to feeds with an is_spark equal to 1.
*/
func (c *Controller) handleFeeds(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleFeeds(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Fetching feeds for userID=%d", userID)
@ -277,7 +277,7 @@ A PHP/HTML example:
echo '<img src="data:'.$favicon['data'].'">';
*/
func (c *Controller) handleFavicons(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleFavicons(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Fetching favicons for userID=%d", userID)
@ -330,7 +330,7 @@ Three optional arguments control determine the items included in the response.
(added in API version 2)
*/
func (c *Controller) handleItems(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleItems(ctx *handler.Context, request *handler.Request, response *handler.Response) {
var result itemsResponse
userID := ctx.UserID()
@ -414,7 +414,7 @@ with the remote Fever installation.
A request with the unread_item_ids argument will return one additional member:
unread_item_ids (string/comma-separated list of positive integers)
*/
func (c *Controller) handleUnreadItems(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleUnreadItems(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Fetching unread items for userID=%d", userID)
@ -445,7 +445,7 @@ with the remote Fever installation.
saved_item_ids (string/comma-separated list of positive integers)
*/
func (c *Controller) handleSavedItems(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleSavedItems(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Fetching saved items for userID=%d", userID)
@ -473,7 +473,7 @@ func (c *Controller) handleSavedItems(ctx *core.Context, request *core.Request,
as=? where ? is replaced with read, saved or unsaved
id=? where ? is replaced with the id of the item to modify
*/
func (c *Controller) handleWriteItems(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleWriteItems(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Receiving mark=item call for userID=%d", userID)
@ -527,7 +527,7 @@ func (c *Controller) handleWriteItems(ctx *core.Context, request *core.Request,
id=? where ? is replaced with the id of the feed or group to modify
before=? where ? is replaced with the Unix timestamp of the the local clients most recent items API request
*/
func (c *Controller) handleWriteFeeds(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleWriteFeeds(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Receiving mark=feed call for userID=%d", userID)
@ -567,7 +567,7 @@ func (c *Controller) handleWriteFeeds(ctx *core.Context, request *core.Request,
id=? where ? is replaced with the id of the feed or group to modify
before=? where ? is replaced with the Unix timestamp of the the local clients most recent items API request
*/
func (c *Controller) handleWriteGroups(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) handleWriteGroups(ctx *handler.Context, request *handler.Request, response *handler.Response) {
userID := ctx.UserID()
logger.Debug("[Fever] Receiving mark=group call for userID=%d", userID)

View File

@ -8,7 +8,7 @@ import (
"encoding/base64"
"strings"
"github.com/miniflux/miniflux/server/route"
"github.com/miniflux/miniflux/http/route"
"github.com/miniflux/miniflux/url"
"github.com/PuerkitoBio/goquery"

View File

@ -111,10 +111,10 @@ func generateFile(serializer, pkg, mapName, pattern, output string) {
func main() {
generateFile("none", "sql", "SqlMap", "sql/*.sql", "sql/sql.go")
generateFile("base64", "static", "Binaries", "server/static/bin/*", "server/static/bin.go")
generateFile("css", "static", "Stylesheets", "server/static/css/*.css", "server/static/css.go")
generateFile("js", "static", "Javascript", "server/static/js/*.js", "server/static/js.go")
generateFile("none", "template", "templateViewsMap", "server/template/html/*.html", "server/template/views.go")
generateFile("none", "template", "templateCommonMap", "server/template/html/common/*.html", "server/template/common.go")
generateFile("base64", "static", "Binaries", "ui/static/bin/*", "ui/static/bin.go")
generateFile("css", "static", "Stylesheets", "ui/static/css/*.css", "ui/static/css.go")
generateFile("js", "static", "Javascript", "ui/static/js/*.js", "ui/static/js.go")
generateFile("none", "template", "templateViewsMap", "template/html/*.html", "template/views.go")
generateFile("none", "template", "templateCommonMap", "template/html/common/*.html", "template/common.go")
generateFile("none", "locale", "translations", "locale/translations/*.json", "locale/translations.go")
}

View File

@ -2,17 +2,17 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"net/http"
"github.com/miniflux/miniflux/crypto"
"github.com/miniflux/miniflux/http/middleware"
"github.com/miniflux/miniflux/http/route"
"github.com/miniflux/miniflux/locale"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/middleware"
"github.com/miniflux/miniflux/server/route"
"github.com/miniflux/miniflux/storage"
"github.com/gorilla/mux"
@ -155,6 +155,6 @@ func (c *Context) Route(name string, args ...interface{}) string {
}
// NewContext creates a new Context.
func NewContext(w http.ResponseWriter, r *http.Request, store *storage.Storage, router *mux.Router, translator *locale.Translator) *Context {
return &Context{writer: w, request: r, store: store, router: router, translator: translator}
func NewContext(r *http.Request, store *storage.Storage, router *mux.Router, translator *locale.Translator) *Context {
return &Context{request: r, store: store, router: router, translator: translator}
}

View File

@ -2,26 +2,26 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"net/http"
"time"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/http/middleware"
"github.com/miniflux/miniflux/locale"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/middleware"
"github.com/miniflux/miniflux/server/template"
"github.com/miniflux/miniflux/storage"
"github.com/miniflux/miniflux/template"
"github.com/miniflux/miniflux/timer"
"github.com/gorilla/mux"
"github.com/tomasen/realip"
)
// HandlerFunc is an application HTTP handler.
type HandlerFunc func(ctx *Context, request *Request, response *Response)
// ControllerFunc is an application HTTP handler.
type ControllerFunc func(ctx *Context, request *Request, response *Response)
// Handler manages HTTP handlers and middlewares.
type Handler struct {
@ -34,7 +34,7 @@ type Handler struct {
}
// Use is a wrapper around an HTTP handler.
func (h *Handler) Use(f HandlerFunc) http.Handler {
func (h *Handler) Use(f ControllerFunc) http.Handler {
return h.middleware.WrapFunc(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer timer.ExecutionTime(time.Now(), r.URL.Path)
logger.Debug("[HTTP] %s %s %s", realip.RealIP(r), r.Method, r.URL.Path)
@ -43,8 +43,8 @@ func (h *Handler) Use(f HandlerFunc) http.Handler {
h.cfg.IsHTTPS = true
}
ctx := NewContext(w, r, h.store, h.router, h.translator)
request := NewRequest(w, r)
ctx := NewContext(r, h.store, h.router, h.translator)
request := NewRequest(r)
response := NewResponse(w, r, h.template)
if ctx.IsAuthenticated() {

View File

@ -2,13 +2,13 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"net/http"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/template"
"github.com/miniflux/miniflux/template"
)
// HTMLResponse handles HTML responses.

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"encoding/json"

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"fmt"
@ -17,7 +17,6 @@ import (
// Request is a thin wrapper around "http.Request".
type Request struct {
writer http.ResponseWriter
request *http.Request
}
@ -119,7 +118,7 @@ func (r *Request) HasQueryParam(param string) bool {
return ok
}
// NewRequest returns a new Request struct.
func NewRequest(w http.ResponseWriter, r *http.Request) *Request {
return &Request{writer: w, request: r}
// NewRequest returns a new Request.
func NewRequest(r *http.Request) *Request {
return &Request{r}
}

View File

@ -2,13 +2,13 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"net/http"
"time"
"github.com/miniflux/miniflux/server/template"
"github.com/miniflux/miniflux/template"
)
// Response handles HTTP responses.

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package core
package handler
import (
"fmt"

View File

@ -9,9 +9,9 @@ import (
"net/http"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/http/cookie"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/cookie"
"github.com/miniflux/miniflux/storage"
)

View File

@ -8,10 +8,10 @@ import (
"context"
"net/http"
"github.com/miniflux/miniflux/http/cookie"
"github.com/miniflux/miniflux/http/route"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/cookie"
"github.com/miniflux/miniflux/server/route"
"github.com/miniflux/miniflux/storage"
"github.com/gorilla/mux"

View File

@ -1,5 +1,5 @@
// Code generated by go generate; DO NOT EDIT.
// 2017-12-31 18:38:42.071995118 -0800 PST m=+0.052826276
// 2018-01-02 21:59:10.103098936 -0800 PST m=+0.030474265
package locale

136
main.go
View File

@ -6,140 +6,18 @@ package main
//go:generate go run generate.go
//go:generate gofmt -s -w sql/sql.go
//go:generate gofmt -s -w server/static/css.go
//go:generate gofmt -s -w server/static/bin.go
//go:generate gofmt -s -w server/static/js.go
//go:generate gofmt -s -w server/template/views.go
//go:generate gofmt -s -w server/template/common.go
//go:generate gofmt -s -w ui/static/css.go
//go:generate gofmt -s -w ui/static/bin.go
//go:generate gofmt -s -w ui/static/js.go
//go:generate gofmt -s -w template/views.go
//go:generate gofmt -s -w template/common.go
//go:generate gofmt -s -w locale/translations.go
import (
"bufio"
"context"
"flag"
"fmt"
"os"
"os/signal"
"runtime"
"strings"
"time"
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/reader/feed"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/server"
"github.com/miniflux/miniflux/storage"
"github.com/miniflux/miniflux/version"
_ "github.com/lib/pq"
"golang.org/x/crypto/ssh/terminal"
"github.com/miniflux/miniflux/cli"
)
func run(cfg *config.Config, store *storage.Storage) {
logger.Info("Starting Miniflux...")
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
feedHandler := feed.NewFeedHandler(store)
pool := scheduler.NewWorkerPool(feedHandler, cfg.GetInt("WORKER_POOL_SIZE", config.DefaultWorkerPoolSize))
server := server.NewServer(cfg, store, pool, feedHandler)
scheduler.NewFeedScheduler(
store,
pool,
cfg.GetInt("POLLING_FREQUENCY", config.DefaultPollingFrequency),
cfg.GetInt("BATCH_SIZE", config.DefaultBatchSize),
)
scheduler.NewSessionScheduler(store, config.DefaultSessionCleanupFrequency)
<-stop
logger.Info("Shutting down the server...")
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
server.Shutdown(ctx)
store.Close()
logger.Info("Server gracefully stopped")
}
func askCredentials() (string, string) {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter Username: ")
username, _ := reader.ReadString('\n')
fmt.Print("Enter Password: ")
bytePassword, _ := terminal.ReadPassword(0)
fmt.Printf("\n")
return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword))
}
func main() {
flagInfo := flag.Bool("info", false, "Show application information")
flagVersion := flag.Bool("version", false, "Show application version")
flagMigrate := flag.Bool("migrate", false, "Migrate database schema")
flagFlushSessions := flag.Bool("flush-sessions", false, "Flush all sessions (disconnect users)")
flagCreateAdmin := flag.Bool("create-admin", false, "Create admin user")
flag.Parse()
cfg := config.NewConfig()
store := storage.NewStorage(
cfg.Get("DATABASE_URL", config.DefaultDatabaseURL),
cfg.GetInt("DATABASE_MAX_CONNS", config.DefaultDatabaseMaxConns),
)
if *flagInfo {
fmt.Println("Version:", version.Version)
fmt.Println("Build Date:", version.BuildDate)
fmt.Println("Go Version:", runtime.Version())
return
}
if *flagVersion {
fmt.Println(version.Version)
return
}
if *flagMigrate {
store.Migrate()
return
}
if *flagFlushSessions {
fmt.Println("Flushing all sessions (disconnect users)")
if err := store.FlushAllSessions(); err != nil {
fmt.Println(err)
os.Exit(1)
}
return
}
if *flagCreateAdmin {
user := &model.User{
Username: os.Getenv("ADMIN_USERNAME"),
Password: os.Getenv("ADMIN_PASSWORD"),
IsAdmin: true,
}
if user.Username == "" || user.Password == "" {
user.Username, user.Password = askCredentials()
}
if err := user.ValidateUserCreation(); err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := store.CreateUser(user); err != nil {
fmt.Println(err)
os.Exit(1)
}
return
}
run(cfg, store)
cli.Parse()
}

View File

@ -1,5 +1,5 @@
// Code generated by go generate; DO NOT EDIT.
// 2017-12-24 14:32:38.84708161 -0800 PST m=+0.004106505
// 2018-01-02 21:59:10.075345511 -0800 PST m=+0.002720840
package sql

View File

@ -1,5 +1,5 @@
// Code generated by go generate; DO NOT EDIT.
// 2017-12-31 18:38:42.07097409 -0800 PST m=+0.051805248
// 2018-01-02 21:59:10.101985953 -0800 PST m=+0.029361282
package template

View File

@ -15,10 +15,10 @@ import (
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/duration"
"github.com/miniflux/miniflux/errors"
"github.com/miniflux/miniflux/filter"
"github.com/miniflux/miniflux/http/route"
"github.com/miniflux/miniflux/locale"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/route"
"github.com/miniflux/miniflux/server/ui/filter"
"github.com/miniflux/miniflux/url"
"github.com/gorilla/mux"

View File

@ -1,5 +1,5 @@
// Code generated by go generate; DO NOT EDIT.
// 2017-12-31 18:38:42.048775793 -0800 PST m=+0.029606951
// 2018-01-02 21:59:10.091229271 -0800 PST m=+0.018604600
package template

View File

@ -2,15 +2,15 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/version"
)
// AboutPage shows the about page.
func (c *Controller) AboutPage(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) AboutPage(ctx *handler.Context, request *handler.Request, response *handler.Response) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
response.HTML().ServerError(err)

View File

@ -2,19 +2,19 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"errors"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/form"
"github.com/miniflux/miniflux/ui/form"
)
// ShowCategories shows the page with all categories.
func (c *Controller) ShowCategories(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowCategories(ctx *handler.Context, request *handler.Request, response *handler.Response) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
response.HTML().ServerError(err)
@ -36,7 +36,7 @@ func (c *Controller) ShowCategories(ctx *core.Context, request *core.Request, re
}
// ShowCategoryEntries shows all entries for the given category.
func (c *Controller) ShowCategoryEntries(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowCategoryEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
offset := request.QueryIntegerParam("offset", 0)
@ -81,7 +81,7 @@ func (c *Controller) ShowCategoryEntries(ctx *core.Context, request *core.Reques
}
// CreateCategory shows the form to create a new category.
func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) CreateCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
response.HTML().ServerError(err)
@ -94,7 +94,7 @@ func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, re
}
// SaveCategory validate and save the new category into the database.
func (c *Controller) SaveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) SaveCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
@ -137,7 +137,7 @@ func (c *Controller) SaveCategory(ctx *core.Context, request *core.Request, resp
}
// EditCategory shows the form to modify a category.
func (c *Controller) EditCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) EditCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
category, err := c.getCategoryFromURL(ctx, request, response)
@ -156,7 +156,7 @@ func (c *Controller) EditCategory(ctx *core.Context, request *core.Request, resp
}
// UpdateCategory validate and update a category.
func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
category, err := c.getCategoryFromURL(ctx, request, response)
@ -199,7 +199,7 @@ func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, re
}
// RemoveCategory delete a category from the database.
func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveCategory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
category, err := c.getCategoryFromURL(ctx, request, response)
@ -215,7 +215,7 @@ func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, re
response.Redirect(ctx.Route("categories"))
}
func (c *Controller) getCategoryFromURL(ctx *core.Context, request *core.Request, response *core.Response) (*model.Category, error) {
func (c *Controller) getCategoryFromURL(ctx *handler.Context, request *handler.Request, response *handler.Response) (*model.Category, error) {
categoryID, err := request.IntegerParam("categoryID")
if err != nil {
response.HTML().BadRequest(err)
@ -237,7 +237,7 @@ func (c *Controller) getCategoryFromURL(ctx *core.Context, request *core.Request
return category, nil
}
func (c *Controller) getCategoryFormTemplateArgs(ctx *core.Context, user *model.User, category *model.Category, categoryForm *form.CategoryForm) (tplParams, error) {
func (c *Controller) getCategoryFormTemplateArgs(ctx *handler.Context, user *model.User, category *model.Category, categoryForm *form.CategoryForm) (tplParams, error) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
return nil, err

View File

@ -2,15 +2,15 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/reader/feed"
"github.com/miniflux/miniflux/reader/opml"
"github.com/miniflux/miniflux/scheduler"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/storage"
)
@ -33,7 +33,7 @@ type Controller struct {
opmlHandler *opml.Handler
}
func (c *Controller) getCommonTemplateArgs(ctx *core.Context) (tplParams, error) {
func (c *Controller) getCommonTemplateArgs(ctx *handler.Context) (tplParams, error) {
user := ctx.LoggedUser()
builder := c.store.NewEntryQueryBuilder(user.ID)
builder.WithStatus(model.EntryStatusUnread)

View File

@ -2,24 +2,22 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"errors"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/reader/sanitizer"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/integration"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/reader/sanitizer"
"github.com/miniflux/miniflux/reader/scraper"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/payload"
"github.com/miniflux/miniflux/storage"
)
// FetchContent downloads the original HTML page and returns relevant contents.
func (c *Controller) FetchContent(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) FetchContent(ctx *handler.Context, request *handler.Request, response *handler.Response) {
entryID, err := request.IntegerParam("entryID")
if err != nil {
response.HTML().BadRequest(err)
@ -55,7 +53,7 @@ func (c *Controller) FetchContent(ctx *core.Context, request *core.Request, resp
}
// SaveEntry send the link to external services.
func (c *Controller) SaveEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) SaveEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
entryID, err := request.IntegerParam("entryID")
if err != nil {
response.HTML().BadRequest(err)
@ -92,7 +90,7 @@ func (c *Controller) SaveEntry(ctx *core.Context, request *core.Request, respons
}
// ShowFeedEntry shows a single feed entry in "feed" mode.
func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowFeedEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryID, err := request.IntegerParam("entryID")
@ -168,7 +166,7 @@ func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, res
}
// ShowCategoryEntry shows a single feed entry in "category" mode.
func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowCategoryEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
categoryID, err := request.IntegerParam("categoryID")
@ -244,7 +242,7 @@ func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request,
}
// ShowUnreadEntry shows a single feed entry in "unread" mode.
func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowUnreadEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryID, err := request.IntegerParam("entryID")
@ -314,7 +312,7 @@ func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, r
}
// ShowReadEntry shows a single feed entry in "history" mode.
func (c *Controller) ShowReadEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowReadEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryID, err := request.IntegerParam("entryID")
@ -374,7 +372,7 @@ func (c *Controller) ShowReadEntry(ctx *core.Context, request *core.Request, res
}
// ShowStarredEntry shows a single feed entry in "starred" mode.
func (c *Controller) ShowStarredEntry(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowStarredEntry(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryID, err := request.IntegerParam("entryID")
@ -443,10 +441,10 @@ func (c *Controller) ShowStarredEntry(ctx *core.Context, request *core.Request,
}
// UpdateEntriesStatus handles Ajax request to update the status for a list of entries.
func (c *Controller) UpdateEntriesStatus(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateEntriesStatus(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryIDs, status, err := payload.DecodeEntryStatusPayload(request.Body())
entryIDs, status, err := decodeEntryStatusPayload(request.Body())
if err != nil {
logger.Error("[Controller:UpdateEntryStatus] %v", err)
response.JSON().BadRequest(nil)

View File

@ -2,19 +2,19 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"errors"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/form"
"github.com/miniflux/miniflux/ui/form"
)
// RefreshAllFeeds refresh all feeds in the background for the current user.
func (c *Controller) RefreshAllFeeds(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RefreshAllFeeds(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
jobs, err := c.store.NewUserBatch(user.ID, c.store.CountFeeds(user.ID))
if err != nil {
@ -30,7 +30,7 @@ func (c *Controller) RefreshAllFeeds(ctx *core.Context, request *core.Request, r
}
// ShowFeedsPage shows the page with all subscriptions.
func (c *Controller) ShowFeedsPage(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowFeedsPage(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
args, err := c.getCommonTemplateArgs(ctx)
@ -53,7 +53,7 @@ func (c *Controller) ShowFeedsPage(ctx *core.Context, request *core.Request, res
}
// ShowFeedEntries shows all entries for the given feed.
func (c *Controller) ShowFeedEntries(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowFeedEntries(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
offset := request.QueryIntegerParam("offset", 0)
@ -98,7 +98,7 @@ func (c *Controller) ShowFeedEntries(ctx *core.Context, request *core.Request, r
}
// EditFeed shows the form to modify a subscription.
func (c *Controller) EditFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) EditFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
feed, err := c.getFeedFromURL(request, response, user)
@ -116,7 +116,7 @@ func (c *Controller) EditFeed(ctx *core.Context, request *core.Request, response
}
// UpdateFeed update a subscription and redirect to the feed entries page.
func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
feed, err := c.getFeedFromURL(request, response, user)
@ -151,7 +151,7 @@ func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, respon
}
// RemoveFeed delete a subscription from the database and redirect to the list of feeds page.
func (c *Controller) RemoveFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
feedID, err := request.IntegerParam("feedID")
if err != nil {
response.HTML().ServerError(err)
@ -168,7 +168,7 @@ func (c *Controller) RemoveFeed(ctx *core.Context, request *core.Request, respon
}
// RefreshFeed refresh a subscription and redirect to the feed entries page.
func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RefreshFeed(ctx *handler.Context, request *handler.Request, response *handler.Response) {
feedID, err := request.IntegerParam("feedID")
if err != nil {
response.HTML().BadRequest(err)
@ -183,7 +183,7 @@ func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, respo
response.Redirect(ctx.Route("feedEntries", "feedID", feedID))
}
func (c *Controller) getFeedFromURL(request *core.Request, response *core.Response, user *model.User) (*model.Feed, error) {
func (c *Controller) getFeedFromURL(request *handler.Request, response *handler.Response, user *model.User) (*model.Feed, error) {
feedID, err := request.IntegerParam("feedID")
if err != nil {
response.HTML().BadRequest(err)
@ -204,7 +204,7 @@ func (c *Controller) getFeedFromURL(request *core.Request, response *core.Respon
return feed, nil
}
func (c *Controller) getFeedFormTemplateArgs(ctx *core.Context, user *model.User, feed *model.Feed, feedForm *form.FeedForm) (tplParams, error) {
func (c *Controller) getFeedFormTemplateArgs(ctx *handler.Context, user *model.User, feed *model.Feed, feedForm *form.FeedForm) (tplParams, error) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
return nil, err

View File

@ -2,15 +2,15 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
)
// ShowHistoryPage renders the page with all read entries.
func (c *Controller) ShowHistoryPage(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowHistoryPage(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
offset := request.QueryIntegerParam("offset", 0)
@ -48,7 +48,7 @@ func (c *Controller) ShowHistoryPage(ctx *core.Context, request *core.Request, r
}
// FlushHistory changes all "read" items to "removed".
func (c *Controller) FlushHistory(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) FlushHistory(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
err := c.store.FlushHistory(user.ID)

View File

@ -2,16 +2,16 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"time"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/http/handler"
)
// ShowIcon shows the feed icon.
func (c *Controller) ShowIcon(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowIcon(ctx *handler.Context, request *handler.Request, response *handler.Response) {
iconID, err := request.IntegerParam("iconID")
if err != nil {
response.HTML().BadRequest(err)

View File

@ -2,18 +2,18 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"crypto/md5"
"fmt"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/form"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/ui/form"
)
// ShowIntegrations renders the page with all external integrations.
func (c *Controller) ShowIntegrations(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowIntegrations(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
integration, err := c.store.Integration(user.ID)
if err != nil {
@ -51,7 +51,7 @@ func (c *Controller) ShowIntegrations(ctx *core.Context, request *core.Request,
}
// UpdateIntegration updates integration settings.
func (c *Controller) UpdateIntegration(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateIntegration(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
integration, err := c.store.Integration(user.ID)
if err != nil {

View File

@ -2,19 +2,19 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/cookie"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/cookie"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/form"
"github.com/miniflux/miniflux/ui/form"
"github.com/tomasen/realip"
)
// ShowLoginPage shows the login form.
func (c *Controller) ShowLoginPage(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowLoginPage(ctx *handler.Context, request *handler.Request, response *handler.Response) {
if ctx.IsAuthenticated() {
response.Redirect(ctx.Route("unread"))
return
@ -26,7 +26,7 @@ func (c *Controller) ShowLoginPage(ctx *core.Context, request *core.Request, res
}
// CheckLogin validates the username/password and redirects the user to the unread page.
func (c *Controller) CheckLogin(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) CheckLogin(ctx *handler.Context, request *handler.Request, response *handler.Response) {
authForm := form.NewAuthForm(request.Request())
tplParams := tplParams{
"errorMessage": "Invalid username or password.",
@ -64,7 +64,7 @@ func (c *Controller) CheckLogin(ctx *core.Context, request *core.Request, respon
}
// Logout destroy the session and redirects the user to the login page.
func (c *Controller) Logout(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Logout(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
if err := c.store.RemoveUserSessionByToken(user.ID, ctx.UserSessionToken()); err != nil {

View File

@ -2,20 +2,20 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/http/cookie"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/cookie"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/oauth2"
"github.com/miniflux/miniflux/oauth2"
"github.com/tomasen/realip"
)
// OAuth2Redirect redirects the user to the consent page to ask for permission.
func (c *Controller) OAuth2Redirect(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) OAuth2Redirect(ctx *handler.Context, request *handler.Request, response *handler.Response) {
provider := request.StringParam("provider", "")
if provider == "" {
logger.Error("[OAuth2] Invalid or missing provider: %s", provider)
@ -34,7 +34,7 @@ func (c *Controller) OAuth2Redirect(ctx *core.Context, request *core.Request, re
}
// OAuth2Callback receives the authorization code and create a new session.
func (c *Controller) OAuth2Callback(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) OAuth2Callback(ctx *handler.Context, request *handler.Request, response *handler.Response) {
provider := request.StringParam("provider", "")
if provider == "" {
logger.Error("[OAuth2] Invalid or missing provider")
@ -136,7 +136,7 @@ func (c *Controller) OAuth2Callback(ctx *core.Context, request *core.Request, re
}
// OAuth2Unlink unlink an account from the external provider.
func (c *Controller) OAuth2Unlink(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) OAuth2Unlink(ctx *handler.Context, request *handler.Request, response *handler.Response) {
provider := request.StringParam("provider", "")
if provider == "" {
logger.Info("[OAuth2] Invalid or missing provider")

View File

@ -2,15 +2,15 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/core"
)
// Export generates the OPML file.
func (c *Controller) Export(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Export(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
opml, err := c.opmlHandler.Export(user.ID)
if err != nil {
@ -22,7 +22,7 @@ func (c *Controller) Export(ctx *core.Context, request *core.Request, response *
}
// Import shows the import form.
func (c *Controller) Import(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Import(ctx *handler.Context, request *handler.Request, response *handler.Response) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
response.HTML().ServerError(err)
@ -35,7 +35,7 @@ func (c *Controller) Import(ctx *core.Context, request *core.Request, response *
}
// UploadOPML handles OPML file importation.
func (c *Controller) UploadOPML(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UploadOPML(ctx *handler.Context, request *handler.Request, response *handler.Response) {
file, fileHeader, err := request.File("file")
if err != nil {
logger.Error("[Controller:UploadOPML] %v", err)

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
const (
nbItemsPerPage = 100

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package payload
package ui
import (
"encoding/json"
@ -12,8 +12,7 @@ import (
"github.com/miniflux/miniflux/model"
)
// DecodeEntryStatusPayload unserialize JSON request to update entry statuses.
func DecodeEntryStatusPayload(data io.Reader) (entryIDs []int64, status string, err error) {
func decodeEntryStatusPayload(data io.Reader) (entryIDs []int64, status string, err error) {
type payload struct {
EntryIDs []int64 `json:"entry_ids"`
Status string `json:"status"`

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"encoding/base64"
@ -12,12 +12,12 @@ import (
"github.com/miniflux/miniflux/crypto"
"github.com/miniflux/miniflux/http"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/core"
)
// ImageProxy fetch an image from a remote server and sent it back to the browser.
func (c *Controller) ImageProxy(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ImageProxy(ctx *handler.Context, request *handler.Request, response *handler.Response) {
// If we receive a "If-None-Match" header we assume the image in stored in browser cache
if request.Request().Header.Get("If-None-Match") != "" {
response.NotModified()

View File

@ -2,15 +2,15 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/core"
)
// ShowSessions shows the list of active user sessions.
func (c *Controller) ShowSessions(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowSessions(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
@ -32,7 +32,7 @@ func (c *Controller) ShowSessions(ctx *core.Context, request *core.Request, resp
}
// RemoveSession remove a user session.
func (c *Controller) RemoveSession(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) RemoveSession(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
sessionID, err := request.IntegerParam("sessionID")

View File

@ -2,18 +2,18 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/locale"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/ui/form"
"github.com/miniflux/miniflux/ui/form"
)
// ShowSettings shows the settings page.
func (c *Controller) ShowSettings(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowSettings(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
args, err := c.getSettingsFormTemplateArgs(ctx, user, nil)
@ -26,7 +26,7 @@ func (c *Controller) ShowSettings(ctx *core.Context, request *core.Request, resp
}
// UpdateSettings update the settings.
func (c *Controller) UpdateSettings(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) UpdateSettings(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
settingsForm := form.NewSettingsForm(request.Request())
@ -66,7 +66,7 @@ func (c *Controller) UpdateSettings(ctx *core.Context, request *core.Request, re
response.Redirect(ctx.Route("settings"))
}
func (c *Controller) getSettingsFormTemplateArgs(ctx *core.Context, user *model.User, settingsForm *form.SettingsForm) (tplParams, error) {
func (c *Controller) getSettingsFormTemplateArgs(ctx *handler.Context, user *model.User, settingsForm *form.SettingsForm) (tplParams, error) {
args, err := c.getCommonTemplateArgs(ctx)
if err != nil {
return args, err

View File

@ -2,16 +2,16 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/model"
"github.com/miniflux/miniflux/server/core"
)
// ShowStarredPage renders the page with all starred entries.
func (c *Controller) ShowStarredPage(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ShowStarredPage(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
offset := request.QueryIntegerParam("offset", 0)
@ -50,7 +50,7 @@ func (c *Controller) ShowStarredPage(ctx *core.Context, request *core.Request, r
}
// ToggleBookmark handles Ajax request to toggle bookmark value.
func (c *Controller) ToggleBookmark(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) ToggleBookmark(ctx *handler.Context, request *handler.Request, response *handler.Response) {
user := ctx.LoggedUser()
entryID, err := request.IntegerParam("entryID")
if err != nil {

View File

@ -2,19 +2,19 @@
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package controller
package ui
import (
"encoding/base64"
"time"
"github.com/miniflux/miniflux/http/handler"
"github.com/miniflux/miniflux/logger"
"github.com/miniflux/miniflux/server/core"
"github.com/miniflux/miniflux/server/static"
"github.com/miniflux/miniflux/ui/static"
)
// Stylesheet renders the CSS.
func (c *Controller) Stylesheet(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Stylesheet(ctx *handler.Context, request *handler.Request, response *handler.Response) {
stylesheet := request.StringParam("name", "white")
body := static.Stylesheets["common"]
etag := static.StylesheetsChecksums["common"]
@ -28,12 +28,12 @@ func (c *Controller) Stylesheet(ctx *core.Context, request *core.Request, respon
}
// Javascript renders application client side code.
func (c *Controller) Javascript(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Javascript(ctx *handler.Context, request *handler.Request, response *handler.Response) {
response.Cache("text/javascript; charset=utf-8", static.JavascriptChecksums["app"], []byte(static.Javascript["app"]), 48*time.Hour)
}
// Favicon renders the application favicon.
func (c *Controller) Favicon(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) Favicon(ctx *handler.Context, request *handler.Request, response *handler.Response) {
blob, err := base64.StdEncoding.DecodeString(static.Binaries["favicon.ico"])
if err != nil {
logger.Error("[Controller:Favicon] %v", err)
@ -45,7 +45,7 @@ func (c *Controller) Favicon(ctx *core.Context, request *core.Request, response
}
// AppIcon returns application icons.
func (c *Controller) AppIcon(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) AppIcon(ctx *handler.Context, request *handler.Request, response *handler.Response) {
filename := request.StringParam("filename", "favicon.png")
encodedBlob, found := static.Binaries[filename]
if !found {
@ -65,7 +65,7 @@ func (c *Controller) AppIcon(ctx *core.Context, request *core.Request, response
}
// WebManifest renders web manifest file.
func (c *Controller) WebManifest(ctx *core.Context, request *core.Request, response *core.Response) {
func (c *Controller) WebManifest(ctx *handler.Context, request *handler.Request, response *handler.Response) {
type webManifestIcon struct {
Source string `json:"src"`
Sizes string `json:"sizes"`

View File

@ -1,5 +1,5 @@
// Code generated by go generate; DO NOT EDIT.
// 2017-12-22 11:25:01.957187237 -0800 PST m=+0.022154999
// 2018-01-02 21:59:10.082800492 -0800 PST m=+0.010175821
package static

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 847 B

After

Width:  |  Height:  |  Size: 847 B

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show More