fix(indexers): delete and clean (#343)

This commit is contained in:
Ludvig Lundgren 2022-07-07 18:31:42 +02:00 committed by GitHub
parent 652bd8f6f3
commit 33e3691737
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 14 deletions

View file

@ -20,7 +20,7 @@ type IndexerRepo struct {
func NewIndexerRepo(log logger.Logger, db *DB) domain.IndexerRepo {
return &IndexerRepo{
log: log.With().Str("repo", "indexer").Logger(),
log: log.With().Str("module", "database").Str("repo", "indexer").Logger(),
db: db,
}
}
@ -114,6 +114,43 @@ func (r *IndexerRepo) List(ctx context.Context) ([]domain.Indexer, error) {
return indexers, nil
}
func (r *IndexerRepo) FindByID(ctx context.Context, id int) (*domain.Indexer, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "identifier", "implementation", "settings").
From("indexer").
Where("id = ?", id)
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 i domain.Indexer
var implementation, settings sql.NullString
if err := row.Scan(&i.ID, &i.Enabled, &i.Name, &i.Identifier, &implementation, &settings); err != nil {
return nil, errors.Wrap(err, "error scanning row")
}
i.Implementation = implementation.String
var settingsMap map[string]string
if err = json.Unmarshal([]byte(settings.String), &settingsMap); err != nil {
return nil, errors.Wrap(err, "error unmarshal settings")
}
i.Settings = settingsMap
return &i, nil
}
func (r *IndexerRepo) FindByFilterID(ctx context.Context, id int) ([]domain.Indexer, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "identifier", "settings").
@ -171,12 +208,21 @@ func (r *IndexerRepo) Delete(ctx context.Context, id int) error {
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")
}
r.log.Debug().Msgf("indexer.delete: id %v", id)
rows, err := result.RowsAffected()
if err != nil {
return errors.Wrap(err, "error rows affected")
}
if rows != 1 {
return errors.New("error deleting row")
}
r.log.Debug().Str("method", "delete").Msgf("successfully deleted indexer with id %v", id)
return nil
}

View file

@ -16,6 +16,7 @@ type IndexerRepo interface {
List(ctx context.Context) ([]Indexer, error)
Delete(ctx context.Context, id int) error
FindByFilterID(ctx context.Context, id int) ([]Indexer, error)
FindByID(ctx context.Context, id int) (*Indexer, error)
}
type Indexer struct {

View file

@ -48,7 +48,8 @@ func (h indexerHandler) getSchema(w http.ResponseWriter, r *http.Request) {
indexers, err := h.service.GetTemplates()
if err != nil {
//
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, indexers, http.StatusOK)
@ -66,8 +67,7 @@ func (h indexerHandler) store(w http.ResponseWriter, r *http.Request) {
indexer, err := h.service.Store(ctx, data)
if err != nil {
//
h.encoder.StatusResponse(ctx, w, nil, http.StatusBadRequest)
h.encoder.Error(w, err)
return
}
@ -86,7 +86,8 @@ func (h indexerHandler) update(w http.ResponseWriter, r *http.Request) {
indexer, err := h.service.Update(ctx, data)
if err != nil {
//
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, indexer, http.StatusOK)
@ -101,7 +102,8 @@ func (h indexerHandler) delete(w http.ResponseWriter, r *http.Request) {
id, _ := strconv.Atoi(idParam)
if err := h.service.Delete(ctx, id); err != nil {
// return err
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, nil, http.StatusNoContent)
@ -112,7 +114,8 @@ func (h indexerHandler) getAll(w http.ResponseWriter, r *http.Request) {
indexers, err := h.service.GetAll()
if err != nil {
//
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, indexers, http.StatusOK)
@ -123,7 +126,8 @@ func (h indexerHandler) list(w http.ResponseWriter, r *http.Request) {
indexers, err := h.service.List(ctx)
if err != nil {
//
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, indexers, http.StatusOK)

View file

@ -24,6 +24,7 @@ type Service interface {
Update(ctx context.Context, indexer domain.Indexer) (*domain.Indexer, error)
Delete(ctx context.Context, id int) error
FindByFilterID(ctx context.Context, id int) ([]domain.Indexer, error)
FindByID(ctx context.Context, id int) (*domain.Indexer, error)
List(ctx context.Context) ([]domain.Indexer, error)
GetAll() ([]*domain.IndexerDefinition, error)
GetTemplates() ([]domain.IndexerDefinition, error)
@ -115,13 +116,18 @@ func (s *service) Update(ctx context.Context, indexer domain.Indexer) (*domain.I
}
func (s *service) Delete(ctx context.Context, id int) error {
indexer, err := s.repo.FindByID(ctx, id)
if err != nil {
return err
}
if err := s.repo.Delete(ctx, id); err != nil {
s.log.Error().Err(err).Msgf("could not delete indexer by id: %v", id)
return err
}
// TODO remove handler if needed
// remove from lookup tables
s.removeIndexer(*indexer)
return nil
}
@ -136,6 +142,16 @@ func (s *service) FindByFilterID(ctx context.Context, id int) ([]domain.Indexer,
return indexers, err
}
func (s *service) FindByID(ctx context.Context, id int) (*domain.Indexer, error) {
indexers, err := s.repo.FindByID(ctx, id)
if err != nil {
s.log.Error().Err(err).Msgf("could not find indexer by id: %v", id)
return nil, err
}
return indexers, err
}
func (s *service) List(ctx context.Context) ([]domain.Indexer, error) {
indexers, err := s.repo.List(ctx)
if err != nil {
@ -321,10 +337,16 @@ func (s *service) Start() error {
return nil
}
func (s *service) removeIndexer(indexer domain.Indexer) error {
delete(s.definitions, indexer.Identifier)
func (s *service) removeIndexer(indexer domain.Indexer) {
// remove Torznab
if indexer.Implementation == "torznab" {
delete(s.torznabIndexers, indexer.Identifier)
}
return nil
// remove mapped definition
delete(s.mappedDefinitions, indexer.Identifier)
return
}
func (s *service) addIndexer(indexer domain.Indexer) error {