2025-10-09 10:10:50 +05:30

112 lines
3.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Blog from '../models/blog.model.js';
import Category from '../models/category.model.js';
import slugify from 'slugify';
// ✅ Create Blog for particular project
export const createBlog = async (req, res) => {
try {
const { projectId, title, description, categoryId, tags } = req.body;
if (!projectId) return res.status(400).json({ message: 'projectId is required' });
const slug = slugify(title, { lower: true, strict: true });
const blog = await Blog.create({
projectId,
title,
description,
slug,
category: categoryId,
tags,
imageUrl: req.files?.imageUrl ? `/uploads/${req.files.imageUrl[0].filename}` : '',
bigImageUrl: req.files?.bigImageUrl ? `/uploads/${req.files.bigImageUrl[0].filename}` : ''
});
res.status(201).json(blog);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// ✅ Get All Blogs for a particular project
export const getAllBlogs = async (req, res) => {
try {
const { page = 1, limit = 10, search = '', category, projectId } = req.query;
if (!projectId) return res.status(400).json({ message: 'projectId is required' });
const query = {
projectId,
title: { $regex: search, $options: 'i' }
};
if (category) {
const cat = await Category.findOne({ slug: category });
if (cat) query.category = cat._id;
}
const blogs = await Blog.find(query)
.populate('category', 'name slug')
.sort({ createdAt: -1 })
.skip((page - 1) * limit)
.limit(parseInt(limit));
const total = await Blog.countDocuments(query);
res.json({ total, page: parseInt(page), blogs });
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// ✅ Get Single Blog by Slug + projectId
export const getBlogBySlug = async (req, res) => {
try {
const { projectId } = req.query; // 👈 query param மூலம்
if (!projectId) return res.status(400).json({ message: 'projectId is required' });
const blog = await Blog.findOne({ slug: req.params.slug, projectId })
.populate('category', 'name slug');
if (!blog) return res.status(404).json({ message: 'Blog not found' });
res.json(blog);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// ✅ Add Comment to Blog (projectId check optional id already unique)
export const addComment = async (req, res) => {
try {
const { text, name } = req.body;
const blog = await Blog.findById(req.params.id);
if (!blog) return res.status(404).json({ message: 'Blog not found' });
blog.comments.push({
user: req.user?._id,
name: name || 'Anonymous',
text
});
await blog.save();
res.json(blog.comments);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// ✅ Like / Unlike
export const likeBlog = async (req, res) => {
try {
const blog = await Blog.findById(req.params.id);
if (!blog) return res.status(404).json({ message: 'Blog not found' });
const userId = req.user._id;
if (blog.likes.includes(userId)) blog.likes.pull(userId);
else blog.likes.push(userId);
await blog.save();
res.json({ likesCount: blog.likes.length });
} catch (err) {
res.status(500).json({ message: err.message });
}
};