From 24a8bc4113e13f1933f688909a4a2d7711bd3b27 Mon Sep 17 00:00:00 2001 From: ARJUN S THAMPI <61703062+arjun-thampi@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:59:36 +0530 Subject: [PATCH] feat: add news media api --- .../migration.sql | 15 ++ backend/prisma/schema.prisma | 16 ++ backend/src/app.js | 2 + .../src/controllers/newsMedia.controller.js | 161 ++++++++++++++++++ backend/src/routes/newsMedia.routes.js | 23 +++ 5 files changed, 217 insertions(+) create mode 100644 backend/prisma/migrations/20260325110104_add_news_media/migration.sql create mode 100644 backend/src/controllers/newsMedia.controller.js create mode 100644 backend/src/routes/newsMedia.routes.js diff --git a/backend/prisma/migrations/20260325110104_add_news_media/migration.sql b/backend/prisma/migrations/20260325110104_add_news_media/migration.sql new file mode 100644 index 0000000..08ad7c1 --- /dev/null +++ b/backend/prisma/migrations/20260325110104_add_news_media/migration.sql @@ -0,0 +1,15 @@ +-- CreateTable +CREATE TABLE "NewsMedia" ( + "id" SERIAL NOT NULL, + "headline" TEXT NOT NULL, + "content" TEXT, + "firstPara" TEXT, + "secondPara" TEXT, + "author" TEXT, + "date" TIMESTAMP(3), + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "NewsMedia_pkey" PRIMARY KEY ("id") +); diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index e659495..f78df85 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -185,4 +185,20 @@ model EmailConfig { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt +} + +model NewsMedia { + id Int @id @default(autoincrement()) + + headline String + content String? + firstPara String? + secondPara String? + author String? + date DateTime? + + isActive Boolean @default(true) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } \ No newline at end of file diff --git a/backend/src/app.js b/backend/src/app.js index aa3c088..7efc6a8 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -13,6 +13,7 @@ import appointmentRoutes from "./routes/appointment.routes.js"; import inquiryRoutes from "./routes/inquiry.routes.js"; import academicsResearchRoutes from "./routes/academicsResearch.routes.js"; import emailConfigRoutes from "./routes/emailConfig.routes.js"; +import newsMediaRoutes from "./routes/newsMedia.routes.js"; dotenv.config(); @@ -49,6 +50,7 @@ app.use("/api/appointments", appointmentRoutes); app.use("/api/inquiry", inquiryRoutes); app.use("/api/academics", academicsResearchRoutes); app.use("/api/email", emailConfigRoutes); +app.use("/api/newsMedia", newsMediaRoutes); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { diff --git a/backend/src/controllers/newsMedia.controller.js b/backend/src/controllers/newsMedia.controller.js new file mode 100644 index 0000000..3219dc9 --- /dev/null +++ b/backend/src/controllers/newsMedia.controller.js @@ -0,0 +1,161 @@ +import prisma from "../prisma/client.js"; + +// GET ALL NEWS + +export const getAllNews = async (req, res) => { + try { + const news = await prisma.newsMedia.findMany({ + orderBy: { createdAt: "desc" }, + }); + + 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, + })); + + 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", + }); + } +}; + +// 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) }, + }); + + 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, + }; + + 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 } = 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, + }, + }); + + 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 news = await prisma.newsMedia.update({ + where: { id: Number(id) }, + data: { + ...req.body, + date: req.body.date ? new Date(req.body.date) : undefined, + }, + }); + + 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", + }); + } +}; diff --git a/backend/src/routes/newsMedia.routes.js b/backend/src/routes/newsMedia.routes.js new file mode 100644 index 0000000..f7631e4 --- /dev/null +++ b/backend/src/routes/newsMedia.routes.js @@ -0,0 +1,23 @@ +import express from "express"; +import { + createNews, + getAllNews, + getNewsById, + updateNews, + deleteNews, +} from "../controllers/newsMedia.controller.js"; + +import jwtAuthMiddleware from "../middleware/auth.js"; + +const router = express.Router(); + +// PUBLIC ROUTES +router.get("/getAll", getAllNews); +router.get("/:id", getNewsById); + +// PROTECTED ROUTES +router.post("/", jwtAuthMiddleware, createNews); +router.patch("/:id", jwtAuthMiddleware, updateNews); +router.delete("/:id", jwtAuthMiddleware, deleteNews); + +export default router;