feat(feeds): torznab add test button (#347)

This commit is contained in:
Ludvig Lundgren 2022-07-10 15:54:56 +02:00 committed by GitHub
parent c1df9c817f
commit ebba72ec1f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 804 additions and 186 deletions

View file

@ -11,6 +11,7 @@ import (
"github.com/autobrr/autobrr/pkg/errors"
"github.com/autobrr/autobrr/pkg/torznab"
"github.com/dcarbone/zadapters/zstdlog"
"github.com/rs/zerolog"
)
@ -20,6 +21,7 @@ type Service interface {
Find(ctx context.Context) ([]domain.Feed, error)
Store(ctx context.Context, feed *domain.Feed) error
Update(ctx context.Context, feed *domain.Feed) error
Test(ctx context.Context, feed *domain.Feed) error
ToggleEnabled(ctx context.Context, id int, enabled bool) error
Delete(ctx context.Context, id int) error
@ -199,6 +201,28 @@ func (s *service) toggleEnabled(ctx context.Context, id int, enabled bool) error
return nil
}
func (s *service) Test(ctx context.Context, feed *domain.Feed) error {
subLogger := zstdlog.NewStdLoggerWithLevel(s.log.With().Logger(), zerolog.DebugLevel)
// setup torznab Client
c := torznab.NewClient(torznab.Config{Host: feed.URL, ApiKey: feed.ApiKey, Log: subLogger})
caps, err := c.GetCaps()
if err != nil {
s.log.Error().Err(err).Msg("error testing feed")
return err
}
if caps == nil {
s.log.Error().Msg("could not test feed and get caps")
return errors.New("could not test feed and get caps")
}
s.log.Debug().Msgf("test successful - connected to feed: %+v", feed.URL)
return nil
}
func (s *service) Start() error {
// get all torznab indexer definitions
feeds, err := s.repo.Find(context.TODO())
@ -286,7 +310,7 @@ func (s *service) addTorznabJob(f feedInstance) error {
l := s.log.With().Str("feed", f.Name).Logger()
// setup torznab Client
c := torznab.NewClient(f.URL, f.ApiKey)
c := torznab.NewClient(torznab.Config{Host: f.URL, ApiKey: f.ApiKey})
// create job
job := NewTorznabJob(f.Name, f.IndexerIdentifier, l, f.URL, c, s.cacheRepo, s.releaseSvc)

View file

@ -17,7 +17,7 @@ type TorznabJob struct {
IndexerIdentifier string
Log zerolog.Logger
URL string
Client *torznab.Client
Client torznab.Client
Repo domain.FeedCacheRepo
ReleaseSvc release.Service
@ -27,7 +27,7 @@ type TorznabJob struct {
JobID int
}
func NewTorznabJob(name string, indexerIdentifier string, log zerolog.Logger, url string, client *torznab.Client, repo domain.FeedCacheRepo, releaseSvc release.Service) *TorznabJob {
func NewTorznabJob(name string, indexerIdentifier string, log zerolog.Logger, url string, client torznab.Client, repo domain.FeedCacheRepo, releaseSvc release.Service) *TorznabJob {
return &TorznabJob{
Name: name,
IndexerIdentifier: indexerIdentifier,

View file

@ -17,6 +17,7 @@ type feedService interface {
Update(ctx context.Context, feed *domain.Feed) error
Delete(ctx context.Context, id int) error
ToggleEnabled(ctx context.Context, id int, enabled bool) error
Test(ctx context.Context, feed *domain.Feed) error
}
type feedHandler struct {
@ -34,6 +35,7 @@ func newFeedHandler(encoder encoder, service feedService) *feedHandler {
func (h feedHandler) Routes(r chi.Router) {
r.Get("/", h.find)
r.Post("/", h.store)
r.Post("/test", h.test)
r.Put("/{feedID}", h.update)
r.Patch("/{feedID}/enabled", h.toggleEnabled)
r.Delete("/{feedID}", h.delete)
@ -73,6 +75,27 @@ func (h feedHandler) store(w http.ResponseWriter, r *http.Request) {
h.encoder.StatusResponse(ctx, w, data, http.StatusCreated)
}
func (h feedHandler) test(w http.ResponseWriter, r *http.Request) {
var (
ctx = r.Context()
data *domain.Feed
)
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
// encode error
h.encoder.StatusInternalError(w)
return
}
if err := h.service.Test(ctx, data); err != nil {
// encode error
h.encoder.StatusInternalError(w)
return
}
h.encoder.NoContent(w)
}
func (h feedHandler) update(w http.ResponseWriter, r *http.Request) {
var (
ctx = r.Context()