165 lines
4.7 KiB
JavaScript
165 lines
4.7 KiB
JavaScript
|
|
const db = require("../utils/database");
|
||
|
|
|
||
|
|
exports.searchProductsByName = async (req, res) => {
|
||
|
|
const { name } = req.query;
|
||
|
|
|
||
|
|
if (name.length === 0) {
|
||
|
|
console.log("Searching for products with no name", name);
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log("Searching for products with name:", name);
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Modify SQL to return all products when no search term is provided
|
||
|
|
const sql = `
|
||
|
|
SELECT p.*, i.URL as image
|
||
|
|
FROM Product p
|
||
|
|
LEFT JOIN Image_URL i ON p.ProductID = i.ProductID
|
||
|
|
${name ? "WHERE p.Name LIKE ?" : ""}
|
||
|
|
ORDER BY p.ProductID
|
||
|
|
`;
|
||
|
|
|
||
|
|
const params = name ? [`%${name}%`] : [];
|
||
|
|
console.log("Executing SQL:", sql);
|
||
|
|
console.log("With parameters:", params);
|
||
|
|
|
||
|
|
const [data] = await db.execute(sql, params);
|
||
|
|
|
||
|
|
console.log("Raw Database Result:", data);
|
||
|
|
|
||
|
|
if (data.length === 0) {
|
||
|
|
console.log("No products found matching:", name);
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: "No products found matching your search",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Group products by ProductID to handle multiple images per product
|
||
|
|
const productsMap = new Map();
|
||
|
|
|
||
|
|
data.forEach((row) => {
|
||
|
|
if (!productsMap.has(row.ProductID)) {
|
||
|
|
const product = {
|
||
|
|
ProductID: row.ProductID,
|
||
|
|
Name: row.Name,
|
||
|
|
Description: row.Description,
|
||
|
|
Price: row.Price,
|
||
|
|
images: row.image,
|
||
|
|
};
|
||
|
|
productsMap.set(row.ProductID, product);
|
||
|
|
} else if (row.image_url) {
|
||
|
|
productsMap.get(row.ProductID).images.push(row.image_url);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
const products = Array.from(productsMap.values());
|
||
|
|
|
||
|
|
console.log("Processed Products:", products);
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
success: true,
|
||
|
|
message: "Products fetched successfully",
|
||
|
|
data: products,
|
||
|
|
count: products.length,
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error("Database Error:", error);
|
||
|
|
return res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "Database error occurred",
|
||
|
|
error: error.message || "Unknown database error",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// exports.searchProductsByName = async (req, res) => {
|
||
|
|
// const { name } = req.query;
|
||
|
|
|
||
|
|
// // Add better validation and error handling
|
||
|
|
// if (!name || typeof name !== "string") {
|
||
|
|
// return res.status(400).json({
|
||
|
|
// success: false,
|
||
|
|
// message: "Valid search term is required",
|
||
|
|
// });
|
||
|
|
// }
|
||
|
|
|
||
|
|
// console.log("Searching for products with name:", name);
|
||
|
|
|
||
|
|
// try {
|
||
|
|
// // Log the SQL query and parameters for debugging
|
||
|
|
// const sql = `
|
||
|
|
// SELECT p.*, i.URL AS image_url
|
||
|
|
// FROM Product p
|
||
|
|
// LEFT JOIN Image_URL i ON p.ProductID = i.ProductID
|
||
|
|
// WHERE p.Name LIKE ?
|
||
|
|
// `;
|
||
|
|
// const params = [`%${name}%`];
|
||
|
|
// console.log("Executing SQL:", sql);
|
||
|
|
// console.log("With parameters:", params);
|
||
|
|
|
||
|
|
// const [data] = await db.execute(sql, params);
|
||
|
|
|
||
|
|
// // Log raw data for debugging
|
||
|
|
// console.log("Raw Database Result:", data);
|
||
|
|
|
||
|
|
// if (data.length === 0) {
|
||
|
|
// console.log("No products found matching:", name);
|
||
|
|
// return res.status(404).json({
|
||
|
|
// success: false,
|
||
|
|
// message: "No products found matching your search",
|
||
|
|
// });
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // Group products by ProductID to handle multiple images per product
|
||
|
|
// const productsMap = new Map();
|
||
|
|
|
||
|
|
// data.forEach((row) => {
|
||
|
|
// if (!productsMap.has(row.ProductID)) {
|
||
|
|
// // Create a clean object without circular references
|
||
|
|
// const product = {
|
||
|
|
// ProductID: row.ProductID,
|
||
|
|
// Name: row.Name,
|
||
|
|
// Description: row.Description,
|
||
|
|
// Price: row.Price,
|
||
|
|
// // Add any other product fields you need
|
||
|
|
// images: row.image_url ? [row.image_url] : [],
|
||
|
|
// };
|
||
|
|
// productsMap.set(row.ProductID, product);
|
||
|
|
// } else if (row.image_url) {
|
||
|
|
// // Add additional image to existing product
|
||
|
|
// productsMap.get(row.ProductID).images.push(row.image_url);
|
||
|
|
// }
|
||
|
|
// });
|
||
|
|
|
||
|
|
// // Convert map to array of products
|
||
|
|
// const products = Array.from(productsMap.values());
|
||
|
|
|
||
|
|
// // Log processed products for debugging
|
||
|
|
// console.log("Processed Products:", products);
|
||
|
|
|
||
|
|
// res.json({
|
||
|
|
// success: true,
|
||
|
|
// message: "Products fetched successfully",
|
||
|
|
// data: products,
|
||
|
|
// count: products.length,
|
||
|
|
// });
|
||
|
|
// } catch (error) {
|
||
|
|
// // Enhanced error logging
|
||
|
|
// console.error("Database Error Details:", {
|
||
|
|
// message: error.message,
|
||
|
|
// code: error.code,
|
||
|
|
// errno: error.errno,
|
||
|
|
// sqlState: error.sqlState,
|
||
|
|
// sqlMessage: error.sqlMessage,
|
||
|
|
// sql: error.sql,
|
||
|
|
// });
|
||
|
|
|
||
|
|
// return res.status(500).json({
|
||
|
|
// success: false,
|
||
|
|
// message: "Database error occurred",
|
||
|
|
// error: error.message || "Unknown database error",
|
||
|
|
// });
|
||
|
|
// }
|
||
|
|
// };
|