feat/news-&-media #4
@@ -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")
|
||||||
|
);
|
||||||
@@ -185,4 +185,20 @@ model EmailConfig {
|
|||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
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
|
||||||
}
|
}
|
||||||
@@ -13,6 +13,7 @@ import appointmentRoutes from "./routes/appointment.routes.js";
|
|||||||
import inquiryRoutes from "./routes/inquiry.routes.js";
|
import inquiryRoutes from "./routes/inquiry.routes.js";
|
||||||
import academicsResearchRoutes from "./routes/academicsResearch.routes.js";
|
import academicsResearchRoutes from "./routes/academicsResearch.routes.js";
|
||||||
import emailConfigRoutes from "./routes/emailConfig.routes.js";
|
import emailConfigRoutes from "./routes/emailConfig.routes.js";
|
||||||
|
import newsMediaRoutes from "./routes/newsMedia.routes.js";
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
@@ -49,6 +50,7 @@ app.use("/api/appointments", appointmentRoutes);
|
|||||||
app.use("/api/inquiry", inquiryRoutes);
|
app.use("/api/inquiry", inquiryRoutes);
|
||||||
app.use("/api/academics", academicsResearchRoutes);
|
app.use("/api/academics", academicsResearchRoutes);
|
||||||
app.use("/api/email", emailConfigRoutes);
|
app.use("/api/email", emailConfigRoutes);
|
||||||
|
app.use("/api/newsMedia", newsMediaRoutes);
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000;
|
const PORT = process.env.PORT || 3000;
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
|
|||||||
@@ -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",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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;
|
||||||
Reference in New Issue
Block a user