From e007f18bb5975643d054f9fe0719527c9bd9a8b2 Mon Sep 17 00:00:00 2001 From: Manik Maity Date: Wed, 13 Nov 2024 10:59:04 +0530 Subject: [PATCH] Added get polls route --- backend/src/controllers/poll.controller.js | 28 +++++++++++++++++++ backend/src/repositories/poll.repo.js | 21 +++++++++++++++ backend/src/routes/v1/poll.route.js | 31 +++++++++++++++++++++- backend/src/services/poll.service.js | 29 +++++++++++++++++++- frontend/src/pages/Bookmark.jsx | 3 +-- 5 files changed, 108 insertions(+), 4 deletions(-) diff --git a/backend/src/controllers/poll.controller.js b/backend/src/controllers/poll.controller.js index 80ffaa3..ce4b35a 100644 --- a/backend/src/controllers/poll.controller.js +++ b/backend/src/controllers/poll.controller.js @@ -4,6 +4,7 @@ import { createVoteService, deletePollService, getAllCreatedPollsService, + getAllPollsService, getBookmarkPollService, getPollDataService, } from "../services/poll.service.js"; @@ -188,4 +189,31 @@ export const getBookmarkPollController = async (req, res) => { }); } } +} + +export const getAllPolls = async (req, res) => { + try { + const page = req.query.page || 1; + const limit = req.query.limit || 10; + const data = await getAllPollsService(page, limit); + res.json({ + success: true, + message: "All Polls fetched successfully", + data: data, + }); + } + catch (err) { + console.log(err); + if (err.statusCode) { + res.status(err.statusCode).json({ + success: false, + message: err.message, + }); + } else { + res.status(500).json({ + success: false, + message: err.message, + }); + } + } } \ No newline at end of file diff --git a/backend/src/repositories/poll.repo.js b/backend/src/repositories/poll.repo.js index 0eb64cf..7ba6892 100644 --- a/backend/src/repositories/poll.repo.js +++ b/backend/src/repositories/poll.repo.js @@ -61,3 +61,24 @@ export async function updatePollVoteCount(pollId, optionId) { throw err; } } + +export async function findPolls(page, limit) { + try{ + const skip = (page - 1) * limit; + const polls = await PollModel.find().skip(skip).limit(limit).populate("creatorId"); + return polls; + } + catch(err){ + throw err; + } +} + +export async function getAllPollsCount(){ + try{ + const count = await PollModel.find().countDocuments(); + return count; + } + catch(err){ + throw err; + } +} \ No newline at end of file diff --git a/backend/src/routes/v1/poll.route.js b/backend/src/routes/v1/poll.route.js index 553f6db..21f4296 100644 --- a/backend/src/routes/v1/poll.route.js +++ b/backend/src/routes/v1/poll.route.js @@ -1,6 +1,6 @@ import express from "express"; import { verifyToken } from "../../middlwares/verifyToken.js"; -import { addToBookmarkController, createPollController, createVoteController, deletePollController, getAllCreatedPollsController, getBookmarkPollController, getPollDataController } from "../../controllers/poll.controller.js"; +import { addToBookmarkController, createPollController, createVoteController, deletePollController, getAllCreatedPollsController, getAllPolls, getBookmarkPollController, getPollDataController } from "../../controllers/poll.controller.js"; import pollDataSchema from "../../validations/pollDataValidation.js"; import validator from "../../validations/validator.js"; import voteSchema from "../../validations/voteValidation.js"; @@ -196,4 +196,33 @@ pollRouter.get("/bookmark/:pollId", verifyToken, addToBookmarkController); */ pollRouter.get("/bookmarks", verifyToken, getBookmarkPollController); +/** + * @swagger + * /poll/all?page={page}&limit={limit}: + * get: + * summary: Get all polls + * tags: [Poll] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * required: false + * description: Page number + * - in: query + * name: limit + * schema: + * type: integer + * required: false + * description: Limit + * responses: + * 200: + * description: All polls fetched successfully + * 401: + * description: Unauthorized + * 500: + * description: Internal server error + */ +pollRouter.get("/all", getAllPolls) + export default pollRouter; \ No newline at end of file diff --git a/backend/src/services/poll.service.js b/backend/src/services/poll.service.js index 27c3599..880e926 100644 --- a/backend/src/services/poll.service.js +++ b/backend/src/services/poll.service.js @@ -3,7 +3,9 @@ import { createPollByData, deletePollById, findPollById, + findPolls, findPollsByCreatorId, + getAllPollsCount, updatePollVoteCount, } from "../repositories/poll.repo.js"; import { @@ -133,8 +135,9 @@ export async function addToBookMarkService(pollId, user) { updatedData = await removePollIdFromBookmark(user._id, poll._id); message = "Removed from bookmark successfully."; } + const {password, ...userData} = updatedData._doc; return { - updatedData, + updatedData : userData, message, }; } catch (err) { @@ -150,4 +153,28 @@ export async function getBookmarkPollService(userId) { } catch (err) { throw err; } +} + +export async function getAllPollsService(page, limit) { + try { + const data = await findPolls(page, limit); + const filteredData = data.map((poll) => { + const { creatorId, ...pollData } = poll._doc; + const { username, _id, ...creatorData } = creatorId._doc; + const {options, ...rest} = pollData; + return { + ...rest, + creatorData: { username, _id } + }; + }); + const totalPollCount = await getAllPollsCount(); + return { + polls: filteredData, + totalPollCount: totalPollCount, + totalPages: Math.ceil(totalPollCount / limit), + }; + } + catch (err) { + throw err; + } } \ No newline at end of file diff --git a/frontend/src/pages/Bookmark.jsx b/frontend/src/pages/Bookmark.jsx index c11ded6..4de55ac 100644 --- a/frontend/src/pages/Bookmark.jsx +++ b/frontend/src/pages/Bookmark.jsx @@ -25,7 +25,6 @@ function Bookmark() { navigator(`/view/${pollId}`); }; - const handleRemoveBookmark = async (bookmarkId) => { queryClient.setQueryData(["bookmarks"], (oldData) => { return { @@ -35,7 +34,7 @@ function Bookmark() { }); await handleBookmark(bookmarkId); }; - + return (