first commit
This commit is contained in:
245
src/controllers/users/wishlistController.js
Normal file
245
src/controllers/users/wishlistController.js
Normal file
@@ -0,0 +1,245 @@
|
||||
const { prisma } = require('../../config/database');
|
||||
// import Product from '../../models/mongodb/Product';
|
||||
const Product = require('../../models/mongodb/Product');
|
||||
|
||||
|
||||
// exports.getWishlist = async (req, res, next) => {
|
||||
// try {
|
||||
// const wishlist = await prisma.wishlistItem.findMany({
|
||||
// where: { userId: req.user.id },
|
||||
// orderBy: { createdAt: 'desc' },
|
||||
// });
|
||||
|
||||
// // Fetch product details from MongoDB
|
||||
// const detailedWishlist = await Promise.all(
|
||||
// wishlist.map(async item => {
|
||||
// const product = await Product.findById(item.productId).select(
|
||||
// 'name basePrice variants images'
|
||||
// );
|
||||
|
||||
// return {
|
||||
// ...item,
|
||||
// product: product || null,
|
||||
// };
|
||||
// })
|
||||
// );
|
||||
|
||||
// // res.json({ success: true, data: { wishlist } });
|
||||
// return res.status(200).json({
|
||||
// // statusCode: 200,
|
||||
// status: true,
|
||||
// message: 'Wishlist fetched successfully',
|
||||
// // data: { wishlist },
|
||||
// data: { wishlist: detailedWishlist },
|
||||
// });
|
||||
// } catch (error) {
|
||||
// next(error);
|
||||
// }
|
||||
// };
|
||||
|
||||
// exports.addToWishlist = async (req, res, next) => {
|
||||
// try {
|
||||
// const { productId } = req.body;
|
||||
// // if (!productId) return res.status(400).json({ success: false, message: 'Product ID is required' });
|
||||
|
||||
// if (!productId) {
|
||||
// return res.status(400).json({
|
||||
// statusCode: 400,
|
||||
// status: false,
|
||||
// message: 'Product ID is required',
|
||||
// });
|
||||
// }
|
||||
|
||||
// const existing = await prisma.wishlistItem.findUnique({
|
||||
// where: { userId_productId: { userId: req.user.id, productId } },
|
||||
// });
|
||||
// // if (existing) return res.status(400).json({ success: false, message: 'Item already in wishlist' });
|
||||
// if (existing) {
|
||||
// return res.status(400).json({
|
||||
// statusCode: 400,
|
||||
// status: false,
|
||||
// message: 'Item already in wishlist',
|
||||
// });
|
||||
// }
|
||||
|
||||
// const item = await prisma.wishlistItem.create({
|
||||
// data: { userId: req.user.id, productId },
|
||||
// });
|
||||
// // res.status(201).json({ success: true, message: 'Item added to wishlist', data: { item } });
|
||||
// return res.status(201).json({
|
||||
// statusCode: 201,
|
||||
// status: true,
|
||||
// message: 'Item added to wishlist',
|
||||
// data: { item },
|
||||
// });
|
||||
// } catch (error) {
|
||||
// next(error);
|
||||
// }
|
||||
// };
|
||||
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
exports.getWishlist = async (req, res, next) => {
|
||||
try {
|
||||
const wishlist = await prisma.wishlistItem.findMany({
|
||||
where: { userId: req.user.id },
|
||||
orderBy: { createdAt: "desc" },
|
||||
});
|
||||
|
||||
const detailedWishlist = await Promise.all(
|
||||
wishlist.map(async (item) => {
|
||||
let product = null;
|
||||
|
||||
// Only try MongoDB lookup if valid ObjectId
|
||||
if (mongoose.Types.ObjectId.isValid(item.productId)) {
|
||||
product = await Product.findById(item.productId).select(
|
||||
"name basePrice variants images"
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
...item,
|
||||
product: product || null,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
return res.status(200).json({
|
||||
status: true,
|
||||
message: "Wishlist fetched successfully",
|
||||
data: { wishlist: detailedWishlist },
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// exports.addToWishlist = async (req, res, next) => {
|
||||
// try {
|
||||
// const { productId } = req.body;
|
||||
|
||||
// if (!productId) {
|
||||
// return res.status(400).json({
|
||||
// statusCode: 400,
|
||||
// status: false,
|
||||
// message: 'Product ID is required',
|
||||
// });
|
||||
// }
|
||||
|
||||
// const existing = await prisma.wishlistItem.findUnique({
|
||||
// where: { userId_productId: { userId: req.user.id, productId } },
|
||||
// });
|
||||
|
||||
// if (existing) {
|
||||
// return res.status(400).json({
|
||||
// statusCode: 400,
|
||||
// status: false,
|
||||
// message: 'Item already in wishlist',
|
||||
// });
|
||||
// }
|
||||
|
||||
// const item = await prisma.wishlistItem.create({
|
||||
// data: { userId: req.user.id, productId },
|
||||
// });
|
||||
|
||||
// return res.status(201).json({
|
||||
// statusCode: 201,
|
||||
// status: true,
|
||||
// message: 'Item added to wishlist',
|
||||
// data: { item },
|
||||
// });
|
||||
// } catch (error) {
|
||||
// next(error);
|
||||
// }
|
||||
// };
|
||||
|
||||
|
||||
// const mongoose = require("mongoose");
|
||||
|
||||
exports.addToWishlist = async (req, res, next) => {
|
||||
try {
|
||||
const { productId } = req.body;
|
||||
|
||||
if (!productId) {
|
||||
return res.status(400).json({
|
||||
statusCode: 400,
|
||||
status: false,
|
||||
message: "Product ID is required",
|
||||
});
|
||||
}
|
||||
|
||||
// 1️⃣ Validate ObjectId
|
||||
if (!mongoose.Types.ObjectId.isValid(productId)) {
|
||||
return res.status(400).json({
|
||||
status: false,
|
||||
message: "Invalid product ID (must be MongoDB ObjectId)",
|
||||
});
|
||||
}
|
||||
|
||||
// 2️⃣ Ensure product exists in MongoDB
|
||||
const productExists = await Product.findById(productId);
|
||||
if (!productExists) {
|
||||
return res.status(404).json({
|
||||
status: false,
|
||||
message: "Product not found in database",
|
||||
});
|
||||
}
|
||||
|
||||
// 3️⃣ Check duplicate
|
||||
const existing = await prisma.wishlistItem.findUnique({
|
||||
where: { userId_productId: { userId: req.user.id, productId } },
|
||||
});
|
||||
|
||||
if (existing) {
|
||||
return res.status(400).json({
|
||||
status: false,
|
||||
message: "Item already in wishlist",
|
||||
});
|
||||
}
|
||||
|
||||
// 4️⃣ Save VALID productId in Prisma
|
||||
const item = await prisma.wishlistItem.create({
|
||||
data: { userId: req.user.id, productId },
|
||||
});
|
||||
|
||||
return res.status(201).json({
|
||||
status: true,
|
||||
message: "Item added to wishlist",
|
||||
data: { item },
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
exports.removeFromWishlist = async (req, res, next) => {
|
||||
try {
|
||||
const { productId } = req.params;
|
||||
const existing = await prisma.wishlistItem.findUnique({
|
||||
where: { userId_productId: { userId: req.user.id, productId } },
|
||||
});
|
||||
// if (!existing) return res.status(404).json({ success: false, message: 'Item not found' });
|
||||
|
||||
if (!existing) {
|
||||
return res.status(404).json({
|
||||
statusCode: 404,
|
||||
status: false,
|
||||
message: 'Item not found in wishlist',
|
||||
});
|
||||
}
|
||||
|
||||
await prisma.wishlistItem.delete({
|
||||
where: { userId_productId: { userId: req.user.id, productId } },
|
||||
});
|
||||
// res.json({ success: true, message: 'Item removed from wishlist' });
|
||||
return res.status(200).json({
|
||||
statusCode: 200,
|
||||
status: true,
|
||||
message: 'Item removed from wishlist',
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user