2025-01-28 04:19:08 +00:00
|
|
|
package web
|
|
|
|
|
|
|
|
import (
|
2025-01-31 17:55:07 +00:00
|
|
|
"fmt"
|
2025-01-30 06:21:17 +00:00
|
|
|
"log"
|
2025-01-28 04:19:08 +00:00
|
|
|
"net/http"
|
2025-01-30 06:21:17 +00:00
|
|
|
"strings"
|
2025-01-29 22:54:29 +00:00
|
|
|
"time"
|
2025-01-28 04:19:08 +00:00
|
|
|
|
|
|
|
"github.com/Jaculabilis/intake/core"
|
|
|
|
"github.com/Jaculabilis/intake/web/html"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (env *Env) getItem(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
source := req.PathValue("source")
|
|
|
|
id := req.PathValue("id")
|
|
|
|
|
|
|
|
item, err := core.GetItem(env.db, source, id)
|
|
|
|
if err != nil {
|
2025-01-31 00:55:02 +00:00
|
|
|
http.Error(writer, err.Error(), 500)
|
2025-01-28 04:19:08 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
html.Item(writer, html.ItemData{Item: item})
|
|
|
|
}
|
2025-01-28 05:04:21 +00:00
|
|
|
|
|
|
|
func (env *Env) deleteItem(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
source := req.PathValue("source")
|
|
|
|
id := req.PathValue("id")
|
|
|
|
|
|
|
|
_, err := core.DeactivateItem(env.db, source, id)
|
|
|
|
if err != nil {
|
2025-01-31 00:55:02 +00:00
|
|
|
http.Error(writer, err.Error(), 500)
|
2025-01-28 05:04:21 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
item, err := core.GetItem(env.db, source, id)
|
|
|
|
if err != nil {
|
2025-01-31 00:55:02 +00:00
|
|
|
http.Error(writer, err.Error(), 500)
|
2025-01-28 05:04:21 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
html.Item(writer, html.ItemData{Item: item})
|
|
|
|
}
|
2025-01-29 22:54:29 +00:00
|
|
|
|
2025-02-07 04:14:54 +00:00
|
|
|
func (env *Env) puntItem(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
source := req.PathValue("source")
|
|
|
|
id := req.PathValue("id")
|
|
|
|
|
|
|
|
item, err := core.GetItem(env.db, source, id)
|
|
|
|
if err != nil {
|
|
|
|
http.Error(writer, err.Error(), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
now := time.Now()
|
|
|
|
tomorrow := now.Add(time.Hour * 60)
|
|
|
|
morning := time.Date(tomorrow.Year(), tomorrow.Month(), tomorrow.Day(), 6, 0, 0, 0, time.UTC)
|
|
|
|
til_then := int(morning.Unix()) - item.Created
|
|
|
|
item.Tts = til_then
|
|
|
|
|
|
|
|
if err := core.UpdateItems(env.db, []core.Item{item}); err != nil {
|
|
|
|
http.Error(writer, err.Error(), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
html.Item(writer, html.ItemData{Item: item})
|
|
|
|
}
|
|
|
|
|
2025-01-29 22:54:29 +00:00
|
|
|
func (env *Env) doAction(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
source := req.PathValue("source")
|
|
|
|
id := req.PathValue("id")
|
|
|
|
action := req.PathValue("action")
|
|
|
|
|
2025-02-07 23:06:05 +00:00
|
|
|
state, envs, argv, postProcess, err := core.GetSourceActionInputs(env.db, source, action)
|
2025-01-31 00:04:31 +00:00
|
|
|
if err != nil {
|
2025-02-07 23:06:05 +00:00
|
|
|
http.Error(writer, fmt.Sprintf("error: failed to load data for %s: %v", source, err), 500)
|
2025-01-31 16:00:07 +00:00
|
|
|
}
|
|
|
|
|
2025-01-29 22:54:29 +00:00
|
|
|
item, err := core.GetItem(env.db, source, id)
|
|
|
|
if err != nil {
|
|
|
|
http.Error(writer, err.Error(), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if item.Action[action] == nil {
|
|
|
|
http.Error(writer, "no such action", 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2025-02-05 21:21:31 +00:00
|
|
|
newItem, newState, err := core.ExecuteItemAction(item, argv, envs, state, time.Minute, postProcess)
|
2025-01-29 22:54:29 +00:00
|
|
|
if err != nil {
|
|
|
|
http.Error(writer, err.Error(), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2025-01-31 17:55:07 +00:00
|
|
|
if err = env.db.Transact(func(tx core.DB) error {
|
|
|
|
if _err := core.UpdateItems(tx, []core.Item{newItem}); err != nil {
|
|
|
|
return fmt.Errorf("failed to update item: %v", _err)
|
|
|
|
}
|
|
|
|
if _err := core.SetState(tx, source, newState); err != nil {
|
|
|
|
return fmt.Errorf("failed to set state for %s: %v", source, _err)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
2025-01-29 22:54:29 +00:00
|
|
|
http.Error(writer, err.Error(), 500)
|
2025-01-31 00:04:31 +00:00
|
|
|
}
|
|
|
|
|
2025-01-29 22:54:29 +00:00
|
|
|
html.Item(writer, html.ItemData{Item: newItem})
|
|
|
|
}
|
2025-01-30 06:21:17 +00:00
|
|
|
|
|
|
|
func (env *Env) massDeactivate(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
if err := req.ParseForm(); err != nil {
|
|
|
|
log.Printf("error parsing form data: %v", err)
|
|
|
|
http.Error(writer, "", http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, item := range req.PostForm["items"] {
|
|
|
|
i := strings.Index(item, "/")
|
|
|
|
if i == -1 {
|
|
|
|
log.Printf("error: invalid source/item: %s", item)
|
|
|
|
http.Error(writer, "", http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, item := range req.PostForm["items"] {
|
|
|
|
i := strings.Index(item, "/")
|
|
|
|
source := item[:i]
|
|
|
|
id := item[i+1:]
|
|
|
|
active, err := core.DeactivateItem(env.db, source, id)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("error: failed to deactivate %s/%s: %v", source, id, err)
|
|
|
|
}
|
|
|
|
if active {
|
|
|
|
log.Printf("deactivated %s/%s", source, id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
writer.Header()["HX-Refresh"] = []string{"true"}
|
|
|
|
http.Error(writer, "ok", http.StatusNoContent)
|
|
|
|
}
|
2025-02-07 23:49:22 +00:00
|
|
|
|
|
|
|
func (env *Env) addItem(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
if err := req.ParseForm(); err != nil {
|
|
|
|
log.Printf("error parsing form data: %v", err)
|
|
|
|
http.Error(writer, "", http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
exists, err := core.SourceExists(env.db, "default")
|
|
|
|
if err != nil {
|
|
|
|
http.Error(writer, fmt.Sprintf("error: failed to check for source: %v", err), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if !exists {
|
|
|
|
if err := core.AddSource(env.db, "default"); err != nil {
|
|
|
|
http.Error(writer, fmt.Sprintf("error: failed to add source: %v", err), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-10 14:36:13 +00:00
|
|
|
id := core.RandomHex(16)
|
2025-02-07 23:49:22 +00:00
|
|
|
|
|
|
|
title := req.PostForm.Get("title")
|
|
|
|
link := req.PostForm.Get("link")
|
|
|
|
body := req.PostForm.Get("body")
|
|
|
|
|
|
|
|
item := core.Item{
|
|
|
|
Source: "default",
|
|
|
|
Id: id,
|
|
|
|
Title: title,
|
|
|
|
Link: link,
|
|
|
|
Body: body,
|
|
|
|
}
|
|
|
|
|
|
|
|
now := time.Now().Unix()
|
|
|
|
if ttl := req.PostForm.Get("ttl"); ttl != "" {
|
|
|
|
ttl, _ := time.Parse("2006-01-02T15:04", ttl)
|
|
|
|
item.Ttl = int(ttl.Unix() - now)
|
|
|
|
}
|
|
|
|
if ttd := req.PostForm.Get("ttd"); ttd != "" {
|
|
|
|
ttd, _ := time.Parse("2006-01-02T15:04", ttd)
|
|
|
|
item.Ttd = int(ttd.Unix() - now)
|
|
|
|
}
|
|
|
|
if tts := req.PostForm.Get("tts"); tts != "" {
|
|
|
|
tts, _ := time.Parse("2006-01-02T15:04", tts)
|
|
|
|
item.Tts = int(tts.Unix() - now)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := core.AddItems(env.db, []core.Item{item}); err != nil {
|
|
|
|
http.Error(writer, fmt.Sprintf("error: failed to add item: %s", err), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
item, err = core.GetItem(env.db, "default", id)
|
|
|
|
if err != nil {
|
|
|
|
http.Error(writer, err.Error(), 500)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
data := html.ItemData{
|
|
|
|
Item: item,
|
|
|
|
}
|
|
|
|
html.Item(writer, data)
|
|
|
|
}
|