Working on project creation and patch with multiselect.

This commit is contained in:
charles-gauthereau
2024-12-01 09:33:35 +01:00
parent afa46c171b
commit 42314a9b69
4 changed files with 170 additions and 83 deletions
@@ -1,62 +0,0 @@
"use server"
import {userAction} from "@/safe-actions";
import {prisma} from "@/prisma";
import {ProjectSchema} from "@/components/wrappers/Project/ProjectForm.schema";
import {z} from "zod";
import {ServerActionResult} from "@/types/action-type";
import {Projects} from "@prisma/client";
export const createProjectAction = userAction
.schema(
z.object({
data: ProjectSchema,
organizationId: z.string(),
})
)
.action(async ({parsedInput, ctx}): Promise<ServerActionResult<Projects>> => {
try {
const project = await prisma.project.create({
data: {
name: parsedInput.data.name,
slug: parsedInput.data.slug,
organizationId: parsedInput.organizationId,
}
})
for (const db of parsedInput.data.databases) {
await prisma.database.update({
where: {
id: db,
},
data:{
projectId: project.id,
}
})
}
return {
success: true,
value: project,
actionSuccess: {
message: "Project has been successfully created.",
messageParams: {projectName: parsedInput.data.name},
},
};
} catch (error) {
return {
success: false,
actionError: {
message: "Failed to create Project.",
status: 500, // Optional: Use a meaningful status code
cause: error instanceof Error ? error.message : "Unknown error",
messageParams: {projectName: parsedInput.data.name},
},
};
}
});
@@ -7,4 +7,4 @@ export const ProjectSchema = z.object({
databases: z.array(z.string()),
});
export type ProjectSchema = z.infer<typeof ProjectSchema>;
export type ProjectType = z.infer<typeof ProjectSchema>;
+19 -20
View File
@@ -14,16 +14,18 @@ import {Input} from "@/components/ui/input";
import {Form} from "@/components/ui/form"
import {Button} from "@/components/ui/button";
import {useMutation} from "@tanstack/react-query";
import {ProjectSchema} from "@/components/wrappers/Project/ProjectForm.schema";
import {createProjectAction} from "@/components/wrappers/Project/ProjectForm.action";
import {ProjectSchema, ProjectType} from "@/components/wrappers/Project/ProjectForm.schema";
import {createProjectAction, updateProjectAction} from "@/components/wrappers/Project/project-form.action";
import {useRouter} from "next/navigation";
import {Database, Organization} from "@prisma/client"
import {Database, Organization, Project, Projects} from "@prisma/client"
import {MultiSelect} from "@/components/wrappers/MultiSelect/MultiSelect";
import {ZodString} from "zod";
import {toast} from "sonner";
import {ServerActionResult} from "@/types/action-type";
export type projectFormProps = {
defaultValues?: ProjectSchema;
defaultValues?: ProjectType;
databases: Database[],
organization: Organization,
projectId?: string;
@@ -43,7 +45,7 @@ export const ProjectForm = (props: projectFormProps) => {
}));
};
const formatDefaultDatabases = (databases: ProjectSchema["databases"]): string[] => {
const formatDefaultDatabases = (databases: ProjectType['databases']): string[] => {
return databases.map(database => database.id);
};
@@ -60,21 +62,18 @@ export const ProjectForm = (props: projectFormProps) => {
});
const mutation = useMutation({
mutationFn: async (values: ProjectSchema) => {
mutationFn: async (values: ProjectType) => {
console.log(values)
const projectCreated = await createProjectAction({data: values, organizationId: props.organization.id});
console.log(projectCreated)
//
// if (data) {
// toast.success(`Success`);
// router.push(`/dashboard/projects/${data.id}`);
// router.refresh()
// }
//
// if (validationErrors) {
// toast.success(`Error`);
//
// }
const project: Projects = isCreate ? await createProjectAction({data: values, organizationId: props.organization.id}) : await updateProjectAction({data: values, organizationId: props.organization.id, projectId: props.projectId});
console.log(project)
if (project.data.success) {
toast.success(project.data.actionSuccess.message);
router.push(`/dashboard/projects/${project.data.value.id}`);
router.refresh()
}else{
toast.success(project.data.actionError.message);
}
}
@@ -147,7 +146,7 @@ export const ProjectForm = (props: projectFormProps) => {
}
/>
<Button>
Create Project
{isCreate ? `Create Project` : `Update Project`}
</Button>
</Form>
</CardContent>
@@ -0,0 +1,150 @@
"use server"
import {userAction} from "@/safe-actions";
import {prisma} from "@/prisma";
import {ProjectSchema} from "@/components/wrappers/Project/ProjectForm.schema";
import {z} from "zod";
import {ServerActionResult} from "@/types/action-type";
import {Projects} from "@prisma/client";
export const createProjectAction = userAction
.schema(
z.object({
data: ProjectSchema,
organizationId: z.string(),
})
)
.action(async ({parsedInput, ctx}): Promise<ServerActionResult<Projects>> => {
try {
const project = await prisma.project.create({
data: {
name: parsedInput.data.name,
slug: parsedInput.data.slug,
organizationId: parsedInput.organizationId,
}
})
for (const db of parsedInput.data.databases) {
await prisma.database.update({
where: {
id: db,
},
data:{
projectId: project.id,
}
})
}
return {
success: true,
value: project,
actionSuccess: {
message: "Project has been successfully created.",
messageParams: {projectName: parsedInput.data.name},
},
};
} catch (error) {
return {
success: false,
actionError: {
message: "Failed to create Project.",
status: 500, // Optional: Use a meaningful status code
cause: error instanceof Error ? error.message : "Unknown error",
messageParams: {projectName: parsedInput.data.name},
},
};
}
});
export const updateProjectAction = userAction
.schema(
z.object({
data: ProjectSchema,
organizationId: z.string(),
projectId: z.string(),
})
)
.action(async ({parsedInput, ctx}): Promise<ServerActionResult<Projects>> => {
try {
const newDatabaseList = parsedInput.data.databases
const project = await prisma.project.findFirst({
where:{
id: parsedInput.projectId,
},
include: {
databases : {}
}
})
const existingItemIds = project.databases.map((db) => db.id);
const databasesToAdd = newDatabaseList.filter(
(id) => !existingItemIds.includes(id)
);
const databasesToRemove = existingItemIds.filter(
(id) => !newDatabaseList.includes(id)
);
console.log(databasesToAdd);
console.log(databasesToRemove);
if (databasesToAdd.length > 0) {
await prisma.database.updateMany({
where: {
id: { in: databasesToAdd },
},
data: {
projectId: parsedInput.projectId,
},
});
}
if (databasesToRemove.length > 0) {
await prisma.database.updateMany({
where: {
id: { in: databasesToRemove },
},
data: {
projectId: null,
},
});
}
const updatedProject = await prisma.project.update({
where:{
id: parsedInput.projectId
},
data:{
name: parsedInput.data.name,
slug: parsedInput.data.slug,
}
})
return {
success: true,
value: updatedProject,
actionSuccess: {
message: "Project has been successfully updated.",
messageParams: {projectName: parsedInput.data.name},
},
};
} catch (error) {
return {
success: false,
actionError: {
message: "Failed to update Project.",
status: 500, // Optional: Use a meaningful status code
cause: error instanceof Error ? error.message : "Unknown error",
messageParams: {projectName: parsedInput.data.name},
},
};
}
});