feat/blog #8
Generated
+11
-2
@@ -22,7 +22,8 @@
|
|||||||
"jsonwebtoken": "^9.0.3",
|
"jsonwebtoken": "^9.0.3",
|
||||||
"multer": "^2.1.1",
|
"multer": "^2.1.1",
|
||||||
"postmark": "^4.0.7",
|
"postmark": "^4.0.7",
|
||||||
"prisma": "^6.19.2"
|
"prisma": "^6.19.2",
|
||||||
|
"slugify": "^1.6.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.1.11"
|
"nodemon": "^3.1.11"
|
||||||
@@ -1727,7 +1728,6 @@
|
|||||||
"integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==",
|
"integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/config": "6.19.2",
|
"@prisma/config": "6.19.2",
|
||||||
"@prisma/engines": "6.19.2"
|
"@prisma/engines": "6.19.2"
|
||||||
@@ -2064,6 +2064,15 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/slugify": {
|
||||||
|
"version": "1.6.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
|
||||||
|
"integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/statuses": {
|
"node_modules/statuses": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
||||||
|
|||||||
@@ -28,7 +28,8 @@
|
|||||||
"jsonwebtoken": "^9.0.3",
|
"jsonwebtoken": "^9.0.3",
|
||||||
"multer": "^2.1.1",
|
"multer": "^2.1.1",
|
||||||
"postmark": "^4.0.7",
|
"postmark": "^4.0.7",
|
||||||
"prisma": "^6.19.2"
|
"prisma": "^6.19.2",
|
||||||
|
"slugify": "^1.6.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.1.11"
|
"nodemon": "^3.1.11"
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- Added the required column `slug` to the `Blog` table without a default value. This is not possible if the table is not empty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Blog" ADD COLUMN "slug" TEXT NOT NULL;
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- A unique constraint covering the columns `[slug]` on the table `Blog` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Blog_slug_key" ON "Blog"("slug");
|
||||||
@@ -93,6 +93,7 @@ model Blog {
|
|||||||
image String?
|
image String?
|
||||||
content Json
|
content Json
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
|
slug String @unique
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
@@ -149,20 +150,20 @@ model Appointment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model Inquiry {
|
model Inquiry {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
fullName String
|
fullName String
|
||||||
number String
|
number String
|
||||||
emailId String?
|
emailId String?
|
||||||
subject String?
|
subject String?
|
||||||
message String?
|
message String?
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
model AcademicsResearch {
|
model AcademicsResearch {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
fullName String
|
fullName String
|
||||||
number String
|
number String
|
||||||
@@ -171,24 +172,23 @@ model AcademicsResearch {
|
|||||||
courseName String?
|
courseName String?
|
||||||
message String?
|
message String?
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
model EmailConfig {
|
model EmailConfig {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
name String
|
name String
|
||||||
email String
|
email String
|
||||||
type String
|
type String
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
model NewsMedia {
|
model NewsMedia {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
headline String
|
headline String
|
||||||
content String?
|
content String?
|
||||||
@@ -197,8 +197,8 @@ model NewsMedia {
|
|||||||
author String?
|
author String?
|
||||||
date DateTime?
|
date DateTime?
|
||||||
|
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import prisma from "../prisma/client.js";
|
import prisma from "../prisma/client.js";
|
||||||
|
import slugify from "slugify";
|
||||||
|
|
||||||
/* CREATE BLOG */
|
/* CREATE BLOG */
|
||||||
|
|
||||||
export async function createBlog(req, res) {
|
export async function createBlog(req, res) {
|
||||||
const {title, writer, image, content, isActive} = req.body;
|
const { title, writer, image, content, isActive } = req.body;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const blog = await prisma.blog.create({
|
const blog = await prisma.blog.create({
|
||||||
@@ -13,12 +14,13 @@ export async function createBlog(req, res) {
|
|||||||
image,
|
image,
|
||||||
content,
|
content,
|
||||||
isActive,
|
isActive,
|
||||||
|
slug: slugify(title),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
res.json(blog);
|
res.json(blog);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: "Blog creation failed"});
|
res.status(500).json({ error: "Blog creation failed" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,13 +29,13 @@ export async function createBlog(req, res) {
|
|||||||
export async function getBlogs(req, res) {
|
export async function getBlogs(req, res) {
|
||||||
try {
|
try {
|
||||||
const blogs = await prisma.blog.findMany({
|
const blogs = await prisma.blog.findMany({
|
||||||
where: {isActive: true},
|
where: { isActive: true },
|
||||||
orderBy: {createdAt: "desc"},
|
orderBy: { createdAt: "desc" },
|
||||||
});
|
});
|
||||||
|
|
||||||
res.json(blogs);
|
res.json(blogs);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: error.message});
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,12 +44,12 @@ export async function getBlogs(req, res) {
|
|||||||
export async function getAllBlogs(req, res) {
|
export async function getAllBlogs(req, res) {
|
||||||
try {
|
try {
|
||||||
const blogs = await prisma.blog.findMany({
|
const blogs = await prisma.blog.findMany({
|
||||||
orderBy: {createdAt: "desc"},
|
orderBy: { createdAt: "desc" },
|
||||||
});
|
});
|
||||||
|
|
||||||
res.json(blogs);
|
res.json(blogs);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: error.message});
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,19 +57,40 @@ export async function getAllBlogs(req, res) {
|
|||||||
|
|
||||||
export async function getBlog(req, res) {
|
export async function getBlog(req, res) {
|
||||||
try {
|
try {
|
||||||
const id = Number(req.params.id);
|
const slug = req.params.slug;
|
||||||
|
console.log({ slug });
|
||||||
|
|
||||||
const blog = await prisma.blog.findUnique({
|
const blog = await prisma.blog.findUnique({
|
||||||
where: {id},
|
where: { slug },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!blog) {
|
if (!blog) {
|
||||||
return res.status(404).json({error: "Blog not found"});
|
return res.status(404).json({ error: "Blog not found" });
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json(blog);
|
res.json(blog);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: error.message});
|
res.status(500).json({ error: error.message });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GET SINGLE BLOG (ADMIN)*/
|
||||||
|
|
||||||
|
export async function getBlogForAdmin(req, res) {
|
||||||
|
try {
|
||||||
|
const id = Number(req.params.id);
|
||||||
|
|
||||||
|
const blog = await prisma.blog.findUnique({
|
||||||
|
where: { id },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!blog) {
|
||||||
|
return res.status(404).json({ error: "Blog not found" });
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(blog);
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,10 +98,10 @@ export async function getBlog(req, res) {
|
|||||||
|
|
||||||
export async function updateBlog(req, res) {
|
export async function updateBlog(req, res) {
|
||||||
try {
|
try {
|
||||||
const {title, writer, image, content} = req.body;
|
const { title, writer, image, content } = req.body;
|
||||||
|
|
||||||
const blog = await prisma.blog.update({
|
const blog = await prisma.blog.update({
|
||||||
where: {id: Number(req.params.id)},
|
where: { id: Number(req.params.id) },
|
||||||
data: {
|
data: {
|
||||||
title,
|
title,
|
||||||
writer,
|
writer,
|
||||||
@@ -89,7 +112,7 @@ export async function updateBlog(req, res) {
|
|||||||
|
|
||||||
res.json(blog);
|
res.json(blog);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: error.message});
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,11 +123,11 @@ export async function deleteBlog(req, res) {
|
|||||||
const id = Number(req.params.id);
|
const id = Number(req.params.id);
|
||||||
|
|
||||||
await prisma.blog.delete({
|
await prisma.blog.delete({
|
||||||
where: {id},
|
where: { id },
|
||||||
});
|
});
|
||||||
|
|
||||||
res.json({message: "Blog deleted successfully"});
|
res.json({ message: "Blog deleted successfully" });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({error: error.message});
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
updateBlog,
|
updateBlog,
|
||||||
deleteBlog,
|
deleteBlog,
|
||||||
getAllBlogs,
|
getAllBlogs,
|
||||||
|
getBlogForAdmin,
|
||||||
} from "../controllers/blog.controller.js";
|
} from "../controllers/blog.controller.js";
|
||||||
|
|
||||||
import jwtAuthMiddleware from "../middleware/auth.js";
|
import jwtAuthMiddleware from "../middleware/auth.js";
|
||||||
@@ -15,11 +16,14 @@ const router = express.Router();
|
|||||||
/* PUBLIC */
|
/* PUBLIC */
|
||||||
|
|
||||||
router.get("/", getBlogs);
|
router.get("/", getBlogs);
|
||||||
router.get("/:id", getBlog);
|
router.get("/:slug", getBlog);
|
||||||
|
|
||||||
// Protected
|
// Protected
|
||||||
|
|
||||||
router.get("/admin/all", jwtAuthMiddleware, getAllBlogs);
|
router.get("/admin/all", jwtAuthMiddleware, getAllBlogs);
|
||||||
|
|
||||||
|
router.get("/admin/:id", jwtAuthMiddleware, getBlogForAdmin);
|
||||||
|
|
||||||
router.post("/", jwtAuthMiddleware, createBlog);
|
router.post("/", jwtAuthMiddleware, createBlog);
|
||||||
router.put("/:id", jwtAuthMiddleware, updateBlog);
|
router.put("/:id", jwtAuthMiddleware, updateBlog);
|
||||||
router.delete("/:id", jwtAuthMiddleware, deleteBlog);
|
router.delete("/:id", jwtAuthMiddleware, deleteBlog);
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
Reference in New Issue
Block a user