feat: implements sync command
This commit is contained in:
parent
a77d4f9604
commit
5a4a4d387a
4 changed files with 197 additions and 10 deletions
101
internal/feed.go
101
internal/feed.go
|
|
@ -5,6 +5,8 @@ import (
|
|||
"freed/internal/database"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/mmcdole/gofeed"
|
||||
"github.com/pterm/pterm"
|
||||
|
|
@ -31,18 +33,21 @@ func AddFeed(feedUrl string) (string, int, error) {
|
|||
return "", 0, err
|
||||
}
|
||||
|
||||
// TODO: Make the amount of articles configurable
|
||||
articles := make([]database.Article, 0, 10)
|
||||
|
||||
for i, v := range feed.Items {
|
||||
if i < 10 {
|
||||
a := database.Article{
|
||||
Name: v.Title,
|
||||
Url: v.Link,
|
||||
FeedId: feedId,
|
||||
}
|
||||
|
||||
articles = append(articles, a)
|
||||
if i > 10 {
|
||||
continue
|
||||
}
|
||||
|
||||
a := database.Article{
|
||||
Name: v.Title,
|
||||
Url: v.Link,
|
||||
FeedId: feedId,
|
||||
}
|
||||
|
||||
articles = append(articles, a)
|
||||
}
|
||||
|
||||
if err := database.InsertMultipleArticles(articles); err != nil {
|
||||
|
|
@ -80,6 +85,86 @@ func GetAllFeedsAsTable() (pterm.TableData, error) {
|
|||
return tableData, nil
|
||||
}
|
||||
|
||||
func SyncFeeds() error {
|
||||
now := time.Now()
|
||||
startOfToday := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
||||
feeds, err := database.FindAllFeeds()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var syncWg sync.WaitGroup
|
||||
errChannel := make(chan error, len(*feeds))
|
||||
|
||||
for _, feed := range *feeds {
|
||||
syncWg.Add(1)
|
||||
go syncFeed(feed, startOfToday, &syncWg, errChannel)
|
||||
}
|
||||
|
||||
syncWg.Wait()
|
||||
close(errChannel)
|
||||
|
||||
var errors []error
|
||||
|
||||
for err := range errChannel {
|
||||
errors = append(errors, err)
|
||||
}
|
||||
|
||||
if len(errors) > 0 {
|
||||
compositeErrMsg := fmt.Sprintf("Encountered %d errors:\n", len(errors))
|
||||
|
||||
for _, err := range errors {
|
||||
compositeErrMsg = compositeErrMsg + " " + fmt.Sprintf("- %v\n", err)
|
||||
}
|
||||
|
||||
return fmt.Errorf(compositeErrMsg)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncFeed(
|
||||
feed database.Feed,
|
||||
syncBefore time.Time,
|
||||
wg *sync.WaitGroup,
|
||||
errorChannel chan<- error,
|
||||
) {
|
||||
defer wg.Done()
|
||||
|
||||
if feed.LastSyncedAt.After(syncBefore) {
|
||||
return
|
||||
}
|
||||
|
||||
gFeed, err := parseByUrl(feed.Url)
|
||||
|
||||
if err != nil {
|
||||
errorChannel <- err
|
||||
return
|
||||
}
|
||||
|
||||
var articles []database.Article
|
||||
|
||||
for _, item := range gFeed.Items {
|
||||
if item.PublishedParsed.Before(*feed.LastSyncedAt) {
|
||||
continue
|
||||
}
|
||||
|
||||
article := database.Article{
|
||||
Name: item.Title,
|
||||
Url: item.Link,
|
||||
FeedId: feed.ID,
|
||||
}
|
||||
|
||||
articles = append(articles, article)
|
||||
}
|
||||
|
||||
if err := database.InsertIgnoreMultipleArticles(articles); err != nil {
|
||||
errorChannel <- err
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func parseByUrl(u string) (*gofeed.Feed, error) {
|
||||
fp := gofeed.NewParser()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue