2025-01-25 05:27:26 +00:00
|
|
|
package web
|
|
|
|
|
|
|
|
import (
|
2025-02-07 22:37:36 +00:00
|
|
|
"fmt"
|
|
|
|
"log"
|
2025-01-25 05:27:26 +00:00
|
|
|
"net/http"
|
2025-02-07 22:37:36 +00:00
|
|
|
"time"
|
2025-01-25 05:27:26 +00:00
|
|
|
|
|
|
|
"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")
|
2025-01-31 22:16:45 +00:00
|
|
|
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)
|
|
|
|
|
2025-01-31 01:20:29 +00:00
|
|
|
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)
|
2025-01-31 01:20:29 +00:00
|
|
|
} else {
|
2025-02-07 16:17:51 +00:00
|
|
|
items, err = core.GetActiveItemsForSource(env.db, source, (page-1)*count, count)
|
2025-01-31 01:20:29 +00:00
|
|
|
}
|
2025-01-25 05:27:26 +00:00
|
|
|
if err != nil {
|
2025-01-31 00:55:02 +00:00
|
|
|
http.Error(writer, err.Error(), 500)
|
2025-01-25 05:27:26 +00:00
|
|
|
return
|
|
|
|
}
|
2025-01-31 01:20:29 +00:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2025-01-25 05:41:46 +00:00
|
|
|
data := html.FeedData{
|
2025-02-19 04:02:19 +00:00
|
|
|
Items: items,
|
|
|
|
ShowHidden: showHidden,
|
|
|
|
Page: page,
|
|
|
|
Count: count,
|
|
|
|
LastUpdated: lastUpdated,
|
2025-01-25 05:41:46 +00:00
|
|
|
}
|
|
|
|
html.Feed(writer, data)
|
2025-01-25 05:27:26 +00:00
|
|
|
}
|
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)
|
|
|
|
}
|