Files
SkyArtShop/backend/routes/public.js
Local Server e4b3de4a46 Updatweb
2025-12-19 20:44:46 -06:00

180 lines
4.6 KiB
JavaScript

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;