From a18f5d42ee72822faeb3d08becc876c3891b2536 Mon Sep 17 00:00:00 2001 From: ROSHAN GARG Date: Mon, 14 Oct 2024 10:06:13 +0530 Subject: [PATCH] announcement sort fix --- app.js | 9 +++ .../Announcement/announcementController.js | 60 +++++++++++++++++++ resources/Announcement/announcementModal.js | 35 +++++++++++ resources/Announcement/announcementRouter.js | 33 ++++++++++ 4 files changed, 137 insertions(+) create mode 100644 resources/Announcement/announcementController.js create mode 100644 resources/Announcement/announcementModal.js create mode 100644 resources/Announcement/announcementRouter.js diff --git a/app.js b/app.js index 90c940c..12e65de 100644 --- a/app.js +++ b/app.js @@ -202,6 +202,9 @@ import RDOrderRoute from "./resources/RD_Ordes/rdOrderRoutes.js" import TaskRoute from "./resources/Task/TaskRoute.js"; // visit RD and PD import VisitRDandPDRoute from "./resources/VisitRD&PD/VisitRD&PDRoute.js"; +// announcement +import AnnouncementRoute from './resources/Announcement/announcementRouter.js' + //Stock import Stock from "./resources/Stock/StockRoute.js"; app.use("/api/v1", user); @@ -286,6 +289,12 @@ app.use("/api",RDRoute) app.use("/api",RDOrderRoute) // visit RD and PD app.use("/api", VisitRDandPDRoute); + +// Announcemnt + +app.use('/api',AnnouncementRoute) + + //config specialty // app.use("/api/config/specialty", SpecialtiesRouter); //specialties diff --git a/resources/Announcement/announcementController.js b/resources/Announcement/announcementController.js new file mode 100644 index 0000000..3b868c6 --- /dev/null +++ b/resources/Announcement/announcementController.js @@ -0,0 +1,60 @@ +import { AnnouncemntModal } from "./announcementModal.js"; + +export const createAnnouncemnet = async (req, res) => { + const { sentTo, message } = req.body; + + if (!sentTo || !message) { + return res.status(400).send("Send to and message are required"); + } + + try { + const newAnnouncement = new AnnouncemntModal({ sentTo, message }); + await newAnnouncement.save(); + res.status(201).json({ message: "Announcement created" }); + } catch (err) { + console.log(err); + res.status(500).json({ error: "Server error" }); + } +}; + +export const getAnnouncements = async (req, res) => { + const { page = 1, rowsPerPage = 5 } = req.query; + + try { + // Calculate pagination parameters + const skip = (page - 1) * rowsPerPage; + const limit = parseInt(rowsPerPage, 10); + + // Get total count of announcements + const totalAnnouncements = await AnnouncemntModal.countDocuments(); + + // Fetch announcements with pagination + const announcements = await AnnouncemntModal.find() + .skip(skip) + .limit(limit) + .sort({ createdAt: -1 }); // Sort by timestamp (most recent first) + + res.status(200).json({ + announcements, + totalAnnouncements, + }); + } catch (error) { + res.status(500).json({ message: "Error fetching announcements", error }); + } +}; + +// Get announcements for a specific role (RDs, PDs, SCs, or TMs) +// Controller to get announcements for a specific role +export const getAnnouncementsByRole = async (req, res) => { + try { + // Extract role from the URL path, e.g., 'RDs', 'PDs', etc. + const role = req.path.split("/").pop(); + console.log("role"); + + const announcements = await AnnouncemntModal.find({ sentTo: role }); + res.status(200).json(announcements); + } catch (err) { + console.error(err); + res.status(500).json({ error: "Server error" }); + } +}; diff --git a/resources/Announcement/announcementModal.js b/resources/Announcement/announcementModal.js new file mode 100644 index 0000000..3d04a17 --- /dev/null +++ b/resources/Announcement/announcementModal.js @@ -0,0 +1,35 @@ +import mongoose from "mongoose"; +import { nanoid } from "nanoid"; + +const announcementSchema = new mongoose.Schema( + { + uniqueId: { + type: String, + unique: true, + }, + sentTo: { + type: [String], + enum: ["PDs", "RDs", "SCs", "TMs"], + required: true, + }, + message: { + type: String, + required: true, + maxlength: 250, + }, + }, + { timestamps: true } +); + +// Pre-save middleware to dynamically generate a uniqueId before saving +announcementSchema.pre("save", function (next) { + if (!this.uniqueId) { + this.uniqueId = nanoid(6); // Generate a 6-character unique ID + } + next(); +}); + +export const AnnouncemntModal = mongoose.model( + "Announcements", + announcementSchema +); diff --git a/resources/Announcement/announcementRouter.js b/resources/Announcement/announcementRouter.js new file mode 100644 index 0000000..186bd65 --- /dev/null +++ b/resources/Announcement/announcementRouter.js @@ -0,0 +1,33 @@ +import express from "express"; +import { authorizeRoles, isAuthenticatedUser } from "../../middlewares/auth.js"; +import { + createAnnouncemnet, + getAnnouncements, + getAnnouncementsByRole, +} from "./announcementController.js"; +import { isAuthenticatedRD } from "../../middlewares/rdAuth.js"; +import { isAuthenticatedSalesCoOrdinator } from "../../middlewares/SalesCoOrdinatorAuth.js"; +import { isAuthenticatedTerritoryManager } from "../../middlewares/TerritoryManagerAuth.js"; + +const router = express.Router(); + +router + .route("/announcement/create") + .post(isAuthenticatedUser, authorizeRoles("admin"), createAnnouncemnet); +router + .route("/announcement/get") + .get(isAuthenticatedUser, authorizeRoles("admin"), getAnnouncements); +router + .route("/announcement/RDs") + .get(isAuthenticatedRD, getAnnouncementsByRole); +router + .route("/announcement/PDs") + .get(isAuthenticatedUser, getAnnouncementsByRole); +router + .route("/announcement/SCs") + .get(isAuthenticatedSalesCoOrdinator, getAnnouncementsByRole); +router + .route("/announcement/TMs") + .get(isAuthenticatedTerritoryManager, getAnnouncementsByRole); + +export default router;