From f38f083d63bdd85cae37a8370d21b3c5d035dba2 Mon Sep 17 00:00:00 2001 From: Egor Aristov Date: Sat, 1 Feb 2025 14:06:06 +0300 Subject: [PATCH] entry ids now use url with query --- internal/delivery/http/handler.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/internal/delivery/http/handler.go b/internal/delivery/http/handler.go index e2bf5ea..5f10b3b 100644 --- a/internal/delivery/http/handler.go +++ b/internal/delivery/http/handler.go @@ -182,7 +182,22 @@ func makeFeed(task models.Task, result models.TaskResult) (string, error) { Updated: feedTS, } for _, item := range result.Items { + itemUrl, err := url.Parse(item.Link) + if err != nil { + log.Errorf("Invalid item link, item=%+v", item) + continue + } + id := fmt.Sprintf( + "tag:%s,%s:%s", + itemUrl.Host, + anyTimeFormat("2006-01-02", item.Created, item.Updated), + itemUrl.Path, + ) + if len(itemUrl.RawQuery) > 0 { + id += "?" + itemUrl.RawQuery + } feed.Items = append(feed.Items, &feeds.Item{ + Id: id, Title: html.EscapeString(item.Title), Link: &feeds.Link{Href: item.Link}, Author: &feeds.Author{Name: item.AuthorName}, @@ -192,6 +207,9 @@ func makeFeed(task models.Task, result models.TaskResult) (string, error) { Content: item.Content, }) } + if len(feed.Items) == 0 { + return "", fmt.Errorf("empty feed") + } atomFeed := (&feeds.Atom{Feed: &feed}).AtomFeed() atomFeed.Icon = result.Icon for i, entry := range atomFeed.Entries { @@ -215,3 +233,13 @@ func extractHeaders(c echo.Context) map[string]string { } return headers } + +// returns the first non-zero time formatted as a string or "" +func anyTimeFormat(format string, times ...time.Time) string { + for _, t := range times { + if !t.IsZero() { + return t.Format(format) + } + } + return "" +}