Refactor for i18n, CMS integration, and project slugs; enhance admin & analytics

Co-authored-by: dennis <dennis@konkol.net>
This commit is contained in:
Cursor Agent
2026-01-12 14:36:10 +00:00
parent 0349c686fa
commit 12245eec8e
55 changed files with 4573 additions and 753 deletions

View File

@@ -3,6 +3,7 @@ import { prisma } from '@/lib/prisma';
import { apiCache } from '@/lib/cache';
import { requireSessionAuth, checkRateLimit, getRateLimitHeaders } from '@/lib/auth';
import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library';
import { generateUniqueSlug } from '@/lib/slug';
export async function GET(request: NextRequest) {
try {
@@ -154,11 +155,27 @@ export async function POST(request: NextRequest) {
// Remove difficulty field if it exists (since we're removing it)
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { difficulty, ...projectData } = data;
const { difficulty, slug, defaultLocale, ...projectData } = data;
const derivedSlug =
typeof slug === 'string' && slug.trim()
? slug.trim()
: await generateUniqueSlug({
base: String(projectData.title || 'project'),
isTaken: async (candidate) => {
const existing = await prisma.project.findUnique({
where: { slug: candidate },
select: { id: true },
});
return !!existing;
},
});
const project = await prisma.project.create({
data: {
...projectData,
slug: derivedSlug,
defaultLocale: typeof defaultLocale === 'string' && defaultLocale ? defaultLocale : undefined,
// Set default difficulty since it's required in schema
difficulty: 'INTERMEDIATE',
performance: data.performance || { lighthouse: 0, bundleSize: '0KB', loadTime: '0s' },