intake/web/source.go

178 lines
4.6 KiB
Go
Raw Normal View History

package web
import (
2025-02-07 22:37:36 +00:00
"fmt"
"log"
"net/http"
2025-02-07 22:37:36 +00:00
"time"
"github.com/Jaculabilis/intake/core"
"github.com/Jaculabilis/intake/web/html"
)
2025-01-28 00:38:02 +00:00
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 {
2025-01-28 00:38:02 +00:00
http.NotFound(writer, req)
return
}
2025-02-07 16:17:51 +00:00
page := getQueryInt(req, "page", 1)
count := getQueryInt(req, "count", core.DefaultFeedLimit)
showHidden := getQueryInt(req, "hidden", 0)
var items []core.Item
var err error
2025-02-07 16:17:51 +00:00
if showHidden != 0 {
items, err = core.GetAllItemsForSource(env.db, source, (page-1)*count, count)
} else {
2025-02-07 16:17:51 +00:00
items, err = core.GetActiveItemsForSource(env.db, source, (page-1)*count, count)
}
if err != nil {
2025-01-31 00:55:02 +00:00
http.Error(writer, err.Error(), 500)
return
}
2025-02-19 04:02:19 +00:00
lastUpdated, err := core.GetLastUpdated(env.db, source)
if err != nil {
http.Error(writer, err.Error(), 500)
return
}
data := html.FeedData{
2025-02-19 04:02:19 +00:00
Items: items,
ShowHidden: showHidden,
Page: page,
Count: count,
LastUpdated: lastUpdated,
}
html.Feed(writer, data)
}
2025-02-07 22:37:36 +00:00
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
}
2025-02-07 23:06:05 +00:00
state, envs, argv, postProcess, err := core.GetSourceActionInputs(env.db, source, "fetch")
2025-02-07 22:37:36 +00:00
if err != nil {
2025-02-07 23:06:05 +00:00
http.Error(writer, fmt.Sprintf("error: failed to get data for %s: %v", source, err.Error()), 500)
2025-02-07 22:37:36 +00:00
return
}
2025-02-10 16:22:19 +00:00
items, newState, errItem, err := core.Execute(source, argv, envs, state, "", time.Minute, postProcess)
2025-02-07 22:37:36 +00:00
if err != nil {
2025-02-10 16:22:19 +00:00
core.AddErrorItem(env.db, errItem)
2025-02-07 22:37:36 +00:00
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)
}
2025-02-12 18:04:58 +00:00
func (env *Env) getEditSource(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
}
envs, err := core.GetEnvsMap(env.db, source)
if err != nil {
http.Error(writer, err.Error(), 500)
return
}
actions, _ := core.GetActionsForSource(env.db, source)
argvs := make(map[string]string)
for _, action := range actions {
argv, _ := core.GetArgvForAction(env.db, source, action)
args, _ := Quote(argv)
argvs[action] = args
}
data := html.EditSourceData{
Name: source,
Envs: envs,
Actions: argvs,
}
html.EditSource(writer, data)
}
func (env *Env) editSource(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
}
if err := req.ParseForm(); err != nil {
http.Error(writer, err.Error(), 400)
return
}
envName := req.PostForm.Get("envName")
envValue := req.PostForm.Get("envValue")
if envName != "" {
log.Printf("setting %s=%s", envName, envValue)
if err := core.SetEnvs(env.db, source, []string{fmt.Sprintf("%s=%s", envName, envValue)}); err != nil {
http.Error(writer, err.Error(), 500)
return
}
}
actionName := req.PostForm.Get("actionName")
actionArgv := req.PostForm.Get("actionArgv")
if actionName != "" {
log.Printf("setting %s -- %s", actionName, actionArgv)
if actionArgv == "" {
if err := core.DeleteAction(env.db, source, actionName); err != nil {
http.Error(writer, err.Error(), 500)
return
}
} else {
argv, err := Shlex(actionArgv)
if err != nil {
http.Error(writer, err.Error(), 400)
return
}
if err = core.SetAction(env.db, source, actionName, argv); err != nil {
http.Error(writer, err.Error(), 500)
return
}
}
}
writer.Header()["HX-Refresh"] = []string{"true"}
writer.WriteHeader(http.StatusNoContent)
}
2025-02-21 00:09:29 +00:00
func (env *Env) addSource(writer http.ResponseWriter, req *http.Request) {
if err := req.ParseForm(); err != nil {
http.Error(writer, err.Error(), 400)
return
}
name := req.PostForm.Get("name")
if err := core.AddSource(env.db, name); err != nil {
http.Error(writer, err.Error(), 500)
return
}
http.Redirect(writer, req, "/source/"+name+"/edit", http.StatusFound)
}