allow to delete torrents
This commit is contained in:
17
main.go
17
main.go
@@ -322,6 +322,23 @@ func main() {
|
|||||||
}{true}, 200)
|
}{true}, 200)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
mux.HandleFunc("DELETE /api/torrents/{id}", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
torrentId, err := strconv.Atoi(r.PathValue("id"))
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), 500)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := m.DeleteTorrentById(int64(torrentId)); err != nil {
|
||||||
|
http.Error(w, err.Error(), 404)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sendJSON(w, struct {
|
||||||
|
Ok bool `json:"ok"`
|
||||||
|
}{true}, 200)
|
||||||
|
})
|
||||||
|
|
||||||
addr := fmt.Sprintf("%s:%d", *hostname, *port)
|
addr := fmt.Sprintf("%s:%d", *hostname, *port)
|
||||||
fmt.Printf("starting http server on %s\n", addr)
|
fmt.Printf("starting http server on %s\n", addr)
|
||||||
if err := http.ListenAndServe(addr, mux); err != nil {
|
if err := http.ListenAndServe(addr, mux); err != nil {
|
||||||
|
|||||||
@@ -41,3 +41,8 @@ func (m *Model) GetTorrentByGuidAndItemId(guid string, itemId int64) (*Torrent,
|
|||||||
|
|
||||||
return torrent, nil
|
return torrent, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Model) DeleteTorrentById(torrentId int64) error {
|
||||||
|
_, err := m.db.Exec("DELETE FROM torrents WHERE id = ?", torrentId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
13
web/src/api/useDeleteTorrentMutation.ts
Normal file
13
web/src/api/useDeleteTorrentMutation.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { useMutation } from "@tanstack/react-query";
|
||||||
|
|
||||||
|
export const useDeleteTorrentMutation = () => {
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: async ({ id }: { id: number }) => {
|
||||||
|
const resp = await fetch(`/api/torrents/${id}`, {
|
||||||
|
method: "DELETE",
|
||||||
|
});
|
||||||
|
const data = await resp.json();
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -13,6 +13,7 @@ import { useDeleteItemMutation } from "../api/useDeleteItemMutation";
|
|||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { humanFileSize } from "../utils/humanFileSize";
|
import { humanFileSize } from "../utils/humanFileSize";
|
||||||
|
import { useDeleteTorrentMutation } from "../api/useDeleteTorrentMutation";
|
||||||
|
|
||||||
export type ItemProps = {
|
export type ItemProps = {
|
||||||
item: ItemDetails;
|
item: ItemDetails;
|
||||||
@@ -27,6 +28,7 @@ export const Item = ({ item }: ItemProps) => {
|
|||||||
|
|
||||||
const deleteMutation = useDeleteItemMutation();
|
const deleteMutation = useDeleteItemMutation();
|
||||||
const downloadMutation = useDownloadTorrentMutation();
|
const downloadMutation = useDownloadTorrentMutation();
|
||||||
|
const deleteTorrentMutation = useDeleteTorrentMutation();
|
||||||
|
|
||||||
const Icon = open ? CaretUpIcon : CaretDownIcon;
|
const Icon = open ? CaretUpIcon : CaretDownIcon;
|
||||||
|
|
||||||
@@ -49,6 +51,21 @@ export const Item = ({ item }: ItemProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDeleteTorrent = (torrentId: number) => {
|
||||||
|
deleteTorrentMutation.mutate(
|
||||||
|
{
|
||||||
|
id: torrentId,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
onSuccess() {
|
||||||
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: ["items", item.id, "torrents"],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="border-t border-b border-neutral-900">
|
<div className="border-t border-b border-neutral-900">
|
||||||
<div
|
<div
|
||||||
@@ -74,7 +91,7 @@ export const Item = ({ item }: ItemProps) => {
|
|||||||
torrents?.map((torrent) => (
|
torrents?.map((torrent) => (
|
||||||
<div
|
<div
|
||||||
key={torrent.id}
|
key={torrent.id}
|
||||||
className="flex justify-between items-center hover:bg-neutral-200"
|
className="flex justify-between items-center hover:bg-neutral-200 group"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span>
|
<span>
|
||||||
@@ -92,6 +109,12 @@ export const Item = ({ item }: ItemProps) => {
|
|||||||
<CheckCircleIcon size={20} color="green" />
|
<CheckCircleIcon size={20} color="green" />
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
<button
|
||||||
|
className="hidden group-hover:inline text-[#b00420] cursor-pointer"
|
||||||
|
onClick={() => handleDeleteTorrent(torrent.id)}
|
||||||
|
>
|
||||||
|
<TrashIcon size={16} />
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<span>Seeds: {torrent.seeders}</span>
|
<span>Seeds: {torrent.seeders}</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user