72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { Article } from "../../models/Article";
|
|
import { requireAuth } from "../../utils/auth";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
// Require authentication
|
|
const user = await requireAuth(event);
|
|
|
|
// Check if user can create articles
|
|
if (!user.permissions.canEdit) {
|
|
throw createError({
|
|
statusCode: 403,
|
|
statusMessage: "You do not have permission to create articles",
|
|
});
|
|
}
|
|
|
|
// Get request body
|
|
const body = await readBody(event);
|
|
|
|
// Validate required fields
|
|
if (!body.title || !body.slug || !body.content) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: "Title, slug, and content are required",
|
|
});
|
|
}
|
|
|
|
// Check if slug already exists
|
|
const existing = await Article.findOne({ slug: body.slug });
|
|
if (existing) {
|
|
throw createError({
|
|
statusCode: 409,
|
|
statusMessage: "An article with this slug already exists",
|
|
});
|
|
}
|
|
|
|
// Create article
|
|
try {
|
|
const article = await Article.create({
|
|
slug: body.slug,
|
|
title: body.title,
|
|
description: body.description || "",
|
|
content: body.content,
|
|
category: body.category || "general",
|
|
tags: body.tags || [],
|
|
accessLevel: body.accessLevel || "public",
|
|
cohorts: body.cohorts || [],
|
|
author: user.userId,
|
|
status: body.status || "draft",
|
|
publishedAt: body.status === "published" ? new Date() : null,
|
|
revisions: [
|
|
{
|
|
content: body.content,
|
|
author: user.userId,
|
|
message: "Initial creation",
|
|
createdAt: new Date(),
|
|
},
|
|
],
|
|
});
|
|
|
|
return {
|
|
success: true,
|
|
slug: article.slug,
|
|
message: "Article created successfully",
|
|
};
|
|
} catch (error) {
|
|
console.error("Error creating article:", error);
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: "Failed to create article",
|
|
});
|
|
}
|
|
});
|