Skip to content

Commit

Permalink
feat: add import rollback
Browse files Browse the repository at this point in the history
  • Loading branch information
Gum-Joe committed Aug 21, 2024
1 parent f9e73ab commit da0893c
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 19 deletions.
62 changes: 44 additions & 18 deletions collection/app/(app)/ImportsList.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,62 @@
"use client";

import { ConfirmModal } from "@/components/ConfirmModal";
import { ImportTable } from "@/components/tables/ImportTable";
import { ImportList } from "@/lib/crud/importCsv";
import { ImportList, rollbackImport } from "@/lib/crud/importCsv";
import { Accordion, Badge, Button, Group, Paper, Stack, Text, Title } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import React from "react";
import { FaUndo } from "react-icons/fa";

interface ImportsListProps {
imports: ImportList;
}

const ImportItem: React.FC<{ importItem: ImportList[0] }> = ({ importItem }) => {
const [opened, { open, close }] = useDisclosure(false);

return (
<Stack gap="xl">
<Paper p="md" withBorder>
<ConfirmModal
onConfirm={async () => {
await rollbackImport(importItem.id);
}}
confirmButtonText={`Rollback Import`}
opened={opened}
close={close}
>
<Text>
This will delete all <strong>{importItem._count.OrderItem}</strong> items
imported in the import <strong>{importItem.name}</strong>!
</Text>
<Text>This action cannot be undone. Are you sure you want to proceed?</Text>
</ConfirmModal>
<Group justify="space-between">
<Title order={5}>Actions</Title>
<Group>
<Button
color="red"
variant="outline"
leftSection={<FaUndo />}
onClick={open}
>
Rollback Import
</Button>
</Group>
</Group>
</Paper>
<ImportTable importId={importItem.id} />
</Stack>
);
};

export const ImportsList: React.FC<ImportsListProps> = ({ imports }) => {
return (
<Paper p="lg" withBorder mt="xl">
<Stack>
<Title order={3}>Previous Imports</Title>

<Accordion>
{imports.map((importItem, index) => (
<Accordion.Item key={index} value={importItem.id}>
Expand All @@ -25,23 +67,7 @@ export const ImportsList: React.FC<ImportsListProps> = ({ imports }) => {
</Group>
</Accordion.Control>
<Accordion.Panel pl="md" pr="md">
<Stack gap="xl">
<Paper p="md" withBorder>
<Group justify="space-between">
<Title order={5}>Actions</Title>
<Group>
<Button
color="red"
variant="outline"
leftSection={<FaUndo />}
>
Rollback Import
</Button>
</Group>
</Group>
</Paper>
<ImportTable importId={importItem.id} />
</Stack>
<ImportItem importItem={importItem} />
</Accordion.Panel>
</Accordion.Item>
))}
Expand Down
18 changes: 18 additions & 0 deletions collection/lib/crud/importCsv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,21 @@ export interface ImportItemList extends OrderItemImport {
};
}[];
}

export async function rollbackImport(importId: string) {
if (!importId || typeof importId !== "string") {
return {
status: "error",
error: "No import ID provided",
};
}

await prisma.orderItemImport.delete({
where: {
id: importId,
},
});

revalidatePath("/");
revalidateTag("purchases:*");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- DropForeignKey
ALTER TABLE "OrderItem" DROP CONSTRAINT "OrderItem_importId_fkey";

-- AddForeignKey
ALTER TABLE "OrderItem" ADD CONSTRAINT "OrderItem_importId_fkey" FOREIGN KEY ("importId") REFERENCES "OrderItemImport"("id") ON DELETE CASCADE ON UPDATE CASCADE;
2 changes: 1 addition & 1 deletion collection/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ model OrderItem {
// tag the import this came from
importId String @db.Uuid
Import OrderItemImport @relation(fields: [importId], references: [id])
Import OrderItemImport @relation(fields: [importId], references: [id], onDelete: Cascade, onUpdate: Cascade)
Order Order @relation(fields: [orderId], references: [id])
Variant Variant @relation(fields: [variantId], references: [id])
}
Expand Down

0 comments on commit da0893c

Please sign in to comment.