feat: home page banner crud
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "BannerMediaType" AS ENUM ('IMAGE', 'VIDEO');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "HomepageBanner" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"title" TEXT,
|
||||
"subtitle" TEXT,
|
||||
"mediaType" "BannerMediaType" NOT NULL,
|
||||
"desktopMediaUrl" TEXT NOT NULL,
|
||||
"mobileMediaUrl" TEXT,
|
||||
"buttonText" TEXT,
|
||||
"buttonLink" TEXT,
|
||||
"openInNewTab" BOOLEAN NOT NULL DEFAULT false,
|
||||
"textAlignment" TEXT DEFAULT 'left',
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 1000,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "HomepageBanner_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
@@ -313,4 +313,34 @@ model Seo {
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model HomepageBanner {
|
||||
id Int @id @default(autoincrement())
|
||||
|
||||
title String?
|
||||
subtitle String?
|
||||
|
||||
mediaType BannerMediaType
|
||||
|
||||
desktopMediaUrl String
|
||||
mobileMediaUrl String?
|
||||
|
||||
buttonText String?
|
||||
buttonLink String?
|
||||
|
||||
openInNewTab Boolean @default(false)
|
||||
|
||||
textAlignment String? @default("left")
|
||||
|
||||
sortOrder Int @default(1000)
|
||||
isActive Boolean @default(true)
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
enum BannerMediaType {
|
||||
IMAGE
|
||||
VIDEO
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import emailConfigRoutes from './routes/emailConfig.routes.js';
|
||||
import newsMediaRoutes from './routes/newsMedia.routes.js';
|
||||
import importRoutes from './routes/importRoutes.js';
|
||||
import healthCheckRoutes from './routes/healthCheck.route.js';
|
||||
import homepageBannerRoutes from './routes/homepageBanner.routes.js';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
@@ -57,6 +58,7 @@ app.use('/api/email', emailConfigRoutes);
|
||||
app.use('/api/newsMedia', newsMediaRoutes);
|
||||
app.use('/api/import', importRoutes);
|
||||
app.use('/api/health-check', healthCheckRoutes);
|
||||
app.use('/api/homepage-banners', homepageBannerRoutes);
|
||||
|
||||
const PORT = process.env.PORT || 5008;
|
||||
app.listen(PORT, () => {
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
import prisma from '../prisma/client.js';
|
||||
|
||||
export const createHomepageBanner = async (req, res) => {
|
||||
try {
|
||||
const {
|
||||
title,
|
||||
subtitle,
|
||||
mediaType,
|
||||
desktopMediaUrl,
|
||||
mobileMediaUrl,
|
||||
buttonText,
|
||||
buttonLink,
|
||||
openInNewTab,
|
||||
textAlignment,
|
||||
sortOrder,
|
||||
isActive,
|
||||
} = req.body;
|
||||
|
||||
if (!mediaType || !desktopMediaUrl) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Media type and desktop media URL are required',
|
||||
});
|
||||
}
|
||||
|
||||
const banner = await prisma.homepageBanner.create({
|
||||
data: {
|
||||
title,
|
||||
subtitle,
|
||||
mediaType,
|
||||
desktopMediaUrl,
|
||||
mobileMediaUrl,
|
||||
buttonText,
|
||||
buttonLink,
|
||||
openInNewTab,
|
||||
textAlignment,
|
||||
sortOrder,
|
||||
isActive,
|
||||
},
|
||||
});
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: banner,
|
||||
message: 'Homepage banner created successfully',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to create homepage banner',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const getHomepageBanners = async (req, res) => {
|
||||
try {
|
||||
const banners = await prisma.homepageBanner.findMany({
|
||||
orderBy: {
|
||||
sortOrder: 'asc',
|
||||
},
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: banners,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to fetch homepage banners',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const getActiveHomepageBanners = async (req, res) => {
|
||||
try {
|
||||
const banners = await prisma.homepageBanner.findMany({
|
||||
where: {
|
||||
isActive: true,
|
||||
},
|
||||
orderBy: {
|
||||
sortOrder: 'asc',
|
||||
},
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: banners,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to fetch active homepage banners',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const getHomepageBanner = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
const banner = await prisma.homepageBanner.findUnique({
|
||||
where: {
|
||||
id: Number(id),
|
||||
},
|
||||
});
|
||||
|
||||
if (!banner) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: 'Homepage banner not found',
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: banner,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to fetch homepage banner',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const updateHomepageBanner = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
const {
|
||||
title,
|
||||
subtitle,
|
||||
mediaType,
|
||||
desktopMediaUrl,
|
||||
mobileMediaUrl,
|
||||
buttonText,
|
||||
buttonLink,
|
||||
openInNewTab,
|
||||
textAlignment,
|
||||
sortOrder,
|
||||
isActive,
|
||||
} = req.body;
|
||||
|
||||
const banner = await prisma.homepageBanner.update({
|
||||
where: {
|
||||
id: Number(id),
|
||||
},
|
||||
data: {
|
||||
title,
|
||||
subtitle,
|
||||
mediaType,
|
||||
desktopMediaUrl,
|
||||
mobileMediaUrl,
|
||||
buttonText,
|
||||
buttonLink,
|
||||
openInNewTab,
|
||||
textAlignment,
|
||||
sortOrder,
|
||||
isActive,
|
||||
},
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: banner,
|
||||
message: 'Homepage banner updated successfully',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to update homepage banner',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const deleteHomepageBanner = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
await prisma.homepageBanner.delete({
|
||||
where: {
|
||||
id: Number(id),
|
||||
},
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Homepage banner deleted successfully',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to delete homepage banner',
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
import express from 'express';
|
||||
|
||||
import {
|
||||
createHomepageBanner,
|
||||
getHomepageBanners,
|
||||
getActiveHomepageBanners,
|
||||
getHomepageBanner,
|
||||
updateHomepageBanner,
|
||||
deleteHomepageBanner,
|
||||
} from '../controllers/homepageBanner.controller.js';
|
||||
|
||||
import jwtAuthMiddleware from '../middleware/auth.js';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/active', getActiveHomepageBanners);
|
||||
|
||||
router.post('/', jwtAuthMiddleware, createHomepageBanner);
|
||||
|
||||
router.get('/getAll', jwtAuthMiddleware, getHomepageBanners);
|
||||
router.get('/:id', jwtAuthMiddleware, getHomepageBanner);
|
||||
|
||||
router.put('/:id', jwtAuthMiddleware, updateHomepageBanner);
|
||||
|
||||
router.delete('/:id', jwtAuthMiddleware, deleteHomepageBanner);
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user