"use server" import { Genre, Pub, Story, Sub } 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" import { pubSchema } from "app/ui/forms/schemas" import { subSchema } from "app/ui/forms/schemas" //TODO - data validation, error handling, unauthorized access handling export async function createStory(data: Story & { genres: number[] }): Promise { // 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) try { //validate schema.safeParse(storyData) genresSchema.safeParse(genresArray) //submit const res = await prisma.story.create({ data: storyData }) await prisma.story.update({ where: { id: res.id }, data: { genres: { set: genresArray } } }) revalidatePath("/story") return res } catch (error) { console.error(error) return undefined } } export async function createPub(data: Pub & { genres: number[] }): Promise { "use server" //prepare data const pubData = { title: data.title, link: data.link, query_after_days: data.query_after_days } const genresArray = data.genres.map(e => { return { id: e } }) //prepare schemas const schema = pubSchema.omit({ genres: true }) const genreSchema = z.object({ id: z.number() }) const genresSchema = z.array(genreSchema) try { //validate schema.parse(pubData) genresSchema.safeParse(genresArray) //submit const res = await prisma.pub.create({ data: pubData }) const genresRes = await prisma.pub.update({ where: { id: res.id }, data: { genres: { set: genresArray } } }) revalidatePath("/publication") return genresRes } catch (error) { console.error(error) return undefined } } export async function createSub(data: Sub): Promise { "use server" try { subSchema.parse(data) const res = await prisma.sub.create({ data }) revalidatePath("/submission") return res } catch (error) { console.error(error) return undefined } }