subman-nextjs/src/app/lib/create.ts

101 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-06-26 16:18:44 +00:00
"use server"
2024-09-19 09:37:01 +00:00
import { Genre, Pub, Story, Sub } from "@prisma/client"
2024-06-26 16:18:44 +00:00
import prisma from "./db"
import { revalidatePath } from "next/cache"
import { redirect } from "next/navigation"
2024-09-18 09:56:08 +00:00
import { z } from "zod"
import { storySchema } from "app/ui/forms/schemas"
2024-09-19 09:37:01 +00:00
import { pubSchema } from "app/ui/forms/schemas"
import { subSchema } from "app/ui/forms/schemas"
2024-06-26 16:18:44 +00:00
2024-09-18 09:56:08 +00:00
//TODO - data validation, error handling, unauthorized access handling
2024-09-19 09:37:01 +00:00
export async function createStory(data: Story & { genres: number[] }): Promise<Story | undefined> {
2024-09-18 09:56:08 +00:00
// will return undefined if middleware authorization fails
2024-06-26 16:18:44 +00:00
"use server"
2024-09-18 09:56:08 +00:00
//Prepare data
2024-06-29 15:21:56 +00:00
const genresArray = data.genres.map((e) => { return { id: e } })
2024-09-18 09:56:08 +00:00
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 {
2024-09-19 09:37:01 +00:00
//validate
schema.safeParse(storyData)
genresSchema.safeParse(genresArray)
//submit
2024-09-18 09:56:08 +00:00
const res = await prisma.story.create({ data: storyData })
await prisma.story.update({
where: { id: res.id },
data: {
genres: { set: genresArray }
}
})
2024-09-19 09:37:01 +00:00
revalidatePath("/story")
return res
2024-09-18 09:56:08 +00:00
} catch (error) {
2024-09-19 09:37:01 +00:00
console.error(error)
return undefined
2024-09-18 09:56:08 +00:00
}
2024-06-26 16:18:44 +00:00
}
2024-09-19 09:37:01 +00:00
export async function createPub(data: Pub & { genres: number[] }): Promise<Pub | undefined> {
2024-06-26 17:32:18 +00:00
"use server"
2024-09-19 09:37:01 +00:00
//prepare data
const pubData = {
title: data.title,
link: data.link,
query_after_days: data.query_after_days
}
2024-06-26 17:32:18 +00:00
const genresArray = data.genres.map(e => { return { id: e } })
2024-09-19 09:37:01 +00:00
//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")
2024-09-20 13:19:31 +00:00
return genresRes
2024-09-19 09:37:01 +00:00
} catch (error) {
console.error(error)
return undefined
}
2024-06-26 17:32:18 +00:00
}
2024-06-26 16:18:44 +00:00
2024-09-19 09:37:01 +00:00
export async function createSub(data: Sub): Promise<Sub | undefined> {
"use server"
2024-09-19 09:37:01 +00:00
try {
subSchema.parse(data)
const res = await prisma.sub.create({ data })
revalidatePath("/submission")
return res
} catch (error) {
console.error(error)
return undefined
}
}