feat(pages): add pages and navigation builder baseline

This commit is contained in:
2026-02-12 19:30:09 +01:00
parent 7d9bc9dca9
commit 281b1d7a1b
15 changed files with 1372 additions and 16 deletions

View File

@@ -0,0 +1,109 @@
import {
createNavigationItemInputSchema,
createNavigationMenuInputSchema,
createPageInputSchema,
updateNavigationItemInputSchema,
updatePageInputSchema,
} from "@cms/content"
import { db } from "./client"
function resolvePublishedAt(status: string): Date | null {
return status === "published" ? new Date() : null
}
export async function listPages(limit = 50) {
return db.page.findMany({
orderBy: [{ updatedAt: "desc" }],
take: limit,
})
}
export async function getPageById(id: string) {
return db.page.findUnique({
where: { id },
})
}
export async function createPage(input: unknown) {
const payload = createPageInputSchema.parse(input)
return db.page.create({
data: {
...payload,
publishedAt: resolvePublishedAt(payload.status),
},
})
}
export async function updatePage(input: unknown) {
const payload = updatePageInputSchema.parse(input)
const { id, ...data } = payload
return db.page.update({
where: { id },
data: {
...data,
publishedAt:
data.status === undefined ? undefined : data.status === "published" ? new Date() : null,
},
})
}
export async function deletePage(id: string) {
return db.page.delete({
where: { id },
})
}
export async function listNavigationMenus() {
return db.navigationMenu.findMany({
orderBy: [{ location: "asc" }, { name: "asc" }],
include: {
items: {
orderBy: [{ sortOrder: "asc" }, { label: "asc" }],
include: {
page: {
select: {
id: true,
title: true,
slug: true,
},
},
},
},
},
})
}
export async function createNavigationMenu(input: unknown) {
const payload = createNavigationMenuInputSchema.parse(input)
return db.navigationMenu.create({
data: payload,
})
}
export async function createNavigationItem(input: unknown) {
const payload = createNavigationItemInputSchema.parse(input)
return db.navigationItem.create({
data: payload,
})
}
export async function updateNavigationItem(input: unknown) {
const payload = updateNavigationItemInputSchema.parse(input)
const { id, ...data } = payload
return db.navigationItem.update({
where: { id },
data,
})
}
export async function deleteNavigationItem(id: string) {
return db.navigationItem.delete({
where: { id },
})
}