"use server" import { Genre, Story } from "@prisma/client" import prisma from "./db" import { revalidatePath } from "next/cache" import { redirect } from "next/navigation" import { z } from "zod" import { storySchema } from "app/ui/forms/schemas" //TODO - data validation, error handling, unauthorized access handling export async function createStory(data: Story & { genres: number[] }): Promise | undefined { // will return undefined if middleware authorization fails "use server" //Prepare data const genresArray = data.genres.map((e) => { return { id: e } }) const storyData = { title: data.title, word_count: data.word_count, } //prepare schemas const schema = storySchema.omit({ id: true, genres: true }) const genreSchema = z.object({ id: z.number() }) const genresSchema = z.array(genreSchema) //validate const isSafe = schema.safeParse(storyData) && genresSchema.safeParse(genresArray) if (!isSafe) throw new Error("server-side validation failed") //submit try { const res = await prisma.story.create({ data: storyData }) await prisma.story.update({ where: { id: res.id }, data: { genres: { set: genresArray } } }) } catch (error) { throw new Error("database failure") } revalidatePath("/story") redirect("/story") } export async function createPub(data) { "use server" const genresArray = data.genres.map(e => { return { id: e } }) const res = await prisma.pub.create({ data: { title: data.title, link: data.link, query_after_days: data.query_after_days } }) console.log(res) const genresRes = await prisma.pub.update({ where: { id: res.id }, data: { genres: { set: genresArray } } }) console.log(genresRes) revalidatePath("/publication") redirect("/publication") } export async function createSub(data) { "use server" const res = await prisma.sub.create({ data }) console.log(res) revalidatePath("/submission") redirect("/submission") }