const express = require("express"); const { query } = require("../config/database"); const logger = require("../config/logger"); const { asyncHandler } = require("../middleware/errorHandler"); const { sendSuccess, sendError, sendNotFound, } = require("../utils/responseHelpers"); const router = express.Router(); const handleDatabaseError = (res, error, context) => { logger.error(`${context} error:`, error); sendError(res); }; // Get all products router.get( "/products", asyncHandler(async (req, res) => { const result = await query( `SELECT id, name, description, shortdescription, price, imageurl, images, category, color, stockquantity, isactive, createdat FROM products WHERE isactive = true ORDER BY createdat DESC` ); sendSuccess(res, { products: result.rows }); }) ); // Get featured products router.get( "/products/featured", asyncHandler(async (req, res) => { const limit = parseInt(req.query.limit) || 4; const result = await query( `SELECT id, name, description, price, imageurl, images FROM products WHERE isactive = true ORDER BY createdat DESC LIMIT $1`, [limit] ); sendSuccess(res, { products: result.rows }); }) ); // Get single product router.get( "/products/:id", asyncHandler(async (req, res) => { const result = await query( "SELECT * FROM products WHERE id = $1 AND isactive = true", [req.params.id] ); if (result.rows.length === 0) { return sendNotFound(res, "Product"); } sendSuccess(res, { product: result.rows[0] }); }) ); // Get site settings router.get( "/settings", asyncHandler(async (req, res) => { const result = await query("SELECT * FROM sitesettings LIMIT 1"); sendSuccess(res, { settings: result.rows[0] || {} }); }) ); // Get homepage sections router.get( "/homepage/sections", asyncHandler(async (req, res) => { const result = await query( "SELECT * FROM homepagesections ORDER BY displayorder ASC" ); sendSuccess(res, { sections: result.rows }); }) ); // Get portfolio projects router.get( "/portfolio/projects", asyncHandler(async (req, res) => { const result = await query( `SELECT id, title, description, featuredimage, images, category, categoryid, isactive, createdat FROM portfolioprojects WHERE isactive = true ORDER BY displayorder ASC, createdat DESC` ); sendSuccess(res, { projects: result.rows }); }) ); // Get blog posts router.get( "/blog/posts", asyncHandler(async (req, res) => { const result = await query( `SELECT id, title, slug, excerpt, content, imageurl, ispublished, createdat FROM blogposts WHERE ispublished = true ORDER BY createdat DESC` ); sendSuccess(res, { posts: result.rows }); }) ); // Get single blog post by slug router.get( "/blog/posts/:slug", asyncHandler(async (req, res) => { const result = await query( "SELECT * FROM blogposts WHERE slug = $1 AND ispublished = true", [req.params.slug] ); if (result.rows.length === 0) { return sendNotFound(res, "Blog post"); } sendSuccess(res, { post: result.rows[0] }); }) ); // Get custom pages router.get( "/pages", asyncHandler(async (req, res) => { const result = await query( `SELECT id, title, slug, content, metatitle, metadescription, isactive, createdat FROM pages WHERE isactive = true ORDER BY createdat DESC` ); sendSuccess(res, { pages: result.rows }); }) ); // Get single page by slug router.get( "/pages/:slug", asyncHandler(async (req, res) => { const result = await query( "SELECT * FROM pages WHERE slug = $1 AND isactive = true", [req.params.slug] ); if (result.rows.length === 0) { return sendNotFound(res, "Page"); } sendSuccess(res, { page: result.rows[0] }); }) ); // Get menu items for frontend navigation router.get( "/menu", asyncHandler(async (req, res) => { const result = await query( "SELECT settings FROM site_settings WHERE key = 'menu'" ); const items = result.rows.length > 0 ? result.rows[0].settings.items || [] : []; const visibleItems = items.filter((item) => item.visible !== false); sendSuccess(res, { items: visibleItems }); }) ); // Get homepage settings for frontend router.get( "/homepage/settings", asyncHandler(async (req, res) => { const result = await query( "SELECT settings FROM site_settings WHERE key = 'homepage'" ); const settings = result.rows.length > 0 ? result.rows[0].settings : {}; sendSuccess(res, { settings }); }) ); module.exports = router;