123 lines
3.3 KiB

4 weeks ago
4 weeks ago
4 weeks ago
2 weeks ago
4 weeks ago
4 weeks ago
2 weeks ago
2 weeks ago
4 weeks ago
2 weeks ago
4 weeks ago
2 weeks ago
4 weeks ago
4 weeks ago
  1. import blogModel from "../models/blogModel.js";
  2. import blogImage from "../models/blogImage.js";
  3. // Get all blogs with images
  4. export const getAllBlogs = async (req, res) => {
  5. try {
  6. const blogs = await blogModel.findAll({
  7. include: [{ model: blogImage, as: "images" }], // Tambahkan alias "images"
  8. });
  9. res.json(blogs);
  10. } catch (error) {
  11. res.status(500).json({ message: error.message });
  12. }
  13. };
  14. // Get a single blog by ID
  15. export const getBlogById = async (req, res) => {
  16. try {
  17. const blog = await blogModel.findByPk(req.params.id, {
  18. include: [{ model: blogImage, as: "images" }], // Tambahkan alias "images"
  19. });
  20. if (!blog) return res.status(404).json({ message: "Blog not found" });
  21. res.json(blog);
  22. } catch (error) {
  23. res.status(500).json({ message: error.message });
  24. }
  25. };
  26. // Get blog by slug
  27. export const getBlogBySlug = async (req, res) => {
  28. try {
  29. const blog = await blogModel.findOne({
  30. where: { slug: req.params.slug },
  31. include: [{ model: blogImage, as: "images" }],
  32. });
  33. if (!blog) return res.status(404).json({ message: "Blog not found" });
  34. res.json(blog);
  35. } catch (error) {
  36. res.status(500).json({ message: error.message });
  37. }
  38. };
  39. // Create a new blog
  40. export const createBlog = async (req, res) => {
  41. try {
  42. const { title, description } = req.body;
  43. if (!req.files || req.files.length === 0) {
  44. return res.status(400).json({ message: "Minimal 1 gambar diperlukan!" });
  45. }
  46. const slug = generateSlug(title); // 🔥 generate slug di sini
  47. const blog = await blogModel.create({ title, description, slug });
  48. const imagePaths = req.files.map((file) => ({
  49. blogId: blog.id,
  50. imageUrl: `/uploads/${file.filename}`,
  51. }));
  52. await blogImage.bulkCreate(imagePaths);
  53. const newBlog = await blogModel.findByPk(blog.id, {
  54. include: [{ model: blogImage, as: "images" }],
  55. });
  56. res.status(201).json({
  57. message: "Blog created successfully",
  58. blog: newBlog,
  59. });
  60. } catch (error) {
  61. res.status(500).json({ message: error.message });
  62. }
  63. };
  64. const generateSlug = (title) => {
  65. return title
  66. .toLowerCase()
  67. .replace(/\s+/g, "-")
  68. .replace(/[^\w-]+/g, "");
  69. };
  70. // Update a blog
  71. export const updateBlog = async (req, res) => {
  72. try {
  73. const blog = await blogModel.findByPk(req.params.id);
  74. if (!blog) return res.status(404).json({ message: "Blog not found" });
  75. const { title, description, slug } = req.body;
  76. // Tentukan slug baru (jika ada title baru dan tidak ada slug manual)
  77. let updatedSlug = blog.slug; // default: slug lama
  78. if (title && !slug) {
  79. updatedSlug = generateSlug(title);
  80. } else if (slug) {
  81. updatedSlug = slug;
  82. }
  83. // Update data
  84. await blog.update({
  85. title: title ?? blog.title,
  86. description: description ?? blog.description,
  87. slug: updatedSlug,
  88. });
  89. res.json(blog);
  90. } catch (error) {
  91. res.status(500).json({ message: error.message });
  92. }
  93. };
  94. // Delete a blog
  95. export const deleteBlog = async (req, res) => {
  96. try {
  97. const blog = await blogModel.findByPk(req.params.id);
  98. if (!blog) return res.status(404).json({ message: "Blog not found" });
  99. await blog.destroy();
  100. res.json({ message: "Blog deleted successfully" });
  101. } catch (error) {
  102. res.status(500).json({ message: error.message });
  103. }
  104. };