Added bookmark route in backend

This commit is contained in:
Manik Maity
2024-11-12 22:21:59 +05:30
parent 74f0d422aa
commit 752bc0f247
6 changed files with 240 additions and 128 deletions

View File

@@ -1,4 +1,5 @@
import { import {
addToBookMarkService,
createPollService, createPollService,
createVoteService, createVoteService,
deletePollService, deletePollService,
@@ -86,12 +87,11 @@ export async function deletePollController(req, res) {
const reqUser = req.user; const reqUser = req.user;
const deletedPoll = await deletePollService(reqPollId, reqUser); const deletedPoll = await deletePollService(reqPollId, reqUser);
res.json({ res.json({
success : true, success: true,
message : "Poll deleted successfully.", message: "Poll deleted successfully.",
data : deletedPoll data: deletedPoll,
}) });
} } catch (err) {
catch (err) {
console.log(err); console.log(err);
if (err.statusCode) { if (err.statusCode) {
res.status(err.statusCode).json({ res.status(err.statusCode).json({
@@ -107,7 +107,6 @@ export async function deletePollController(req, res) {
} }
} }
export const createVoteController = async (req, res) => { export const createVoteController = async (req, res) => {
try { try {
const reqPollId = req.body.pollId; const reqPollId = req.body.pollId;
@@ -117,9 +116,35 @@ export const createVoteController = async (req, res) => {
const vote = await createVoteService(reqPollId, reqUserId, reqOptionId); const vote = await createVoteService(reqPollId, reqUserId, reqOptionId);
res.json({ res.json({
success : true, success: true,
message : "Vote created successfully.", message: "Vote created successfully.",
data : vote data: vote,
});
} 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,
});
}
}
};
export const addToBookmarkController = async (req, res) => {
try{
const reqPollId = req.params.pollId;
const reqUser = req.user;
const {updatedData, message} = await addToBookMarkService(reqPollId, reqUser);
res.json({
success: true,
message: message,
data : updatedData
}) })
} }
catch (err) { catch (err) {

View File

@@ -18,7 +18,10 @@ export async function findPollById(id) {
return poll; return poll;
} }
catch(err){ catch(err){
throw err; throw {
statusCode : 404,
message : "Poll dont exits."
};
} }
} }

View File

@@ -1,36 +1,63 @@
import UserModel from "../models/user.model.js" import UserModel from "../models/user.model.js";
export const createUser = async (username, email, password) => { export const createUser = async (username, email, password) => {
try { try {
const createdUser = await UserModel.create({ const createdUser = await UserModel.create({
username, username,
email, email,
password password,
}) });
return createdUser; return createdUser;
} } catch (err) {
catch(err) { throw err;
throw err }
} };
}
export async function findUserByEmail(email) { export async function findUserByEmail(email) {
try{ try {
const user = await UserModel.findOne({email}); const user = await UserModel.findOne({ email });
return user; return user;
} } catch (err) {
catch(err){ throw err;
throw err; }
}
} }
export async function findUserById(id) { export async function findUserById(id) {
try{ try {
const user = await UserModel.findById(id); const user = await UserModel.findById(id);
return user; return user;
} catch (err) {
throw err;
}
}
export async function addPollIdToBookmark(userId, pollId) {
try {
const updatedData = UserModel.findOneAndUpdate(
{ _id: userId },
{ $push: { bookmarks: pollId } },
{ new: true }
);
return updatedData;
} catch (err) {
throw err;
}
}
export async function removePollIdFromBookmark(userId, pollId) {
try {
const updatedData = UserModel.findOneAndUpdate(
{ _id: userId },
{ $pull: { bookmarks: pollId } },
{ new: true }
);
return updatedData;
} }
catch(err){ catch{
throw err; throw err;
} }
} }

View File

@@ -1,6 +1,6 @@
import express from "express"; import express from "express";
import { verifyToken } from "../../middlwares/verifyToken.js"; import { verifyToken } from "../../middlwares/verifyToken.js";
import { createPollController, createVoteController, deletePollController, getAllCreatedPollsController, getPollDataController } from "../../controllers/poll.controller.js"; import { addToBookmarkController, createPollController, createVoteController, deletePollController, getAllCreatedPollsController, getPollDataController } from "../../controllers/poll.controller.js";
import pollDataSchema from "../../validations/pollDataValidation.js"; import pollDataSchema from "../../validations/pollDataValidation.js";
import validator from "../../validations/validator.js"; import validator from "../../validations/validator.js";
import voteSchema from "../../validations/voteValidation.js"; import voteSchema from "../../validations/voteValidation.js";
@@ -157,4 +157,27 @@ pollRouter.delete("/delete/:pollId", verifyToken, deletePollController);
*/ */
pollRouter.post("/vote", validator(voteSchema), verifyToken, createVoteController); pollRouter.post("/vote", validator(voteSchema), verifyToken, createVoteController);
/**
* @swagger
* /poll/bookmark/{pollId}:
* get:
* summary: Add poll to bookmark
* tags: [Bookmark]
* parameters:
* - in: path
* name: pollId
* schema:
* type: string
* required: true
* description: Poll ID
* responses:
* 200:
* description: Poll added to bookmark successfully
* 401:
* description: Unauthorized
* 500:
* description: Internal server error
* */
pollRouter.get("/bookmark/:pollId", verifyToken, addToBookmarkController);
export default pollRouter; export default pollRouter;

View File

@@ -1,108 +1,142 @@
import mongoose from "mongoose"; import mongoose from "mongoose";
import { createPollByData, deletePollById, findPollById, findPollsByCreatorId, updatePollVoteCount } from "../repositories/poll.repo.js"; import {
import { createVote, findVoteByPollIdAndUserId } from "../repositories/vote.repo.js"; createPollByData,
deletePollById,
findPollById,
findPollsByCreatorId,
updatePollVoteCount,
} from "../repositories/poll.repo.js";
import {
createVote,
findVoteByPollIdAndUserId,
} from "../repositories/vote.repo.js";
import {
addPollIdToBookmark,
removePollIdFromBookmark,
} from "../repositories/user.repo.js";
export async function createPollService(title, description, options, userId) { export async function createPollService(title, description, options, userId) {
try { try {
const optionsData = options.map(option => ({ const optionsData = options.map((option) => ({
name: option, name: option,
_id : new mongoose.Types.ObjectId(), _id: new mongoose.Types.ObjectId(),
voteCount : 0 voteCount: 0,
})); }));
const data = { const data = {
title, title,
description, description,
options : optionsData, options: optionsData,
creatorId: userId creatorId: userId,
} };
const poll = await createPollByData(data); const poll = await createPollByData(data);
return poll; return poll;
} } catch (err) {
catch(err){ throw err;
throw err; }
}
} }
export async function getPollDataService(pollId) { export async function getPollDataService(pollId) {
try { try {
const poll = await findPollById(pollId); const poll = await findPollById(pollId);
if (!poll) { if (!poll) {
throw { throw {
statusCode: 404, statusCode: 404,
message: "Poll not found" message: "Poll not found",
} };
}
const {creatorId, ...pollData} = poll._doc;
const {username, _id, ...creatorData} = creatorId._doc;
return {pollData, creatorData : {username, _id}};
}
catch(err){
throw err;
} }
const { creatorId, ...pollData } = poll._doc;
const { username, _id, ...creatorData } = creatorId._doc;
return { pollData, creatorData: { username, _id } };
} catch (err) {
throw err;
}
} }
export async function getAllCreatedPollsService(id) { export async function getAllCreatedPollsService(id) {
try { try {
const polls = await findPollsByCreatorId(id); const polls = await findPollsByCreatorId(id);
return polls; return polls;
} } catch (err) {
catch(err){ throw err;
throw err; }
}
} }
export async function deletePollService(pollId, user) { export async function deletePollService(pollId, user) {
try { try {
const userId = user._id; const userId = user._id;
const poll = await findPollById(pollId); const poll = await findPollById(pollId);
if (!poll) { if (!poll) {
throw { throw {
statusCode: 404, statusCode: 404,
message: "Poll not found" message: "Poll not found",
} };
}
console.log(poll?.creatorId._id.toString(), userId.toString(), user);
if (poll.creatorId._id.toString() !== userId.toString()) {
throw {
statusCode: 401,
message: "Unauthorized"
}
}
const deletedPoll = await deletePollById(pollId);
return deletedPoll;
} }
console.log(poll?.creatorId._id.toString(), userId.toString(), user);
catch(err){ if (poll.creatorId._id.toString() !== userId.toString()) {
throw err; throw {
statusCode: 401,
message: "Unauthorized",
};
} }
const deletedPoll = await deletePollById(pollId);
return deletedPoll;
} catch (err) {
throw err;
}
} }
export async function createVoteService(pollId, userId, optionId) { export async function createVoteService(pollId, userId, optionId) {
try { try {
// vote already voted // vote already voted
const vote = await findVoteByPollIdAndUserId(pollId, userId); const vote = await findVoteByPollIdAndUserId(pollId, userId);
if (vote) { if (vote) {
throw { throw {
statusCode: 400, statusCode: 400,
message: "You have already voted on this poll" message: "You have already voted on this poll",
} };
}
console.log(pollId, userId, optionId);
const poll = await findPollById(pollId);
if (!poll) {
throw {
statusCode: 404,
message: "Poll not found"
}
}
const updatedPollData = await updatePollVoteCount(pollId, optionId);
const createdVote = await createVote(pollId, userId, optionId);
console.log(updatedPollData)
return createVote;
} }
catch(err){ console.log(pollId, userId, optionId);
throw err; const poll = await findPollById(pollId);
if (!poll) {
throw {
statusCode: 404,
message: "Poll not found",
};
} }
const updatedPollData = await updatePollVoteCount(pollId, optionId);
const createdVote = await createVote(pollId, userId, optionId);
console.log(updatedPollData);
return createVote;
} catch (err) {
throw err;
}
}
export async function addToBookMarkService(pollId, user) {
try {
const exits = user?.bookmarks.findIndex((id) => id.toString() == pollId);
const poll = await findPollById(pollId);
if (!poll) {
throw {
statusCode: 404,
message: "Poll dont exits.",
};
}
let updatedData;
let message;
if (exits == -1) {
updatedData = await addPollIdToBookmark(user._id, poll._id);
message = "Added to bookmark successfully.";
} else {
updatedData = await removePollIdFromBookmark(user._id, poll._id);
message = "Removed from bookmark successfully.";
}
return {
updatedData,
message,
};
} catch (err) {
throw err;
}
} }