intake/web/source.go

81 lines
2.1 KiB
Go

package web
import (
"fmt"
"log"
"net/http"
"time"
"github.com/Jaculabilis/intake/core"
"github.com/Jaculabilis/intake/web/html"
)
func (env *Env) getSource(writer http.ResponseWriter, req *http.Request) {
source := req.PathValue("source")
if exists, err := core.SourceExists(env.db, source); !exists || err != nil {
http.NotFound(writer, req)
return
}
page := getQueryInt(req, "page", 1)
count := getQueryInt(req, "count", core.DefaultFeedLimit)
showHidden := getQueryInt(req, "hidden", 0)
var items []core.Item
var err error
if showHidden != 0 {
items, err = core.GetAllItemsForSource(env.db, source, (page-1)*count, count)
} else {
items, err = core.GetActiveItemsForSource(env.db, source, (page-1)*count, count)
}
if err != nil {
http.Error(writer, err.Error(), 500)
return
}
data := html.FeedData{
Items: items,
ShowHidden: showHidden,
Page: page,
Count: count,
}
html.Feed(writer, data)
}
func (env *Env) fetchSource(writer http.ResponseWriter, req *http.Request) {
source := req.PathValue("source")
if exists, err := core.SourceExists(env.db, source); !exists || err != nil {
http.NotFound(writer, req)
return
}
state, envs, argv, postProcess, err := core.GetSourceActionInputs(env.db, source, "fetch")
if err != nil {
http.Error(writer, fmt.Sprintf("error: failed to get data for %s: %v", source, err.Error()), 500)
return
}
items, newState, errItem, err := core.Execute(source, argv, envs, state, "", time.Minute, postProcess)
if err != nil {
core.AddErrorItem(env.db, errItem)
http.Error(writer, fmt.Sprintf("error: failed to execute fetch: %v", err.Error()), 500)
return
}
added, deleted, err := core.UpdateWithFetchedItems(env.db, source, newState, items, time.Now())
if err != nil {
http.Error(writer, fmt.Sprintf("error: failed to update: %v", err.Error()), 500)
return
}
log.Printf("%s added %d items, updated %d items, and deleted %d items", source, added, len(items)-added, deleted)
data := html.FetchData{
Source: source,
Added: added,
Updated: len(items) - added,
Deleted: deleted,
Items: items,
}
html.Fetch(writer, data)
}