From 43161b8523730381868e4d0d7355230c144c9c0a Mon Sep 17 00:00:00 2001 From: charles-gauthereau Date: Tue, 17 Dec 2024 19:42:02 +0100 Subject: [PATCH] Project delete. --- .../dashboard/projects/[projectId]/page.tsx | 1 + .../20241217183424_2024_12_17/migration.sql | 8 ++++ .../20241217183746_2024_12_17/migration.sql | 2 + prisma/schema.prisma | 10 ++-- .../ButtonDeleteProject.tsx | 27 +++++++---- .../delete-project.action.ts | 47 +++++++++++++++++++ .../ProjectsForm/project-form.action.ts | 4 +- 7 files changed, 82 insertions(+), 17 deletions(-) create mode 100644 prisma/migrations/20241217183424_2024_12_17/migration.sql create mode 100644 prisma/migrations/20241217183746_2024_12_17/migration.sql create mode 100644 src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts diff --git a/app/(customer)/dashboard/projects/[projectId]/page.tsx b/app/(customer)/dashboard/projects/[projectId]/page.tsx index 5c40708e..d7a24ec5 100644 --- a/app/(customer)/dashboard/projects/[projectId]/page.tsx +++ b/app/(customer)/dashboard/projects/[projectId]/page.tsx @@ -39,6 +39,7 @@ export default async function RoutePage(props: PageParams<{ projectId: string }> diff --git a/prisma/migrations/20241217183424_2024_12_17/migration.sql b/prisma/migrations/20241217183424_2024_12_17/migration.sql new file mode 100644 index 00000000..a2dd6863 --- /dev/null +++ b/prisma/migrations/20241217183424_2024_12_17/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `isArchived` to the `projects` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "projects" ADD COLUMN "isArchived" BOOLEAN NOT NULL; diff --git a/prisma/migrations/20241217183746_2024_12_17/migration.sql b/prisma/migrations/20241217183746_2024_12_17/migration.sql new file mode 100644 index 00000000..87dae96b --- /dev/null +++ b/prisma/migrations/20241217183746_2024_12_17/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "projects" ALTER COLUMN "isArchived" SET DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 3eb37225..4553f48b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -102,11 +102,11 @@ model UserOrganization { } model Project { - id String @id @default(cuid()) - slug String @unique - name String - createdAt DateTime @default(now()) @map("created_at") - + id String @id @default(cuid()) + slug String @unique + name String + createdAt DateTime @default(now()) @map("created_at") + isArchived Boolean @default(false) organizationId String @map("organization_id") organization Organization @relation(fields: [organizationId], references: [id]) diff --git a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx index 0a82d593..8b7b24c2 100644 --- a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx +++ b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx @@ -2,29 +2,36 @@ import {Trash2} from "lucide-react"; import {ButtonWithConfirm} from "@/components/wrappers/common/button/button-with-confirm"; +import {useMutation} from "@tanstack/react-query"; +import {deleteProjectAction} from "@/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action"; +import {useRouter} from "next/navigation"; +import {toast} from "sonner"; export type ButtonDeleteProjectProps = { text? : string + projectId: string } export const ButtonDeleteProject = (props: ButtonDeleteProjectProps) => { - - // const mutation = useMutation({ - // mutationFn: () => deleteUserAction(""), - // onSuccess: async () => { - // await signOutAction(); - // }, - // }) + const router = useRouter() + const mutation = useMutation({ + mutationFn: () => deleteProjectAction(props.projectId), + onSuccess: async (result) => { + router.push("/dashboard/projects") + if(result.data.success) { + toast.success(result.data.actionSuccess.message); + } + }, + }) return ( { - // mutation.mutate() - console.log("ok") + mutation.mutate() }} variant={"destructive"} - // isPending={mutation.isPending} + isPending={mutation.isPending} className="gap-2" icon={} /> diff --git a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts new file mode 100644 index 00000000..ed1e5734 --- /dev/null +++ b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts @@ -0,0 +1,47 @@ +"use server" +import {userAction} from "@/safe-actions"; +import {z} from "zod"; +import {v4 as uuidv4} from "uuid"; +import {prisma} from "@/prisma"; +import {ServerActionResult} from "@/types/action-type"; +import {Projects} from "@prisma/client"; + + +export const deleteProjectAction = userAction + .schema(z.string()) + .action(async ({parsedInput, ctx}): Promise> => { + + try { + const uuid = uuidv4() + + const project = await prisma.project.update({ + where: { + id: parsedInput + }, + data:{ + isArchived: true, + slug: uuid + } + }) + + return { + success: true, + value: project, + actionSuccess: { + message: "Projects has been successfully archived.", + messageParams: {projectName: parsedInput.data.name}, + }, + }; + } catch (error) { + return { + success: false, + actionError: { + message: "Failed to archived Projects.", + status: 500, // Optional: Use a meaningful status code + cause: error instanceof Error ? error.message : "Unknown error", + messageParams: {projectName: parsedInput.data.name}, + }, + }; + } + + }); diff --git a/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts b/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts index 82af9795..d6c9ccb8 100644 --- a/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts +++ b/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts @@ -42,7 +42,7 @@ export const createProjectAction = userAction success: true, value: project, actionSuccess: { - message: "ProjectsForm has been successfully created.", + message: "Projects has been successfully created.", messageParams: {projectName: parsedInput.data.name}, }, }; @@ -50,7 +50,7 @@ export const createProjectAction = userAction return { success: false, actionError: { - message: "Failed to create ProjectsForm.", + message: "Failed to create Projects.", status: 500, // Optional: Use a meaningful status code cause: error instanceof Error ? error.message : "Unknown error", messageParams: {projectName: parsedInput.data.name},