fix: filter list toggle (#55)

This commit is contained in:
Ludvig Lundgren 2021-12-27 16:10:15 +01:00 committed by GitHub
parent e1ef47e09a
commit 48155e5f82
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 73 additions and 2 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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()

View file

@ -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: {

View file

@ -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 (