mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 16:59:12 +00:00
fix: filter list toggle (#55)
This commit is contained in:
parent
e1ef47e09a
commit
48155e5f82
6 changed files with 73 additions and 2 deletions
|
@ -390,6 +390,25 @@ func (r *FilterRepo) Update(ctx context.Context, filter domain.Filter) (*domain.
|
||||||
return &filter, nil
|
return &filter, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *FilterRepo) ToggleEnabled(ctx context.Context, filterID int, enabled bool) error {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
_, err = r.db.ExecContext(ctx, `
|
||||||
|
UPDATE filter SET
|
||||||
|
enabled = ?,
|
||||||
|
updated_at = CURRENT_TIMESTAMP
|
||||||
|
WHERE id = ?`,
|
||||||
|
enabled,
|
||||||
|
filterID,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Stack().Err(err).Msg("error executing query")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *FilterRepo) StoreIndexerConnections(ctx context.Context, filterID int, indexers []domain.Indexer) error {
|
func (r *FilterRepo) StoreIndexerConnections(ctx context.Context, filterID int, indexers []domain.Indexer) error {
|
||||||
|
|
||||||
tx, err := r.db.BeginTx(ctx, nil)
|
tx, err := r.db.BeginTx(ctx, nil)
|
||||||
|
|
|
@ -17,6 +17,7 @@ type FilterRepo interface {
|
||||||
ListFilters() ([]Filter, error)
|
ListFilters() ([]Filter, error)
|
||||||
Store(filter Filter) (*Filter, error)
|
Store(filter Filter) (*Filter, error)
|
||||||
Update(ctx context.Context, filter Filter) (*Filter, error)
|
Update(ctx context.Context, filter Filter) (*Filter, error)
|
||||||
|
ToggleEnabled(ctx context.Context, filterID int, enabled bool) error
|
||||||
Delete(ctx context.Context, filterID int) error
|
Delete(ctx context.Context, filterID int) error
|
||||||
StoreIndexerConnection(ctx context.Context, filterID int, indexerID int) error
|
StoreIndexerConnection(ctx context.Context, filterID int, indexerID int) error
|
||||||
StoreIndexerConnections(ctx context.Context, filterID int, indexers []Indexer) error
|
StoreIndexerConnections(ctx context.Context, filterID int, indexers []Indexer) error
|
||||||
|
|
|
@ -17,6 +17,7 @@ type Service interface {
|
||||||
ListFilters() ([]domain.Filter, error)
|
ListFilters() ([]domain.Filter, error)
|
||||||
Store(filter domain.Filter) (*domain.Filter, error)
|
Store(filter domain.Filter) (*domain.Filter, error)
|
||||||
Update(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
|
Update(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
|
||||||
|
ToggleEnabled(ctx context.Context, filterID int, enabled bool) error
|
||||||
Delete(ctx context.Context, filterID int) error
|
Delete(ctx context.Context, filterID int) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,6 +137,17 @@ func (s *service) Update(ctx context.Context, filter domain.Filter) (*domain.Fil
|
||||||
return f, nil
|
return f, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *service) ToggleEnabled(ctx context.Context, filterID int, enabled bool) error {
|
||||||
|
if err := s.repo.ToggleEnabled(ctx, filterID, enabled); err != nil {
|
||||||
|
log.Error().Err(err).Msg("could not update filter enabled")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug().Msgf("filter.toggle_enabled: update filter '%v' to '%v'", filterID, enabled)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *service) Delete(ctx context.Context, filterID int) error {
|
func (s *service) Delete(ctx context.Context, filterID int) error {
|
||||||
if filterID == 0 {
|
if filterID == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -17,6 +17,7 @@ type filterService interface {
|
||||||
Store(filter domain.Filter) (*domain.Filter, error)
|
Store(filter domain.Filter) (*domain.Filter, error)
|
||||||
Delete(ctx context.Context, filterID int) error
|
Delete(ctx context.Context, filterID int) error
|
||||||
Update(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
|
Update(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
|
||||||
|
ToggleEnabled(ctx context.Context, filterID int, enabled bool) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type filterHandler struct {
|
type filterHandler struct {
|
||||||
|
@ -36,6 +37,7 @@ func (h filterHandler) Routes(r chi.Router) {
|
||||||
r.Get("/{filterID}", h.getByID)
|
r.Get("/{filterID}", h.getByID)
|
||||||
r.Post("/", h.store)
|
r.Post("/", h.store)
|
||||||
r.Put("/{filterID}", h.update)
|
r.Put("/{filterID}", h.update)
|
||||||
|
r.Put("/{filterID}/enabled", h.toggleEnabled)
|
||||||
r.Delete("/{filterID}", h.delete)
|
r.Delete("/{filterID}", h.delete)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +125,31 @@ func (h filterHandler) update(w http.ResponseWriter, r *http.Request) {
|
||||||
h.encoder.StatusResponse(ctx, w, filter, http.StatusOK)
|
h.encoder.StatusResponse(ctx, w, filter, http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h filterHandler) toggleEnabled(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var (
|
||||||
|
ctx = r.Context()
|
||||||
|
filterID = chi.URLParam(r, "filterID")
|
||||||
|
data struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
id, _ := strconv.Atoi(filterID)
|
||||||
|
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
|
||||||
|
// encode error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := h.service.ToggleEnabled(ctx, id, data.Enabled)
|
||||||
|
if err != nil {
|
||||||
|
// encode error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
h.encoder.StatusResponse(ctx, w, nil, http.StatusNoContent)
|
||||||
|
}
|
||||||
|
|
||||||
func (h filterHandler) delete(w http.ResponseWriter, r *http.Request) {
|
func (h filterHandler) delete(w http.ResponseWriter, r *http.Request) {
|
||||||
var (
|
var (
|
||||||
ctx = r.Context()
|
ctx = r.Context()
|
||||||
|
|
|
@ -90,6 +90,7 @@ const APIClient = {
|
||||||
getByID: (id: number) => appClient.Get(`api/filters/${id}`),
|
getByID: (id: number) => appClient.Get(`api/filters/${id}`),
|
||||||
create: (filter: Filter) => appClient.Post(`api/filters`, filter),
|
create: (filter: Filter) => appClient.Post(`api/filters`, filter),
|
||||||
update: (filter: Filter) => appClient.Put(`api/filters/${filter.id}`, filter),
|
update: (filter: Filter) => appClient.Put(`api/filters/${filter.id}`, filter),
|
||||||
|
toggleEnable: (id: number, enabled: boolean) => appClient.Put(`api/filters/${id}/enabled`, { enabled }),
|
||||||
delete: (id: number) => appClient.Delete(`api/filters/${id}`),
|
delete: (id: number) => appClient.Delete(`api/filters/${id}`),
|
||||||
},
|
},
|
||||||
indexers: {
|
indexers: {
|
||||||
|
|
|
@ -7,10 +7,13 @@ import {
|
||||||
} from "react-router-dom";
|
} from "react-router-dom";
|
||||||
import { Filter } from "../../domain/interfaces";
|
import { Filter } from "../../domain/interfaces";
|
||||||
import { useToggle } from "../../hooks/hooks";
|
import { useToggle } from "../../hooks/hooks";
|
||||||
import { useQuery } from "react-query";
|
import { useMutation, useQuery } from "react-query";
|
||||||
import { classNames } from "../../utils";
|
import { classNames } from "../../utils";
|
||||||
import { FilterAddForm } from "../../forms";
|
import { FilterAddForm } from "../../forms";
|
||||||
import APIClient from "../../api/APIClient";
|
import APIClient from "../../api/APIClient";
|
||||||
|
import Toast from "../../components/notifications/Toast";
|
||||||
|
import toast from "react-hot-toast";
|
||||||
|
import { queryClient } from "../../App";
|
||||||
|
|
||||||
export default function Filters() {
|
export default function Filters() {
|
||||||
const [createFilterIsOpen, toggleCreateFilter] = useToggle(false)
|
const [createFilterIsOpen, toggleCreateFilter] = useToggle(false)
|
||||||
|
@ -116,10 +119,18 @@ interface FilterListItemProps {
|
||||||
function FilterListItem({ filter, idx }: FilterListItemProps) {
|
function FilterListItem({ filter, idx }: FilterListItemProps) {
|
||||||
const [enabled, setEnabled] = useState(filter.enabled)
|
const [enabled, setEnabled] = useState(filter.enabled)
|
||||||
|
|
||||||
|
const updateMutation = useMutation((status: boolean) => APIClient.filters.toggleEnable(filter.id, status), {
|
||||||
|
onSuccess: () => {
|
||||||
|
toast.custom((t) => <Toast type="success" body={`${filter.name} was ${enabled ? "disabled" : "enabled"} successfully`} t={t} />)
|
||||||
|
|
||||||
|
queryClient.invalidateQueries("filter");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const toggleActive = (status: boolean) => {
|
const toggleActive = (status: boolean) => {
|
||||||
console.log(status)
|
|
||||||
setEnabled(status)
|
setEnabled(status)
|
||||||
// call api
|
// call api
|
||||||
|
updateMutation.mutate(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue