Compare commits

..

5 Commits

Author SHA1 Message Date
bel
07992b6636 delete less accidentally clickable 2025-11-30 08:56:37 -07:00
bel
9583234df5 do not list deleted (url == "") 2025-11-30 08:54:28 -07:00
bel
2943362587 if POST /?delete then DELETE 2025-11-30 08:54:18 -07:00
bel
cbd4e32022 DELETE /v1/feeds/abc updates all fields to "" 2025-11-30 08:44:27 -07:00
bel
727b4fdea6 from testdata to public for .html 2025-11-30 08:40:15 -07:00
5 changed files with 39 additions and 10 deletions

View File

@@ -10,12 +10,25 @@ import (
func (h Handler) feeds(w http.ResponseWriter, r *http.Request) error { func (h Handler) feeds(w http.ResponseWriter, r *http.Request) error {
switch r.Method { switch r.Method {
case http.MethodDelete:
if err := r.ParseForm(); err != nil {
return err
}
if err := h.feedsDelete(r.Context(), r.URL.Query().Get("id")); err != nil {
return err
}
case http.MethodPost, http.MethodPut: case http.MethodPost, http.MethodPut:
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
return err return err
} }
if err := h.feedsUpsert(r.Context(), r.URL.Query().Get("id"), r.Form); err != nil { if r.URL.Query().Has("delete") {
return err if err := h.feedsDelete(r.Context(), r.URL.Query().Get("id")); err != nil {
return err
}
} else {
if err := h.feedsUpsert(r.Context(), r.URL.Query().Get("id"), r.Form); err != nil {
return err
}
} }
default: default:
http.NotFound(w, r) http.NotFound(w, r)
@@ -29,6 +42,10 @@ func (h Handler) feeds(w http.ResponseWriter, r *http.Request) error {
return nil return nil
} }
func (h Handler) feedsDelete(ctx context.Context, id string) error {
return feeds.Delete(ctx, id)
}
func (h Handler) feedsUpsert(ctx context.Context, id string, form url.Values) error { func (h Handler) feedsUpsert(ctx context.Context, id string, form url.Values) error {
var req feeds.Version var req feeds.Version
for k, v := range map[string]*string{ for k, v := range map[string]*string{

View File

@@ -23,7 +23,13 @@
{{ if eq "" .editing.ID }} {{ if eq "" .editing.ID }}
New New
{{ else }} {{ else }}
Update <code><a target="_blank" href="{{ .editing_url }}">{{ .editing.URL }}</a></code> (<a href="?">clear</a>) Updating <code><a target="_blank" href="{{ .editing_url }}">{{ .editing.URL }}</a></code> (<a href="?">clear</a>)
<br>
<div style="scale: 0.85">
<form method="POST" action="/v1/feeds?id={{ .editing.ID }}&delete">
<button type="submit">DELETE</button>
</form>
</div>
{{ end }} {{ end }}
</h3> </h3>
<form method="POST" action="/v1/feeds?id={{ .editing.ID }}"> <form method="POST" action="/v1/feeds?id={{ .editing.ID }}">
@@ -32,9 +38,9 @@
<div> <div>
<label for="{{ $k }}"> <label for="{{ $k }}">
{{ $k }} {{ $k }}
{{- if eq $k "URL" }} {{- if eq $k "URL" }}
(hint: nyaa://?q=show) (hint: nyaa://?q=show)
{{ else if eq $k "WebhookURL" }} {{ else if eq $k "WebhookURL" }}
(hint: vpntor:///outdir) (hint: vpntor:///outdir)
{{ end }} {{ end }}
</label> </label>

View File

@@ -17,17 +17,17 @@ import (
_ "embed" _ "embed"
) )
//go:embed testdata/index.tmpl //go:embed public/index.tmpl
var embeddedIndexTMPL string var embeddedIndexTMPL string
//go:embed testdata/* //go:embed public/*
var embeddedDir embed.FS var embeddedDir embed.FS
var dir = func() string { var dir = func() string {
if v := os.Getenv("UI_D"); v != "" { if v := os.Getenv("UI_D"); v != "" {
return v return v
} }
return "./src/cmd/server/handler/testdata" return "./src/cmd/server/handler/public"
}() }()
func (h Handler) ui(w http.ResponseWriter, r *http.Request) error { func (h Handler) ui(w http.ResponseWriter, r *http.Request) error {
@@ -37,7 +37,7 @@ func (h Handler) ui(w http.ResponseWriter, r *http.Request) error {
w.Header().Set("Cache-Control", "max-age=2592000") w.Header().Set("Cache-Control", "max-age=2592000")
fs := http.FileServer(http.FS(embeddedDir)) fs := http.FileServer(http.FS(embeddedDir))
r.URL.Path = fmt.Sprintf("/testdata/%s", strings.TrimPrefix(r.URL.Path, "/experimental/ui")) r.URL.Path = fmt.Sprintf("/public/%s", strings.TrimPrefix(r.URL.Path, "/experimental/ui"))
fs.ServeHTTP(w, r) fs.ServeHTTP(w, r)
return nil return nil
} }
@@ -57,7 +57,9 @@ func (h Handler) uiIndex(w http.ResponseWriter, r *http.Request) error {
editing.Version.WebhookURL = "vpntor:///data/completed-rss/TITLE" editing.Version.WebhookURL = "vpntor:///data/completed-rss/TITLE"
all := []feeds.Feed{} all := []feeds.Feed{}
if err := feeds.ForEach(ctx, func(f feeds.Feed) error { if err := feeds.ForEach(ctx, func(f feeds.Feed) error {
all = append(all, f) if deleted := f.Version.URL == ""; !deleted {
all = append(all, f)
}
if f.Entry.ID == r.URL.Query().Get("edit") { if f.Entry.ID == r.URL.Query().Get("edit") {
editing.Entry = f.Entry editing.Entry = f.Entry
editing.Version = f.Version editing.Version = f.Version

View File

@@ -84,6 +84,10 @@ func ForEach(ctx context.Context, cb func(Feed) error) error {
return nil return nil
} }
func Delete(ctx context.Context, id string) error {
return Update(ctx, id, "", "", "", "", "", "")
}
func Get(ctx context.Context, id string) (Feed, error) { func Get(ctx context.Context, id string) (Feed, error) {
if err := initDB(ctx); err != nil { if err := initDB(ctx); err != nil {
return Feed{}, err return Feed{}, err