diff --git a/internal/database/indexer.go b/internal/database/indexer.go index 00ac82d..08c9e75 100644 --- a/internal/database/indexer.go +++ b/internal/database/indexer.go @@ -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 } diff --git a/internal/domain/indexer.go b/internal/domain/indexer.go index 9da1751..1659f04 100644 --- a/internal/domain/indexer.go +++ b/internal/domain/indexer.go @@ -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 { diff --git a/internal/http/indexer.go b/internal/http/indexer.go index 7ac5be9..8b3f0ab 100644 --- a/internal/http/indexer.go +++ b/internal/http/indexer.go @@ -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) diff --git a/internal/indexer/service.go b/internal/indexer/service.go index 26466a7..826f676 100644 --- a/internal/indexer/service.go +++ b/internal/indexer/service.go @@ -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 {