| import { Request, Response } from 'express';
|
| import prisma from '../models/prisma';
|
| import slugify from 'slugify';
|
|
|
|
|
| export const getAdminBlogPosts = async (req: Request, res: Response) => {
|
| try {
|
| const posts = await prisma.blogPost.findMany({
|
| orderBy: { createdAt: 'desc' },
|
| include: { author: { select: { name: true, email: true } } }
|
| });
|
| return res.status(200).json(posts);
|
| } catch (error) {
|
| console.error('Error fetching admin blog posts:', error);
|
| return res.status(500).json({ error: 'Internal server error' });
|
| }
|
| };
|
|
|
|
|
| export const getAdminBlogPost = async (req: Request, res: Response) => {
|
| try {
|
| const { id } = req.params;
|
| const post = await prisma.blogPost.findUnique({
|
| where: { id },
|
| include: { author: { select: { name: true, email: true } } }
|
| });
|
| if (!post) {
|
| return res.status(404).json({ error: 'Post not found' });
|
| }
|
| return res.status(200).json(post);
|
| } catch (error) {
|
| console.error('Error fetching admin blog post:', error);
|
| return res.status(500).json({ error: 'Internal server error' });
|
| }
|
| };
|
|
|
|
|
| export const createAdminBlogPost = async (req: Request, res: Response) => {
|
| try {
|
| const userId = (req as any).user.userId;
|
| const { title, slug, content, excerpt, featuredImage, tags, status, publishedAt } = req.body;
|
|
|
| if (!title || !content) {
|
| return res.status(400).json({ error: 'Title and content are required' });
|
| }
|
|
|
| const generatedSlug = slug ? slugify(slug, { lower: true, strict: true }) : slugify(title, { lower: true, strict: true });
|
|
|
|
|
| const existing = await prisma.blogPost.findUnique({ where: { slug: generatedSlug } });
|
| if (existing) {
|
| return res.status(400).json({ error: 'A post with this slug already exists' });
|
| }
|
|
|
| const newPost = await prisma.blogPost.create({
|
| data: {
|
| title,
|
| slug: generatedSlug,
|
| content,
|
| excerpt: excerpt || null,
|
| featuredImage: featuredImage || null,
|
| tags: tags || null,
|
| status: status || 'DRAFT',
|
| publishedAt: publishedAt ? new Date(publishedAt) : null,
|
| authorId: userId,
|
| }
|
| });
|
|
|
| return res.status(201).json(newPost);
|
| } catch (error) {
|
| console.error('Error creating admin blog post:', error);
|
| return res.status(500).json({ error: 'Internal server error' });
|
| }
|
| };
|
|
|
|
|
| export const updateAdminBlogPost = async (req: Request, res: Response) => {
|
| try {
|
| const { id } = req.params;
|
| const { title, slug, content, excerpt, featuredImage, tags, status, publishedAt } = req.body;
|
|
|
| const existingPost = await prisma.blogPost.findUnique({ where: { id } });
|
| if (!existingPost) {
|
| return res.status(404).json({ error: 'Post not found' });
|
| }
|
|
|
| let updateSlug = existingPost.slug;
|
| if (slug && slug !== existingPost.slug) {
|
| updateSlug = slugify(slug, { lower: true, strict: true });
|
| const checkSlug = await prisma.blogPost.findUnique({ where: { slug: updateSlug } });
|
| if (checkSlug) {
|
| return res.status(400).json({ error: 'A post with this slug already exists' });
|
| }
|
| }
|
|
|
| const updatedPost = await prisma.blogPost.update({
|
| where: { id },
|
| data: {
|
| title: title !== undefined ? title : existingPost.title,
|
| slug: updateSlug,
|
| content: content !== undefined ? content : existingPost.content,
|
| excerpt: excerpt !== undefined ? excerpt : existingPost.excerpt,
|
| featuredImage: featuredImage !== undefined ? featuredImage : existingPost.featuredImage,
|
| tags: tags !== undefined ? tags : existingPost.tags,
|
| status: status !== undefined ? status : existingPost.status,
|
| publishedAt: publishedAt !== undefined ? (publishedAt ? new Date(publishedAt) : null) : existingPost.publishedAt,
|
| }
|
| });
|
|
|
| return res.status(200).json(updatedPost);
|
| } catch (error) {
|
| console.error('Error updating admin blog post:', error);
|
| return res.status(500).json({ error: 'Internal server error' });
|
| }
|
| };
|
|
|
|
|
| export const deleteAdminBlogPost = async (req: Request, res: Response) => {
|
| try {
|
| const { id } = req.params;
|
|
|
| const existingPost = await prisma.blogPost.findUnique({ where: { id } });
|
| if (!existingPost) {
|
| return res.status(404).json({ error: 'Post not found' });
|
| }
|
|
|
| await prisma.blogPost.delete({ where: { id } });
|
|
|
| return res.status(200).json({ message: 'Post deleted successfully' });
|
| } catch (error) {
|
| console.error('Error deleting admin blog post:', error);
|
| return res.status(500).json({ error: 'Internal server error' });
|
| }
|
| };
|
|
|