feat(admin): add posts CRUD sandbox and shared CRUD foundation
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
|
||||
import { postSchema, upsertPostSchema } from "./index"
|
||||
import { createPostInputSchema, postSchema, updatePostInputSchema, upsertPostSchema } from "./index"
|
||||
|
||||
describe("content schemas", () => {
|
||||
it("accepts a valid post", () => {
|
||||
@@ -17,7 +17,24 @@ describe("content schemas", () => {
|
||||
expect(post.slug).toBe("hello-world")
|
||||
})
|
||||
|
||||
it("rejects invalid upsert payload", () => {
|
||||
it("rejects invalid create payload", () => {
|
||||
const result = createPostInputSchema.safeParse({
|
||||
title: "Hi",
|
||||
slug: "x",
|
||||
body: "",
|
||||
status: "unknown",
|
||||
})
|
||||
|
||||
expect(result.success).toBe(false)
|
||||
})
|
||||
|
||||
it("rejects empty update payload", () => {
|
||||
const result = updatePostInputSchema.safeParse({})
|
||||
|
||||
expect(result.success).toBe(false)
|
||||
})
|
||||
|
||||
it("keeps upsert alias for backward compatibility", () => {
|
||||
const result = upsertPostSchema.safeParse({
|
||||
title: "Hi",
|
||||
slug: "x",
|
||||
|
||||
@@ -4,22 +4,32 @@ export * from "./rbac"
|
||||
|
||||
export const postStatusSchema = z.enum(["draft", "published"])
|
||||
|
||||
export const postSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
const postMutableFieldsSchema = z.object({
|
||||
title: z.string().min(3).max(180),
|
||||
slug: z.string().min(3).max(180),
|
||||
excerpt: z.string().max(320).optional(),
|
||||
body: z.string().min(1),
|
||||
status: postStatusSchema,
|
||||
})
|
||||
|
||||
export const postSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
...postMutableFieldsSchema.shape,
|
||||
createdAt: z.date(),
|
||||
updatedAt: z.date(),
|
||||
})
|
||||
|
||||
export const upsertPostSchema = postSchema.omit({
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
})
|
||||
export const createPostInputSchema = postMutableFieldsSchema
|
||||
export const updatePostInputSchema = postMutableFieldsSchema
|
||||
.partial()
|
||||
.refine((value) => Object.keys(value).length > 0, {
|
||||
message: "At least one field is required for an update.",
|
||||
})
|
||||
|
||||
// Backward-compatible alias while migrating callers to create/update-specific schemas.
|
||||
export const upsertPostSchema = createPostInputSchema
|
||||
|
||||
export type Post = z.infer<typeof postSchema>
|
||||
export type CreatePostInput = z.infer<typeof createPostInputSchema>
|
||||
export type UpdatePostInput = z.infer<typeof updatePostInputSchema>
|
||||
export type UpsertPostInput = z.infer<typeof upsertPostSchema>
|
||||
|
||||
Reference in New Issue
Block a user