Parse rss headers before saving to db

This commit is contained in:
2024-05-05 13:17:28 +02:00
parent 04831467f7
commit 058c517b3b
4 changed files with 69 additions and 26 deletions

View File

@@ -1,6 +1,7 @@
package main
import (
"fmt"
"log"
"net/http"
@@ -35,7 +36,17 @@ func (h *Handler) AddFeed(c echo.Context) error {
return err
}
feed, err := h.feeds.AddFeed(req.Link, req.Tags, user)
feeds, err := h.feeds.GetFeedData(req.Link)
if err != nil {
return echo.NewHTTPError(400, fmt.Sprintf("Invalid feed link: %v", err))
}
if len(feeds) != 1 {
return c.JSON(409, feeds)
}
feed := feeds[0]
feed.SubmitterId = user
feed.Tags = req.Tags
feed, err = h.feeds.AddFeed(feed)
if err != nil {
log.Printf("Add feed error: %v", err)
return echo.NewHTTPError(500, "internal server error")

View File

@@ -1,6 +1,8 @@
package vex
import (
"fmt"
"net/http"
"time"
"github.com/google/uuid"
@@ -15,26 +17,41 @@ type Feed struct {
FaviconUrl string `json:"faviconUrl"`
Tags []string `json:"tags"`
SubmitterId uuid.UUID `json:"submitterId"`
Submitter User `json:"submitter,omitempty"`
Submitter *User `json:"submitter,omitempty"`
AddedDate time.Time `json:"addedDate"`
}
type FeedDao struct {
Id uuid.UUID
Name string
Link string
FaviconUrl string `db:"favicon_url"`
Tags pq.StringArray
SubmitterId uuid.UUID `db:"submitter_id"`
Submitter User `db:"submitter"`
AddedDate time.Time `db:"added_date"`
Id uuid.UUID
Name string
Link string
FaviconUrl string `db:"favicon_url"`
Tags pq.StringArray
SubmitterId uuid.UUID `db:"submitter_id"`
Submitter *User `db:"submitter"`
AddedDate time.Time `db:"added_date"`
Etag string
LastFetchDate *time.Time `db:"last_fetch_date"`
}
func (f *FeedDao) ToFeed() Feed {
return Feed{
Id: f.Id,
Name: f.Name,
Link: f.Name,
Link: f.Link,
FaviconUrl: f.FaviconUrl,
Tags: f.Tags,
SubmitterId: f.SubmitterId,
Submitter: f.Submitter,
AddedDate: f.AddedDate,
}
}
func (f *Feed) ToDao() FeedDao {
return FeedDao{
Id: f.Id,
Name: f.Name,
Link: f.Link,
FaviconUrl: f.FaviconUrl,
Tags: f.Tags,
SubmitterId: f.SubmitterId,
@@ -45,39 +62,51 @@ func (f *FeedDao) ToFeed() Feed {
type FeedService struct {
database *sqlx.DB
reader Reader
}
func NewFeedService(db *sqlx.DB) FeedService {
return FeedService{database: db}
return FeedService{
database: db,
reader: NewRssReader(http.DefaultClient),
}
}
func (s FeedService) AddFeed(link string, tags []string, submitter uuid.UUID) (Feed, error) {
feed := FeedDao{
Id: uuid.New(),
Name: link,
Link: link,
FaviconUrl: link,
Tags: tags,
SubmitterId: submitter,
func (s FeedService) GetFeedData(link string) ([]Feed, error) {
parsed, err := s.reader.ReadFeed(link, "", nil)
if err != nil {
return nil, err
}
return []Feed{
{
Id: uuid.New(),
Name: parsed.Title,
Link: link,
FaviconUrl: fmt.Sprintf("%s/favicon.ico", parsed.Link),
AddedDate: time.Now(),
},
}, nil
}
func (s FeedService) AddFeed(feed Feed) (Feed, error) {
_, err := s.database.NamedExec(
`insert into feeds (id, name, link, favicon_url, tags, submitter_id, added_date)
values (:id, :name, :link, :favicon_url, :tags, :submitter_id, :added_date)`,
feed,
`insert into feeds (id, name, link, favicon_url, tags, submitter_id, added_date, etag, last_fetch_date)
values (:id, :name, :link, :favicon_url, :tags, :submitter_id, :added_date, :etag, :last_fetch_date)`,
feed.ToDao(),
)
if err != nil {
return Feed{}, err
}
return feed.ToFeed(), nil
return feed, nil
}
func (s FeedService) ListFeeds() ([]Feed, error) {
ret := []FeedDao{}
err := s.database.Select(
&ret,
`select f.*, u.id as "submitter.id", u.name as "submitter.name", u.email as "submitter.email", u.password as "submitter.password" from feeds
as f left join users as u on u.id = f.submitter_id
`select f.*, u.id as "submitter.id", u.name as "submitter.name", u.email as "submitter.email", u.password as "submitter.password"
from feeds as f left
join users as u on u.id = f.submitter_id
order by added_date`,
)
if err != nil {

View File

@@ -19,6 +19,8 @@ services:
restart: on-failure
env_file:
- ./.env
ports:
- "5432:5432"
volumes:
- db:/var/lib/postgresql/data
- ./sql/create.sql:/docker-entrypoint-initdb.d/init.sql

View File

@@ -4,5 +4,6 @@
go
wgo
pgformatter
postgresql
];
}