From 86afb86d3c4a2ee1ba705a5fcf0ba712c18925d2 Mon Sep 17 00:00:00 2001 From: rishalkv Date: Tue, 14 Apr 2026 15:25:20 +0530 Subject: [PATCH 1/2] feat/blig edit --- backend/package-lock.json | 13 +++- backend/package.json | 3 +- .../20260414083619_added_slug/migration.sql | 8 +++ .../migrations/20260414091055/migration.sql | 8 +++ backend/prisma/schema.prisma | 40 ++++++------ backend/src/controllers/blog.controller.js | 57 ++++++++++++------ backend/src/routes/blog.routes.js | 6 +- backend/uploads/blog/1776156111743.png | Bin 0 -> 49701 bytes 8 files changed, 94 insertions(+), 41 deletions(-) create mode 100644 backend/prisma/migrations/20260414083619_added_slug/migration.sql create mode 100644 backend/prisma/migrations/20260414091055/migration.sql create mode 100644 backend/uploads/blog/1776156111743.png diff --git a/backend/package-lock.json b/backend/package-lock.json index fe3ad00..3967c09 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -22,7 +22,8 @@ "jsonwebtoken": "^9.0.3", "multer": "^2.1.1", "postmark": "^4.0.7", - "prisma": "^6.19.2" + "prisma": "^6.19.2", + "slugify": "^1.6.9" }, "devDependencies": { "nodemon": "^3.1.11" @@ -1727,7 +1728,6 @@ "integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "6.19.2", "@prisma/engines": "6.19.2" @@ -2064,6 +2064,15 @@ "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": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 4f05cfd..b18dc4c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -28,7 +28,8 @@ "jsonwebtoken": "^9.0.3", "multer": "^2.1.1", "postmark": "^4.0.7", - "prisma": "^6.19.2" + "prisma": "^6.19.2", + "slugify": "^1.6.9" }, "devDependencies": { "nodemon": "^3.1.11" diff --git a/backend/prisma/migrations/20260414083619_added_slug/migration.sql b/backend/prisma/migrations/20260414083619_added_slug/migration.sql new file mode 100644 index 0000000..1b64c8f --- /dev/null +++ b/backend/prisma/migrations/20260414083619_added_slug/migration.sql @@ -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; diff --git a/backend/prisma/migrations/20260414091055/migration.sql b/backend/prisma/migrations/20260414091055/migration.sql new file mode 100644 index 0000000..aaf6685 --- /dev/null +++ b/backend/prisma/migrations/20260414091055/migration.sql @@ -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"); diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index f78df85..9cc2df9 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -93,6 +93,7 @@ model Blog { image String? content Json isActive Boolean @default(true) + slug String @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -149,20 +150,20 @@ model Appointment { } model Inquiry { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) - fullName String - number String - emailId String? - subject String? - message String? + fullName String + number String + emailId String? + subject String? + message String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model AcademicsResearch { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) fullName String number String @@ -171,24 +172,23 @@ model AcademicsResearch { courseName String? message String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } - model EmailConfig { - id Int @id @default(autoincrement()) - name String - email String - type String - isActive Boolean @default(true) + id Int @id @default(autoincrement()) + name String + email String + type String + isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model NewsMedia { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) headline String content String? @@ -197,8 +197,8 @@ model NewsMedia { author String? date DateTime? - isActive Boolean @default(true) + isActive Boolean @default(true) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} \ No newline at end of file + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/backend/src/controllers/blog.controller.js b/backend/src/controllers/blog.controller.js index bf58a09..c0a839a 100644 --- a/backend/src/controllers/blog.controller.js +++ b/backend/src/controllers/blog.controller.js @@ -1,9 +1,10 @@ import prisma from "../prisma/client.js"; +import slugify from "slugify"; /* CREATE BLOG */ export async function createBlog(req, res) { - const {title, writer, image, content, isActive} = req.body; + const { title, writer, image, content, isActive } = req.body; try { const blog = await prisma.blog.create({ @@ -13,12 +14,13 @@ export async function createBlog(req, res) { image, content, isActive, + slug: slugify(title), }, }); res.json(blog); } 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) { try { const blogs = await prisma.blog.findMany({ - where: {isActive: true}, - orderBy: {createdAt: "desc"}, + where: { isActive: true }, + orderBy: { createdAt: "desc" }, }); res.json(blogs); } 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) { try { const blogs = await prisma.blog.findMany({ - orderBy: {createdAt: "desc"}, + orderBy: { createdAt: "desc" }, }); res.json(blogs); } 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) { try { - const id = Number(req.params.id); + const slug = req.params.slug; + console.log({ slug }); const blog = await prisma.blog.findUnique({ - where: {id}, + where: { slug }, }); if (!blog) { - return res.status(404).json({error: "Blog not found"}); + return res.status(404).json({ error: "Blog not found" }); } res.json(blog); } 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) { try { - const {title, writer, image, content} = req.body; + const { title, writer, image, content } = req.body; const blog = await prisma.blog.update({ - where: {id: Number(req.params.id)}, + where: { id: Number(req.params.id) }, data: { title, writer, @@ -89,7 +112,7 @@ export async function updateBlog(req, res) { res.json(blog); } 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); await prisma.blog.delete({ - where: {id}, + where: { id }, }); - res.json({message: "Blog deleted successfully"}); + res.json({ message: "Blog deleted successfully" }); } catch (error) { - res.status(500).json({error: error.message}); + res.status(500).json({ error: error.message }); } } diff --git a/backend/src/routes/blog.routes.js b/backend/src/routes/blog.routes.js index 7cf9ad2..26a825b 100644 --- a/backend/src/routes/blog.routes.js +++ b/backend/src/routes/blog.routes.js @@ -6,6 +6,7 @@ import { updateBlog, deleteBlog, getAllBlogs, + getBlogForAdmin, } from "../controllers/blog.controller.js"; import jwtAuthMiddleware from "../middleware/auth.js"; @@ -15,11 +16,14 @@ const router = express.Router(); /* PUBLIC */ router.get("/", getBlogs); -router.get("/:id", getBlog); +router.get("/:slug", getBlog); // Protected router.get("/admin/all", jwtAuthMiddleware, getAllBlogs); + +router.get("/admin/:id", jwtAuthMiddleware, getBlogForAdmin); + router.post("/", jwtAuthMiddleware, createBlog); router.put("/:id", jwtAuthMiddleware, updateBlog); router.delete("/:id", jwtAuthMiddleware, deleteBlog); diff --git a/backend/uploads/blog/1776156111743.png b/backend/uploads/blog/1776156111743.png new file mode 100644 index 0000000000000000000000000000000000000000..0781df1c6ca4c306001e084093653f34ddf16dd3 GIT binary patch literal 49701 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 literal 0 HcmV?d00001 -- 2.43.0 From e74a5b09c2487c44e85b790d57ee99eaa8fa368a Mon Sep 17 00:00:00 2001 From: rishalkv Date: Tue, 14 Apr 2026 16:04:44 +0530 Subject: [PATCH 2/2] feat/add blog --- backend/src/controllers/blog.controller.js | 39 ++++++------ frontend/package-lock.json | 19 +----- frontend/src/App.tsx | 2 + frontend/src/api/blog.ts | 2 +- frontend/src/pages/Blog.tsx | 9 ++- frontend/src/pages/BlogDetails.tsx | 74 ++++++++++++++++++++++ 6 files changed, 105 insertions(+), 40 deletions(-) create mode 100644 frontend/src/pages/BlogDetails.tsx diff --git a/backend/src/controllers/blog.controller.js b/backend/src/controllers/blog.controller.js index c0a839a..f4cfd9f 100644 --- a/backend/src/controllers/blog.controller.js +++ b/backend/src/controllers/blog.controller.js @@ -4,7 +4,7 @@ import slugify from "slugify"; /* CREATE BLOG */ export async function createBlog(req, res) { - const { title, writer, image, content, isActive } = req.body; + const {title, writer, image, content, isActive} = req.body; try { const blog = await prisma.blog.create({ @@ -20,7 +20,7 @@ export async function createBlog(req, res) { res.json(blog); } catch (error) { - res.status(500).json({ error: "Blog creation failed" }); + res.status(500).json({error: "Blog creation failed"}); } } @@ -29,13 +29,13 @@ export async function createBlog(req, res) { export async function getBlogs(req, res) { try { const blogs = await prisma.blog.findMany({ - where: { isActive: true }, - orderBy: { createdAt: "desc" }, + where: {isActive: true}, + orderBy: {createdAt: "desc"}, }); res.json(blogs); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } @@ -44,12 +44,12 @@ export async function getBlogs(req, res) { export async function getAllBlogs(req, res) { try { const blogs = await prisma.blog.findMany({ - orderBy: { createdAt: "desc" }, + orderBy: {createdAt: "desc"}, }); res.json(blogs); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } @@ -58,19 +58,18 @@ export async function getAllBlogs(req, res) { export async function getBlog(req, res) { try { const slug = req.params.slug; - console.log({ slug }); const blog = await prisma.blog.findUnique({ - where: { slug }, + where: {slug}, }); if (!blog) { - return res.status(404).json({ error: "Blog not found" }); + return res.status(404).json({error: "Blog not found"}); } res.json(blog); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } @@ -81,16 +80,16 @@ export async function getBlogForAdmin(req, res) { const id = Number(req.params.id); const blog = await prisma.blog.findUnique({ - where: { id }, + where: {id}, }); if (!blog) { - return res.status(404).json({ error: "Blog not found" }); + return res.status(404).json({error: "Blog not found"}); } res.json(blog); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } @@ -98,10 +97,10 @@ export async function getBlogForAdmin(req, res) { export async function updateBlog(req, res) { try { - const { title, writer, image, content } = req.body; + const {title, writer, image, content} = req.body; const blog = await prisma.blog.update({ - where: { id: Number(req.params.id) }, + where: {id: Number(req.params.id)}, data: { title, writer, @@ -112,7 +111,7 @@ export async function updateBlog(req, res) { res.json(blog); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } @@ -123,11 +122,11 @@ export async function deleteBlog(req, res) { const id = Number(req.params.id); await prisma.blog.delete({ - where: { id }, + where: {id}, }); - res.json({ message: "Blog deleted successfully" }); + res.json({message: "Blog deleted successfully"}); } catch (error) { - res.status(500).json({ error: error.message }); + res.status(500).json({error: error.message}); } } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e1bb47c..46ed472 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -115,7 +115,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -1760,7 +1759,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -4093,7 +4091,6 @@ "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -4104,7 +4101,6 @@ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -4115,7 +4111,6 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -4177,7 +4172,6 @@ "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", @@ -4468,7 +4462,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4728,7 +4721,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5558,7 +5550,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5811,7 +5802,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -6466,7 +6456,6 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -8131,7 +8120,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8141,7 +8129,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8905,8 +8892,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tailwindcss-animate": { "version": "1.0.7", @@ -9113,7 +9099,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9314,7 +9299,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -9659,7 +9643,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 17b1782..1838c21 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -20,6 +20,7 @@ import CandidatePage from "./pages/candidates"; import InquiryPage from "./pages/inquiry"; import AcademicsPage from "./pages/Academics"; import NewsPage from "./pages/newsMedia"; +import BlogDetail from "./pages/BlogDetails"; export default function App() { return ( @@ -35,6 +36,7 @@ export default function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/frontend/src/api/blog.ts b/frontend/src/api/blog.ts index 7e46c5c..ceee3d3 100644 --- a/frontend/src/api/blog.ts +++ b/frontend/src/api/blog.ts @@ -14,7 +14,7 @@ export const getAllBlogsApi = async () => { }; export const getBlogByIdApi = async (id: number) => { - const res = await apiClient.get(`/blogs/${id}`); + const res = await apiClient.get(`/blogs/admin/${id}`); return res.data; }; diff --git a/frontend/src/pages/Blog.tsx b/frontend/src/pages/Blog.tsx index d1fc088..444c881 100644 --- a/frontend/src/pages/Blog.tsx +++ b/frontend/src/pages/Blog.tsx @@ -17,7 +17,7 @@ import {Card, CardContent, CardHeader, CardTitle} from "@/components/ui/card"; import {Button} from "@/components/ui/button"; import {Input} from "@/components/ui/input"; -import {Loader2, RefreshCw, Plus, Pencil, Trash} from "lucide-react"; +import {Loader2, RefreshCw, Plus, Pencil, Trash, Eye} from "lucide-react"; interface Blog { id: number; @@ -161,6 +161,13 @@ export default function BlogPage() { + + + {/* Title */} +

+ {blog.title} +

+ + {/* Meta */} +

+ {blog.writer} • {new Date(blog.createdAt).toLocaleDateString()} +

+ + {/* Image */} + {blog.title} + + {/* Content */} +
+ {blog.content?.blocks?.map((block: any, index: number) => ( +

{block.data?.text}

+ ))} +
+ + + + ); +}; + +export default BlogDetail; -- 2.43.0