diff --git a/package-lock.json b/package-lock.json index f5dfb3e..986c97d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "postgres": "^3.4.3", "react": "18.2.0", "react-dom": "18.2.0", - "zod": "^3.23.3" + "zod": "^3.23.8" }, "devDependencies": { "@types/eslint": "^8.56.2", diff --git a/package.json b/package.json index 9621eea..230e2d8 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "postgres": "^3.4.3", "react": "18.2.0", "react-dom": "18.2.0", - "zod": "^3.23.3" + "zod": "^3.23.8" }, "devDependencies": { "@types/eslint": "^8.56.2", diff --git a/src/server/actions/addWine.ts b/src/server/actions/addWine.ts index 247497d..95ab41e 100644 --- a/src/server/actions/addWine.ts +++ b/src/server/actions/addWine.ts @@ -1,11 +1,9 @@ 'use server' +import { ZodError, z } from 'zod'; import { db } from '../db/index' import { wines } from '../db/schema' -type Wine = { - name: string; - producer: string; -} +type NewWine = typeof wines.$inferInsert; export type InsertResult = { name: string; @@ -13,14 +11,56 @@ export type InsertResult = { id: string; createdAt: Date; updatedAt: Date | null; + }[]; +export type Fields = { + name: FormDataEntryValue | null + producer: FormDataEntryValue | null; +} -export const addWine = async (wine: Wine): Promise => { - const { name, producer } = wine; - const response = await db.insert(wines).values({ - producer: producer, - name: name, - }) - .returning(); - return response; - }; \ No newline at end of file +export type FormState = { + message: string; + errors: Record | undefined; + fieldValues: NewWine; +} + +const schema = z.object({ + name: z.string(), + producer: z.string().uuid(), +}) + +export const addWine = async ( + prevState: FormState, + formData: FormData): Promise => { + const newWine: NewWine = { + name: formData.get('name') as string, + producer: formData.get('producer') as string + } + try { + schema.parse(newWine) + + const response = await db.insert(wines).values(newWine); + return { + message: `success fully added ${response}`, + errors: undefined, + fieldValues: { + name: "", + producer: "" + } + } + } catch (error) { + const zodError = error as ZodError; + const errorMap = zodError.flatten().fieldErrors; + return { + message: "error", + errors: { + name: errorMap["name"]?.[0] ?? "", + producer: errorMap["producer"]?.[0] ?? "" + }, + fieldValues: { + name: newWine.name, + producer: newWine.producer + } + } + } + } \ No newline at end of file