mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 00:39:13 +00:00
feat: add support for proxies to use with IRC and Indexers (#1421)
* feat: add support for proxies * fix(http): release handler * fix(migrations): define proxy early * fix(migrations): pg proxy * fix(proxy): list update delete * fix(proxy): remove log and imports * feat(irc): use proxy * feat(irc): tests * fix(web): update imports for ProxyForms.tsx * fix(database): migration * feat(proxy): test * feat(proxy): validate proxy type * feat(proxy): validate and test * feat(proxy): improve validate and test * feat(proxy): fix db schema * feat(proxy): add db tests * feat(proxy): handle http errors * fix(http): imports * feat(proxy): use proxy for indexer downloads * feat(proxy): indexerforms select proxy * feat(proxy): handle torrent download * feat(proxy): skip if disabled * feat(proxy): imports * feat(proxy): implement in Feeds * feat(proxy): update helper text indexer proxy * feat(proxy): add internal cache
This commit is contained in:
parent
472d327308
commit
bc0f4cc055
59 changed files with 2533 additions and 371 deletions
|
@ -36,8 +36,8 @@ func (r *IndexerRepo) Store(ctx context.Context, indexer domain.Indexer) (*domai
|
|||
}
|
||||
|
||||
queryBuilder := r.db.squirrel.
|
||||
Insert("indexer").Columns("enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "settings").
|
||||
Values(indexer.Enabled, indexer.Name, indexer.Identifier, indexer.IdentifierExternal, indexer.Implementation, indexer.BaseURL, settings).
|
||||
Insert("indexer").Columns("enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "use_proxy", "proxy_id", "settings").
|
||||
Values(indexer.Enabled, indexer.Name, indexer.Identifier, indexer.IdentifierExternal, indexer.Implementation, indexer.BaseURL, indexer.UseProxy, toNullInt64(indexer.ProxyID), settings).
|
||||
Suffix("RETURNING id").RunWith(r.db.handler)
|
||||
|
||||
// return values
|
||||
|
@ -61,6 +61,8 @@ func (r *IndexerRepo) Update(ctx context.Context, indexer domain.Indexer) (*doma
|
|||
Set("name", indexer.Name).
|
||||
Set("identifier_external", indexer.IdentifierExternal).
|
||||
Set("base_url", indexer.BaseURL).
|
||||
Set("use_proxy", indexer.UseProxy).
|
||||
Set("proxy_id", toNullInt64(indexer.ProxyID)).
|
||||
Set("settings", settings).
|
||||
Set("updated_at", time.Now().Format(time.RFC3339)).
|
||||
Where(sq.Eq{"id": indexer.ID})
|
||||
|
@ -70,16 +72,26 @@ func (r *IndexerRepo) Update(ctx context.Context, indexer domain.Indexer) (*doma
|
|||
return nil, errors.Wrap(err, "error building query")
|
||||
}
|
||||
|
||||
if _, err = r.db.handler.ExecContext(ctx, query, args...); err != nil {
|
||||
result, err := r.db.handler.ExecContext(ctx, query, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error executing query")
|
||||
}
|
||||
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error rows affected")
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return nil, domain.ErrUpdateFailed
|
||||
}
|
||||
|
||||
return &indexer, nil
|
||||
}
|
||||
|
||||
func (r *IndexerRepo) List(ctx context.Context) ([]domain.Indexer, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "settings").
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "use_proxy", "proxy_id", "settings").
|
||||
From("indexer").
|
||||
OrderBy("name ASC")
|
||||
|
||||
|
@ -98,27 +110,29 @@ func (r *IndexerRepo) List(ctx context.Context) ([]domain.Indexer, error) {
|
|||
indexers := make([]domain.Indexer, 0)
|
||||
|
||||
for rows.Next() {
|
||||
var f domain.Indexer
|
||||
var i domain.Indexer
|
||||
|
||||
var identifierExternal, implementation, baseURL sql.Null[string]
|
||||
var proxyID sql.Null[int64]
|
||||
var settings string
|
||||
var settingsMap map[string]string
|
||||
|
||||
if err := rows.Scan(&f.ID, &f.Enabled, &f.Name, &f.Identifier, &identifierExternal, &implementation, &baseURL, &settings); err != nil {
|
||||
if err := rows.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &implementation, &baseURL, &i.UseProxy, &proxyID, &settings); err != nil {
|
||||
return nil, errors.Wrap(err, "error scanning row")
|
||||
}
|
||||
|
||||
f.IdentifierExternal = identifierExternal.V
|
||||
f.Implementation = implementation.V
|
||||
f.BaseURL = baseURL.V
|
||||
i.IdentifierExternal = identifierExternal.V
|
||||
i.Implementation = implementation.V
|
||||
i.BaseURL = baseURL.V
|
||||
i.ProxyID = proxyID.V
|
||||
|
||||
if err = json.Unmarshal([]byte(settings), &settingsMap); err != nil {
|
||||
return nil, errors.Wrap(err, "error unmarshal settings")
|
||||
}
|
||||
|
||||
f.Settings = settingsMap
|
||||
i.Settings = settingsMap
|
||||
|
||||
indexers = append(indexers, f)
|
||||
indexers = append(indexers, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error rows")
|
||||
|
@ -129,7 +143,7 @@ func (r *IndexerRepo) List(ctx context.Context) ([]domain.Indexer, error) {
|
|||
|
||||
func (r *IndexerRepo) FindByID(ctx context.Context, id int) (*domain.Indexer, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "settings").
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "use_proxy", "proxy_id", "settings").
|
||||
From("indexer").
|
||||
Where(sq.Eq{"id": id})
|
||||
|
||||
|
@ -146,8 +160,9 @@ func (r *IndexerRepo) FindByID(ctx context.Context, id int) (*domain.Indexer, er
|
|||
var i domain.Indexer
|
||||
|
||||
var identifierExternal, implementation, baseURL, settings sql.Null[string]
|
||||
var proxyID sql.Null[int64]
|
||||
|
||||
if err := row.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &implementation, &baseURL, &settings); err != nil {
|
||||
if err := row.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &implementation, &baseURL, &i.UseProxy, &proxyID, &settings); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, domain.ErrRecordNotFound
|
||||
}
|
||||
|
@ -158,6 +173,7 @@ func (r *IndexerRepo) FindByID(ctx context.Context, id int) (*domain.Indexer, er
|
|||
i.IdentifierExternal = identifierExternal.V
|
||||
i.Implementation = implementation.V
|
||||
i.BaseURL = baseURL.V
|
||||
i.ProxyID = proxyID.V
|
||||
|
||||
var settingsMap map[string]string
|
||||
if err = json.Unmarshal([]byte(settings.V), &settingsMap); err != nil {
|
||||
|
@ -171,7 +187,7 @@ func (r *IndexerRepo) FindByID(ctx context.Context, id int) (*domain.Indexer, er
|
|||
|
||||
func (r *IndexerRepo) GetBy(ctx context.Context, req domain.GetIndexerRequest) (*domain.Indexer, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "settings").
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "implementation", "base_url", "use_proxy", "proxy_id", "settings").
|
||||
From("indexer")
|
||||
|
||||
if req.ID > 0 {
|
||||
|
@ -195,8 +211,9 @@ func (r *IndexerRepo) GetBy(ctx context.Context, req domain.GetIndexerRequest) (
|
|||
var i domain.Indexer
|
||||
|
||||
var identifierExternal, implementation, baseURL, settings sql.Null[string]
|
||||
var proxyID sql.Null[int64]
|
||||
|
||||
if err := row.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &implementation, &baseURL, &settings); err != nil {
|
||||
if err := row.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &implementation, &baseURL, &i.UseProxy, &proxyID, &settings); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, domain.ErrRecordNotFound
|
||||
}
|
||||
|
@ -207,6 +224,7 @@ func (r *IndexerRepo) GetBy(ctx context.Context, req domain.GetIndexerRequest) (
|
|||
i.IdentifierExternal = identifierExternal.V
|
||||
i.Implementation = implementation.V
|
||||
i.BaseURL = baseURL.V
|
||||
i.ProxyID = proxyID.V
|
||||
|
||||
var settingsMap map[string]string
|
||||
if err = json.Unmarshal([]byte(settings.V), &settingsMap); err != nil {
|
||||
|
@ -220,7 +238,7 @@ func (r *IndexerRepo) GetBy(ctx context.Context, req domain.GetIndexerRequest) (
|
|||
|
||||
func (r *IndexerRepo) FindByFilterID(ctx context.Context, id int) ([]domain.Indexer, error) {
|
||||
queryBuilder := r.db.squirrel.
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "base_url", "settings").
|
||||
Select("id", "enabled", "name", "identifier", "identifier_external", "base_url", "use_proxy", "proxy_id", "settings").
|
||||
From("indexer").
|
||||
Join("filter_indexer ON indexer.id = filter_indexer.indexer_id").
|
||||
Where(sq.Eq{"filter_indexer.filter_id": id})
|
||||
|
@ -239,13 +257,14 @@ func (r *IndexerRepo) FindByFilterID(ctx context.Context, id int) ([]domain.Inde
|
|||
|
||||
indexers := make([]domain.Indexer, 0)
|
||||
for rows.Next() {
|
||||
var f domain.Indexer
|
||||
var i domain.Indexer
|
||||
|
||||
var settings string
|
||||
var settingsMap map[string]string
|
||||
var identifierExternal, baseURL sql.Null[string]
|
||||
var proxyID sql.Null[int64]
|
||||
|
||||
if err := rows.Scan(&f.ID, &f.Enabled, &f.Name, &f.Identifier, &identifierExternal, &baseURL, &settings); err != nil {
|
||||
if err := rows.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &identifierExternal, &baseURL, &i.UseProxy, &proxyID, &settings); err != nil {
|
||||
return nil, errors.Wrap(err, "error scanning row")
|
||||
}
|
||||
|
||||
|
@ -253,11 +272,12 @@ func (r *IndexerRepo) FindByFilterID(ctx context.Context, id int) ([]domain.Inde
|
|||
return nil, errors.Wrap(err, "error unmarshal settings")
|
||||
}
|
||||
|
||||
f.IdentifierExternal = identifierExternal.V
|
||||
f.BaseURL = baseURL.V
|
||||
f.Settings = settingsMap
|
||||
i.IdentifierExternal = identifierExternal.V
|
||||
i.BaseURL = baseURL.V
|
||||
i.ProxyID = proxyID.V
|
||||
i.Settings = settingsMap
|
||||
|
||||
indexers = append(indexers, f)
|
||||
indexers = append(indexers, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error rows")
|
||||
|
@ -282,13 +302,13 @@ func (r *IndexerRepo) Delete(ctx context.Context, id int) error {
|
|||
return errors.Wrap(err, "error executing query")
|
||||
}
|
||||
|
||||
rows, err := result.RowsAffected()
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error rows affected")
|
||||
}
|
||||
|
||||
if rows != 1 {
|
||||
return errors.New("error deleting row")
|
||||
if rowsAffected == 0 {
|
||||
return domain.ErrRecordNotFound
|
||||
}
|
||||
|
||||
r.log.Debug().Str("method", "delete").Msgf("successfully deleted indexer with id %v", id)
|
||||
|
@ -297,8 +317,6 @@ func (r *IndexerRepo) Delete(ctx context.Context, id int) error {
|
|||
}
|
||||
|
||||
func (r *IndexerRepo) ToggleEnabled(ctx context.Context, indexerID int, enabled bool) error {
|
||||
var err error
|
||||
|
||||
queryBuilder := r.db.squirrel.
|
||||
Update("indexer").
|
||||
Set("enabled", enabled).
|
||||
|
@ -310,10 +328,19 @@ func (r *IndexerRepo) ToggleEnabled(ctx context.Context, indexerID int, enabled
|
|||
return errors.Wrap(err, "error building query")
|
||||
}
|
||||
|
||||
_, err = r.db.handler.ExecContext(ctx, query, args...)
|
||||
result, err := r.db.handler.ExecContext(ctx, query, args...)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error executing query")
|
||||
}
|
||||
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error rows affected")
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return domain.ErrUpdateFailed
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue