fully implemented delete function for storages

This commit is contained in:
2026-05-29 17:55:26 +02:00
parent 8c4f194164
commit 214941ed7a
5 changed files with 83 additions and 7 deletions
@@ -48,3 +48,16 @@ export const updateStorage = async (uuid, values) => {
return { code: "es003" }; return { code: "es003" };
} }
}; };
export const deleteStorage = async (uuid) => {
const [result] = await pool.query(
"DELETE FROM storage_locations WHERE uuid = UUID_TO_BIN(?);",
[uuid],
);
if (result.affectedRows > 0) {
return { code: "ss004" };
} else {
return { code: "es004" };
}
};
+33 -2
View File
@@ -5,6 +5,7 @@ import {
allStorages, allStorages,
newStorage, newStorage,
updateStorage, updateStorage,
deleteStorage,
} from "./database/storage.database.js"; } from "./database/storage.database.js";
dotenv.config(); dotenv.config();
const router = express.Router(); const router = express.Router();
@@ -34,7 +35,9 @@ router.get("/all-storages", authenticate, async (req, res) => {
router.post("/new-storage", authenticate, async (req, res) => { router.post("/new-storage", authenticate, async (req, res) => {
const { name, description } = req.body; const { name, description } = req.body;
if (!name || !description) { let desc = description;
if (!name) {
res.status(400).json({ res.status(400).json({
success: false, success: false,
code: "es000", code: "es000",
@@ -44,7 +47,11 @@ router.post("/new-storage", authenticate, async (req, res) => {
return; return;
} }
const result = await newStorage(name, description); if (description == "") {
desc = null;
}
const result = await newStorage(name, desc);
if (result.code === "es002") { if (result.code === "es002") {
res.status(500).json({ res.status(500).json({
@@ -90,4 +97,28 @@ router.post("/update-storage", authenticate, async (req, res) => {
} }
}); });
router.delete("/delete", authenticate, async (req, res) => {
const uuid = req.query.uuid;
const result = await deleteStorage(uuid);
if (result.code === "es004") {
res.status(500).json({
success: false,
code: "es004",
data: null,
message: "unexpected server error",
});
}
if (result.code === "ss004") {
res.status(201).json({
success: true,
code: "ss004",
data: null,
message: "",
});
}
});
export default router; export default router;
+12 -4
View File
@@ -1,5 +1,5 @@
import { useQueryClient, useMutation } from "@tanstack/react-query"; import { useQueryClient, useMutation } from "@tanstack/react-query";
import { updateStorage } from "../utils/uxFncs"; import { deleteStorage, updateStorage } from "../utils/uxFncs";
import { useForm } from "@tanstack/react-form"; import { useForm } from "@tanstack/react-form";
import { useStore } from "@tanstack/react-store"; import { useStore } from "@tanstack/react-store";
import { Input, Button } from "@mui/joy"; import { Input, Button } from "@mui/joy";
@@ -21,6 +21,13 @@ export const StorageRow = ({ storage }: StorageRowProps) => {
}, },
}); });
const deleteMutation = useMutation({
mutationFn: (uuid: string) => deleteStorage(uuid),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["storages"] });
},
});
const form = useForm({ const form = useForm({
defaultValues: { defaultValues: {
name: storage.name, name: storage.name,
@@ -68,15 +75,16 @@ export const StorageRow = ({ storage }: StorageRowProps) => {
<Button <Button
color="primary" color="primary"
onClick={form.handleSubmit} onClick={form.handleSubmit}
disabled={!isDirty || mutation.isPending} disabled={!isDirty || mutation.isPending || deleteMutation.isPending}
> >
{mutation.isPending ? "..." : "Save"} {mutation.isPending ? "..." : "Save"}
</Button> </Button>
<Button <Button
color="danger" color="danger"
onClick={() => console.log("Delete Storage: " + storage.uuid)} onClick={() => deleteMutation.mutateAsync(storage.uuid)}
disabled={mutation.isPending || deleteMutation.isPending}
> >
{mutation.isPending ? "..." : "Delete"} {deleteMutation.isPending ? "..." : "Delete"}
</Button> </Button>
</td> </td>
</tr> </tr>
+4 -1
View File
@@ -1,6 +1,6 @@
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { getStorages } from "../utils/uxFncs"; import { getStorages } from "../utils/uxFncs";
import { Sheet, Table, Button, CircularProgress } from "@mui/joy"; import { Sheet, Table, Button, CircularProgress, Typography } from "@mui/joy";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import type { Storage } from "../misc/interfaces"; import type { Storage } from "../misc/interfaces";
import { StorageRow } from "../components/StorageRow"; import { StorageRow } from "../components/StorageRow";
@@ -24,6 +24,9 @@ export const Storages = () => {
<> <>
<AddStorageModal isOpen={modal} setOpen={setModal} /> <AddStorageModal isOpen={modal} setOpen={setModal} />
<Button onClick={() => setModal(true)}>+</Button> <Button onClick={() => setModal(true)}>+</Button>
<Typography level="body-md" color="warning" fontWeight={"bold"}>
{t("storage-delete-info")}
</Typography>
<Table <Table
borderAxis="x" borderAxis="x"
color="neutral" color="neutral"
+21
View File
@@ -208,3 +208,24 @@ export const mutateNewStorage = async (values: NewStorage) => {
return response.data; return response.data;
} }
}; };
export const deleteStorage = async (uuid: string) => {
const result = await fetch(`${API_BASE}/storage/delete?uuid=${uuid}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${Cookies.get("token") || ""}`,
"Content-Type": "application/json",
Accept: "application/json",
},
});
const response = await result.json();
if (response.code === "es004") {
return { success: false, code: response.code };
}
if (response.code === "ss004") {
return { success: true, code: response.code };
}
};