Fix key not found error #120

This commit is contained in:
Maksym Pavlenko
2020-04-16 15:14:46 -07:00
parent 40dd2f5779
commit 67478ac9f4
9 changed files with 51 additions and 39 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ func main() {
if err := updater.Update(ctx, feed); err != nil {
log.WithError(err).Errorf("failed to update feed: %s", feed.URL)
} else {
log.Infof("Next update of %s: %s", feed.ID, c.Entry(m[feed.ID]).Next)
log.Infof("next update of %s: %s", feed.ID, c.Entry(m[feed.ID]).Next)
}
case <-ctx.Done():
return ctx.Err()
+4 -5
View File
@@ -52,19 +52,19 @@ func (u *Updater) Update(ctx context.Context, feedConfig *config.Feed) error {
started := time.Now()
if err := u.updateFeed(ctx, feedConfig); err != nil {
return err
return errors.Wrap(err, "update failed")
}
if err := u.downloadEpisodes(ctx, feedConfig); err != nil {
return err
return errors.Wrap(err, "download failed")
}
if err := u.buildXML(ctx, feedConfig); err != nil {
return err
return errors.Wrap(err, "xml build failed")
}
if err := u.buildOPML(ctx); err != nil {
return err
return errors.Wrap(err, "opml build failed")
}
if err := u.cleanup(ctx, feedConfig); err != nil {
@@ -263,7 +263,6 @@ func (u *Updater) buildXML(ctx context.Context, feedConfig *config.Feed) error {
}
func (u *Updater) buildOPML(ctx context.Context) error {
// Build OPML with data received from builder
log.Debug("building podcast OPML")
opml, err := feed.BuildOPML(ctx, u.config, u.db, u.fs)
+7 -3
View File
@@ -60,7 +60,7 @@ func NewBadger(config *config.Database) (*Badger, error) {
storage := &Badger{db: db}
if err := db.Update(func(txn *badger.Txn) error {
if err := storage.setObj(txn, []byte(versionPath), CurrentVersion, false); err != nil && err != ErrAlreadyExists {
if err := storage.setObj(txn, []byte(versionPath), CurrentVersion, false); err != nil && err != model.ErrAlreadyExists {
return err
}
return nil
@@ -100,7 +100,7 @@ func (b *Badger) AddFeed(_ context.Context, feedID string, feed *model.Feed) err
for _, episode := range feed.Episodes {
episodeKey := b.getKey(episodePath, feedID, episode.ID)
err := b.setObj(txn, episodeKey, episode, false)
if err == nil || err == ErrAlreadyExists {
if err == nil || err == model.ErrAlreadyExists {
// Do nothing
} else {
return errors.Wrapf(err, "failed to save episode %q", feedID)
@@ -261,7 +261,7 @@ func (b *Badger) setObj(txn *badger.Txn, key []byte, obj interface{}, overwrite
// Overwrites are not allowed, make sure there is no object with the given key
_, err := txn.Get(key)
if err == nil {
return ErrAlreadyExists
return model.ErrAlreadyExists
} else if err == badger.ErrKeyNotFound {
// Key not found, do nothing
} else {
@@ -280,6 +280,10 @@ func (b *Badger) setObj(txn *badger.Txn, key []byte, obj interface{}, overwrite
func (b *Badger) getObj(txn *badger.Txn, key []byte, out interface{}) error {
item, err := txn.Get(key)
if err != nil {
if err == badger.ErrKeyNotFound {
return model.ErrNotFound
}
return err
}
-5
View File
@@ -2,7 +2,6 @@ package db
import (
"context"
"errors"
"github.com/mxpv/podsync/pkg/model"
)
@@ -13,10 +12,6 @@ const (
CurrentVersion = 1
)
var (
ErrAlreadyExists = errors.New("object already exists")
)
type Storage interface {
Close() error
Version() (int, error)
-5
View File
@@ -10,11 +10,6 @@ import (
"github.com/mxpv/podsync/pkg/model"
)
var (
ErrNotFound = errors.New("resource not found")
ErrQuotaExceeded = errors.New("query limit is exceeded")
)
type Builder interface {
Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error)
}
+23 -15
View File
@@ -6,8 +6,10 @@ import (
"github.com/gilliek/go-opml/opml"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/mxpv/podsync/pkg/config"
"github.com/mxpv/podsync/pkg/model"
)
func BuildOPML(ctx context.Context, config *config.Config, db feedProvider, provider urlProvider) (string, error) {
@@ -17,25 +19,31 @@ func BuildOPML(ctx context.Context, config *config.Config, db feedProvider, prov
for _, feed := range config.Feeds {
f, err := db.GetFeed(ctx, feed.ID)
if err == model.ErrNotFound {
// As we update OPML on per-feed basis, some feeds may not yet be populated in database.
log.Debugf("can't find configuration for feed %q, ignoring opml", feed.ID)
continue
} else if err != nil {
return "", errors.Wrapf(err, "failed to query feed %q", feed.ID)
}
if !feed.OPML {
continue
}
downloadURL, err := provider.URL(ctx, "", fmt.Sprintf("%s.xml", feed.ID))
if err != nil {
return "", err
return "", errors.Wrapf(err, "failed to get feed URL for %q", feed.ID)
}
if feed.OPML {
downloadURL, err := provider.URL(ctx, "", fmt.Sprintf("%s.xml", feed.ID))
if err != nil {
return "", errors.Wrapf(err, "failed to get feed URL for %q", feed.ID)
}
outline := opml.Outline{
Title: f.Title,
Text: f.Description,
Type: "rss",
XMLURL: downloadURL,
}
doc.Body.Outlines = append(doc.Body.Outlines, outline)
outline := opml.Outline{
Title: f.Title,
Text: f.Description,
Type: "rss",
XMLURL: downloadURL,
}
doc.Body.Outlines = append(doc.Body.Outlines, outline)
}
out, err := doc.XML()
+3 -3
View File
@@ -41,7 +41,7 @@ func (v *VimeoBuilder) queryChannel(feed *model.Feed) error {
ch, resp, err := v.client.Channels.Get(channelID)
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
return ErrNotFound
return model.ErrNotFound
}
return errors.Wrapf(err, "failed to query channel with id %q", channelID)
@@ -64,7 +64,7 @@ func (v *VimeoBuilder) queryGroup(feed *model.Feed) error {
gr, resp, err := v.client.Groups.Get(groupID)
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
return ErrNotFound
return model.ErrNotFound
}
return errors.Wrapf(err, "failed to query group with id %q", groupID)
@@ -87,7 +87,7 @@ func (v *VimeoBuilder) queryUser(feed *model.Feed) error {
user, resp, err := v.client.Users.Get(userID)
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
return ErrNotFound
return model.ErrNotFound
}
return errors.Wrapf(err, "failed to query user with id %q", userID)
+2 -2
View File
@@ -57,7 +57,7 @@ func (yt *YouTubeBuilder) listChannels(ctx context.Context, linkType link.Type,
}
if len(resp.Items) == 0 {
return nil, ErrNotFound
return nil, model.ErrNotFound
}
item := resp.Items[0]
@@ -81,7 +81,7 @@ func (yt *YouTubeBuilder) listPlaylists(ctx context.Context, id, channelID strin
}
if len(resp.Items) == 0 {
return nil, ErrNotFound
return nil, model.ErrNotFound
}
item := resp.Items[0]
+11
View File
@@ -0,0 +1,11 @@
package model
import (
"errors"
)
var (
ErrAlreadyExists = errors.New("object already exists")
ErrNotFound = errors.New("not found")
ErrQuotaExceeded = errors.New("query limit is exceeded")
)