From f5e9a0faec7e0a5c66b2ae68a1d8426df21d4858 Mon Sep 17 00:00:00 2001 From: Tim Van Baak Date: Fri, 7 Feb 2025 15:49:22 -0800 Subject: [PATCH] Web ad-hoc items --- README.md | 2 +- web/html/home.html | 32 +++++++++++++++++++ web/html/html.go | 1 - web/html/intake.css | 1 + web/html/itemPage.html | 6 ++++ web/item.go | 70 ++++++++++++++++++++++++++++++++++++++++++ web/main.go | 1 + 7 files changed, 111 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 46c22d0..63f3ef9 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Parity features * [ ] set a working directory for item actions * [ ] crontab integration * [ ] source batching -* [ ] add item from web +* [x] add item from web * [ ] Nix build * [ ] NixOS module * [ ] NixOS vm demo diff --git a/web/html/home.html b/web/html/home.html index 6d270d6..78c3dc4 100644 --- a/web/html/home.html +++ b/web/html/home.html @@ -42,4 +42,36 @@ {{ end }} + +
+
+Add item +
+

+ +

+

+ +

+

+ +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+
{{- end }} diff --git a/web/html/html.go b/web/html/html.go index 23555e0..ed157e8 100644 --- a/web/html/html.go +++ b/web/html/html.go @@ -133,7 +133,6 @@ var item = load("itemPage.html", "item.html") type ItemData struct { Item core.Item - Open bool } func Item(writer io.Writer, data ItemData) { diff --git a/web/html/intake.css b/web/html/intake.css index 858f6fc..47cf576 100644 --- a/web/html/intake.css +++ b/web/html/intake.css @@ -71,6 +71,7 @@ summary:focus { .wide { width: 100%; resize: vertical; + box-sizing: border-box; } .fade > * { opacity: 0.2; diff --git a/web/html/itemPage.html b/web/html/itemPage.html index 7f28ac8..7d293d3 100644 --- a/web/html/itemPage.html +++ b/web/html/itemPage.html @@ -1,5 +1,11 @@ {{ define "title" }}{{ if .Item.Title }}{{ .Item.Title }}{{ else }}{{ .Item.Source }}/{{ .Item.Id }}{{ end }} - Intake [{{ .Item.Source }}]{{ end }} {{ define "content" -}} +
+ + Home + +
+ {{ template "item" .Item }} {{- end }} diff --git a/web/item.go b/web/item.go index 339e0b2..2221033 100644 --- a/web/item.go +++ b/web/item.go @@ -1,6 +1,8 @@ package web import ( + "crypto/rand" + "encoding/hex" "fmt" "log" "net/http" @@ -135,3 +137,71 @@ func (env *Env) massDeactivate(writer http.ResponseWriter, req *http.Request) { writer.Header()["HX-Refresh"] = []string{"true"} http.Error(writer, "ok", http.StatusNoContent) } + +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 + } + } + + bytes := make([]byte, 16) + if _, err := rand.Read(bytes); err != nil { + http.Error(writer, fmt.Sprintf("error: failed to generate id: %v", err), 500) + } + id := hex.EncodeToString(bytes) + + 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) +} diff --git a/web/main.go b/web/main.go index 6d2c563..3585738 100644 --- a/web/main.go +++ b/web/main.go @@ -42,6 +42,7 @@ func RunServer(db core.DB, addr string, port string) { handleFunc("GET /source/{source}", env.getSource, env.authed, logged) handleFunc("POST /source/{source}/fetch", env.fetchSource, env.authed, logged) handleFunc("GET /channel/{channel}", env.getChannel, env.authed, logged) + handleFunc("POST /item", env.addItem, env.authed, logged) handleFunc("GET /item/{source}/{id}", env.getItem, env.authed, logged) handleFunc("DELETE /item/{source}/{id}", env.deleteItem, env.authed, logged) handleFunc("POST /item/{source}/{id}/action/{action}", env.doAction, env.authed, logged)