Files
gg-backend/backend/src/controllers/newsMedia.controller.js
T
2026-05-05 10:48:18 +05:30

231 lines
4.3 KiB
JavaScript

import prisma from "../prisma/client.js";
// GET ALL NEWS
export const getAllNews = async (req, res) => {
try {
const page = req.query.page ? parseInt(req.query.page) : null;
const limit = req.query.limit ? parseInt(req.query.limit) : null;
const search = req.query.search?.trim() || "";
const includeImages = {
images: true,
};
const searchFilter = search
? {
headline: {
contains: search,
mode: "insensitive",
},
}
: {};
const whereCondition = {
...searchFilter,
};
const skip = page && limit ? (page - 1) * limit : undefined;
const take = limit ? limit : undefined;
const [news, total] = await Promise.all([
prisma.newsMedia.findMany({
where: whereCondition,
include: includeImages,
orderBy: { createdAt: "desc" },
skip,
take,
}),
prisma.newsMedia.count({
where: whereCondition,
}),
]);
const response = news.map((n) => ({
Id: n.id.toString(),
Headline: n.headline,
Content: n.content,
FirstPara: n.firstPara,
SecondPara: n.secondPara,
Date: n.date,
Author: n.author,
Images: n.images.map((img) => ({
id: img.id,
image: img.url,
})),
}));
return res.status(200).json({
success: true,
data: response,
meta: {
total,
page: page || 1,
limit: limit || total,
totalPages: limit ? Math.ceil(total / limit) : 1,
},
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: "Failed to fetch news",
});
}
};
// GET NEWS BY ID
export const getNewsById = async (req, res) => {
try {
const { id } = req.params;
const n = await prisma.newsMedia.findUnique({
where: { id: Number(id) },
include: { images: true },
});
if (!n) {
return res.status(404).json({
success: false,
message: "News not found",
});
}
const response = {
Id: n.id.toString(),
Headline: n.headline,
Content: n.content,
FirstPara: n.firstPara,
SecondPara: n.secondPara,
Date: n.date,
Author: n.author,
Images: n.images.map((img) => ({
id: img.id,
image: img.url,
})),
};
return res.status(200).json({
success: true,
data: response,
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: "Failed to fetch news",
});
}
};
// CREATE NEWS
export const createNews = async (req, res) => {
try {
const {
headline,
content,
firstPara,
secondPara,
date,
author,
imageUrls,
} = req.body;
if (!headline) {
return res.status(400).json({
success: false,
message: "Headline is required",
});
}
const news = await prisma.newsMedia.create({
data: {
headline,
content,
firstPara,
secondPara,
date: date ? new Date(date) : null,
author,
images: imageUrls
? {
create: imageUrls.map((url) => ({ url })),
}
: undefined,
},
include: { images: true },
});
return res.status(201).json({
success: true,
message: "News created successfully",
data: news,
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: "Failed to create news",
});
}
};
// UPDATE NEWS
export const updateNews = async (req, res) => {
try {
const { id } = req.params;
const { imageUrls, ...otherData } = req.body;
const news = await prisma.newsMedia.update({
where: { id: Number(id) },
data: {
...otherData,
date: req.body.date ? new Date(req.body.date) : undefined,
images: imageUrls
? {
deleteMany: {},
create: imageUrls.map((url) => ({ url })),
}
: undefined,
},
include: { images: true },
});
return res.status(200).json({
success: true,
message: "News updated successfully",
data: news,
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: "Failed to update news",
});
}
};
// DELETE NEWS
export const deleteNews = async (req, res) => {
try {
const { id } = req.params;
await prisma.newsMedia.delete({
where: { id: Number(id) },
});
return res.status(200).json({
success: true,
message: "News deleted successfully",
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: "Failed to delete news",
});
}
};