mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
fix(indexers): delete feed with indexer (#1810)
* fix(indexers): delete feed in one go * fix(indexers): sort imports * refactor(feeds): db methods for find
This commit is contained in:
parent
41216babe6
commit
40fe3e9f54
10 changed files with 167 additions and 92 deletions
|
@ -28,6 +28,92 @@ type FeedRepo struct {
|
|||
db *DB
|
||||
}
|
||||
|
||||
func (r *FeedRepo) FindOne(ctx context.Context, params domain.FindOneParams) (*domain.Feed, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select(
|
||||
"f.id",
|
||||
"i.id",
|
||||
"i.identifier",
|
||||
"i.identifier_external",
|
||||
"i.name",
|
||||
"i.use_proxy",
|
||||
"i.proxy_id",
|
||||
"f.name",
|
||||
"f.type",
|
||||
"f.enabled",
|
||||
"f.url",
|
||||
"f.interval",
|
||||
"f.timeout",
|
||||
"f.max_age",
|
||||
"f.api_key",
|
||||
"f.cookie",
|
||||
"f.settings",
|
||||
"f.created_at",
|
||||
"f.updated_at",
|
||||
"f.indexer_id",
|
||||
).
|
||||
From("feed f").
|
||||
LeftJoin("indexer i ON f.indexer_id = i.id")
|
||||
|
||||
if params.FeedID != 0 {
|
||||
queryBuilder = queryBuilder.Where(sq.Eq{"f.id": params.FeedID})
|
||||
} else if params.IndexerID != 0 {
|
||||
queryBuilder = queryBuilder.Where(sq.Eq{"f.indexer_id": params.IndexerID})
|
||||
} else if params.IndexerIdentifier != "" {
|
||||
queryBuilder = queryBuilder.Where(sq.Eq{"i.identifier": params.IndexerIdentifier})
|
||||
} else {
|
||||
return nil, errors.New("invalid params")
|
||||
}
|
||||
|
||||
query, args, err := queryBuilder.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error building query")
|
||||
}
|
||||
|
||||
row := r.db.handler.QueryRowContext(ctx, query, args...)
|
||||
if err := row.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error executing query")
|
||||
}
|
||||
|
||||
var f domain.Feed
|
||||
|
||||
var apiKey, cookie, settings sql.NullString
|
||||
var indexerID, indexerProxyID sql.NullInt64
|
||||
var indexerIdentifier, indexerIdentifierExternal, indexerName sql.NullString
|
||||
var indexerUseProxy sql.NullBool
|
||||
|
||||
if err := row.Scan(&f.ID, &indexerID, &indexerIdentifier, &indexerIdentifierExternal, &indexerName, &indexerUseProxy, &indexerProxyID, &f.Name, &f.Type, &f.Enabled, &f.URL, &f.Interval, &f.Timeout, &f.MaxAge, &apiKey, &cookie, &settings, &f.CreatedAt, &f.UpdatedAt, &f.IndexerID); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, domain.ErrRecordNotFound
|
||||
}
|
||||
|
||||
return nil, errors.Wrap(err, "error scanning row")
|
||||
}
|
||||
|
||||
if indexerID.Valid {
|
||||
f.Indexer.ID = int(indexerID.Int64)
|
||||
f.Indexer.Identifier = indexerIdentifier.String
|
||||
f.Indexer.IdentifierExternal = indexerIdentifierExternal.String
|
||||
f.Indexer.Name = indexerName.String
|
||||
f.UseProxy = indexerUseProxy.Bool
|
||||
f.ProxyID = indexerProxyID.Int64
|
||||
}
|
||||
|
||||
f.ApiKey = apiKey.String
|
||||
f.Cookie = cookie.String
|
||||
|
||||
if settings.Valid {
|
||||
var settingsJson domain.FeedSettingsJSON
|
||||
if err = json.Unmarshal([]byte(settings.String), &settingsJson); err != nil {
|
||||
return nil, errors.Wrap(err, "error unmarshal settings")
|
||||
}
|
||||
|
||||
f.Settings = &settingsJson
|
||||
}
|
||||
|
||||
return &f, nil
|
||||
}
|
||||
|
||||
func (r *FeedRepo) FindByID(ctx context.Context, id int) (*domain.Feed, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select(
|
||||
|
@ -94,70 +180,6 @@ func (r *FeedRepo) FindByID(ctx context.Context, id int) (*domain.Feed, error) {
|
|||
return &f, nil
|
||||
}
|
||||
|
||||
func (r *FeedRepo) FindByIndexerIdentifier(ctx context.Context, indexer string) (*domain.Feed, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select(
|
||||
"f.id",
|
||||
"i.id",
|
||||
"i.identifier",
|
||||
"i.identifier_external",
|
||||
"i.name",
|
||||
"i.use_proxy",
|
||||
"i.proxy_id",
|
||||
"f.name",
|
||||
"f.type",
|
||||
"f.enabled",
|
||||
"f.url",
|
||||
"f.interval",
|
||||
"f.timeout",
|
||||
"f.max_age",
|
||||
"f.api_key",
|
||||
"f.cookie",
|
||||
"f.settings",
|
||||
"f.created_at",
|
||||
"f.updated_at",
|
||||
).
|
||||
From("feed f").
|
||||
Join("indexer i ON f.indexer_id = i.id").
|
||||
Where(sq.Eq{"i.name": indexer})
|
||||
|
||||
query, args, err := queryBuilder.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error building query")
|
||||
}
|
||||
|
||||
row := r.db.handler.QueryRowContext(ctx, query, args...)
|
||||
if err := row.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error executing query")
|
||||
}
|
||||
|
||||
var f domain.Feed
|
||||
|
||||
var apiKey, cookie, settings sql.NullString
|
||||
var proxyID sql.NullInt64
|
||||
|
||||
if err := row.Scan(&f.ID, &f.Indexer.ID, &f.Indexer.Identifier, &f.Indexer.IdentifierExternal, &f.Indexer.Name, &f.UseProxy, &proxyID, &f.Name, &f.Type, &f.Enabled, &f.URL, &f.Interval, &f.Timeout, &f.MaxAge, &apiKey, &cookie, &settings, &f.CreatedAt, &f.UpdatedAt); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, domain.ErrRecordNotFound
|
||||
}
|
||||
|
||||
return nil, errors.Wrap(err, "error scanning row")
|
||||
}
|
||||
|
||||
f.ProxyID = proxyID.Int64
|
||||
f.ApiKey = apiKey.String
|
||||
f.Cookie = cookie.String
|
||||
|
||||
var settingsJson domain.FeedSettingsJSON
|
||||
if err = json.Unmarshal([]byte(settings.String), &settingsJson); err != nil {
|
||||
return nil, errors.Wrap(err, "error unmarshal settings")
|
||||
}
|
||||
|
||||
f.Settings = &settingsJson
|
||||
|
||||
return &f, nil
|
||||
}
|
||||
|
||||
func (r *FeedRepo) Find(ctx context.Context) ([]domain.Feed, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select(
|
||||
|
|
|
@ -205,7 +205,7 @@ func TestFeedRepo_FindByID(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestFeedRepo_FindByIndexerIdentifier(t *testing.T) {
|
||||
func TestFeedRepo_FindOne(t *testing.T) {
|
||||
for dbType, db := range testDBs {
|
||||
log := setupLoggerForTest()
|
||||
repo := NewFeedRepo(log, db)
|
||||
|
@ -222,7 +222,7 @@ func TestFeedRepo_FindByIndexerIdentifier(t *testing.T) {
|
|||
assert.NoError(t, err)
|
||||
|
||||
// Execute
|
||||
feed, err := repo.FindByIndexerIdentifier(context.Background(), indexer.Identifier)
|
||||
feed, err := repo.FindOne(context.Background(), domain.FindOneParams{IndexerIdentifier: indexer.Identifier})
|
||||
assert.NoError(t, err)
|
||||
|
||||
// Verify
|
||||
|
@ -240,7 +240,7 @@ func TestFeedRepo_FindByIndexerIdentifier(t *testing.T) {
|
|||
|
||||
t.Run(fmt.Sprintf("FindByIndexerIdentifier_Fails_Wrong_Identifier [%s]", dbType), func(t *testing.T) {
|
||||
// Execute
|
||||
feed, err := repo.FindByIndexerIdentifier(context.Background(), "wrong-identifier")
|
||||
feed, err := repo.FindOne(context.Background(), domain.FindOneParams{IndexerIdentifier: "wrong-identifier"})
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, feed)
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue