diff --git a/dbAPI.js b/dbAPI.js deleted file mode 100644 index 82f2c587bb68a3da5e8ecdb4324578b5b52041dd..0000000000000000000000000000000000000000 --- a/dbAPI.js +++ /dev/null @@ -1,71 +0,0 @@ -/* var http = require('http'); -var url = require('url'); -var fs = require('fs'); -http.createServer(function (req, res) { - var q = url.parse(req.url, true); - var filename = "." + q.pathname; - fs.readFile(filename, function(err, data) { - if(err){ - res.writeHead(404, {'Content-type': 'text/html'}); - return res.end("404 Not Found"); - } - res.writeHead(200, {'Content-Type': 'text/html'}); - res.write(data); - return res.end(); - }); -}).listen(8080); */ - -const {Pool} = require('pg'); -const fs = require('fs'); -const { resolve } = require('path'); -const { rejects } = require('assert'); - -const pool = new Pool({ - host: 'localhost', - user: 'postgres', - port: 5432, - password: 'Yasham1984', - database: 'your-fashion-data' -}); - -//pool.connect(); - -/* pool.query('select * from Users', (err, res) => { - if(!err){ - console.log(res.rows); - console.log('connected'); - }else{ - console.log(err.message); - } - client.end; -}); */ - -const readImage = (path) => { - return new Promise((resolve, reject) => { - fs.readFile(path, (err, data) => { - if(err){ - reject(err); - }else{ - resolve(data); - } - }); - }); -}; - -const insertProduct = async (productID, product_name, description, price, stock_level, imagePath, tag) => { - try{ - const client = await pool.connect(); - const image = await readImage(imagePath); - const query = 'INSERT INTO Products (productID, product_name, description, price, stock_level, image, tag) VALUES ($1, $2, $3, $4, $5, $6, $7)'; - const values = [productID, product_name, description, price, stock_level, image, tag]; - await client.query(query, values); - console.log('Product inserted successfully.'); - client.release(); - }catch(err){ - console.log(err.message); - } -}; - -insertProduct(1, 'Blue Shirt', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua..', -29.99, 10, 'images/BlueShirt.jpg', 'BlueShirt'); - diff --git a/public/shopping-basket.js b/public/shopping-basket.js index e822799acd89f791849c9df637a7774367fd8f86..7d55ca5f7b14acba927a3964335d1e97a534b334 100644 --- a/public/shopping-basket.js +++ b/public/shopping-basket.js @@ -1,59 +1,38 @@ -const carts = document.querySelectorAll('.add-cart-btn'); -let products = []; +async function populateProducts(endpoint) { + const container = document.querySelector('.container'); -async function getProducts() { - try { - const response = await fetch('http://localhost:5000/products'); - if (!response.ok) { - throw new Error('Failed to fetch products'); - } - const data = await response.json(); // Parse response body as JSON - products = data.products; - //console.log(data.products); - - // Split products into pages and sections - // const numPages = 6; - //const numSectionsPerPage = 6; - // products = ({tag, name}) => products.find(a => a.some(o => o.tag === tag || o.name === name)); - //let getArray = ({tag, name}) => products.find(a => a.some(o => o.tag === tag || o.name === name)); - populateProducts(); - } catch (error) { - console.error('Error fetching products:', error); + if(!container){ + console.error('Container element not found'); + return; } - console.log('Products:', products); -} - + + try{ + const response = await fetch(endpoint); + const products = await response.json(); +/* const response1 = await fetch('/women-products'); + const womenProducts = await response1.json(); + const products = menProducts.concat(womenProducts); */ -getProducts(); + container.innerHTML = ''; -//splits an array into chuncks -/* function chunkArray(arr, chunkSize) { - const chunkedArray = []; - for (let i = 0; i < arr.length; i += chunkSize) { - chunkedArray.push(arr.slice(i, i + chunkSize)); - } - return chunkedArray; -} */ -function populateProducts() { - const container = document.querySelector('.container'); - - if (container) { - const productsHtml = products.map(product => ` + products.forEach(product => { + const productsHtml = document.createElement('div'); + productsHtml.innerHTML = ` <div class="product"> <div class="product-card"> <h2 class="name">${product.name}</h2> <span class="price">£${product.price}</span> <a class="popup-btn">Quick View</a> - <img src="${product.Image}" class="product-img" alt="Image of ${product.name}"> + <img src="${product.image}" class="product-img" alt="Image of ${product.name}"> </div> <div class="popup-view"> <div class="popup-card"> <a><i class="fas fa-times close-btn"></i></a> <div class="product-img"> - <img src="${product.Image}" alt="Image of ${product.name}"> + <img src="${product.image}" alt="Image of ${product.name}"> </div> <div class="info"> <h2>Your fashion<br><span>Modern styles</span></h2> @@ -65,12 +44,51 @@ function populateProducts() { </div> </div> </div> - `).join(''); + `; + container.appendChild(productsHtml); + + - container.innerHTML = productsHtml; - addCartActions(container); - } + if(products.image){ + const img = new Image(); + img.src =`data:image/jpeg;base64,${product.image.toString('base64')}`; + productsHtml.appendChild(img); + } + +/* if(container){ + container.appendChild(productsHtml); + }else{ + console.error('Container element not found'); + } */ + }); +}catch (error){ + console.error('Failed to populate products:', error); } + //console.log(container); + addCartActions(container); +} +document.addEventListener('DOMContentLoaded', (event) => { + const menProductsLink = document.getElementById('men-products'); + const womenProductsLink = document.getElementById('women-products'); + + if (menProductsLink) { + menProductsLink.addEventListener('click', (e) => { + e.preventDefault(); // Prevent the default link behavior + populateProducts('/men-products'); + }); + } else { + console.error("Men's products link not found."); + } + + if (womenProductsLink) { + womenProductsLink.addEventListener('click', (e) => { + e.preventDefault(); // Prevent the default link behavior + populateProducts('/women-products'); + }); + } else { + console.error("Women's products link not found."); + } +}); @@ -80,6 +98,7 @@ function populateProducts() { function addCartActions(container) { + const products = []; var popupViews = document.querySelectorAll('.popup-view'); var popupBtns = document.querySelectorAll('.popup-btn'); @@ -113,14 +132,6 @@ function addCartActions(container) { } } -/* for (let i = 0; i < carts.length; i++) { - carts[i].addEventListener('click', () => { - cardsNumbers(products[i]); - totalCost(products[i]); - }); -} */ - - function onLoadCardsNumbers() { let productNumber = localStorage.getItem('cardsNumbers'); diff --git a/server.js b/server.js index d060f1ab86ac5e8e53f2738c7ae145a8351bf8b0..a40f42f79570ed096da17d8d37e17118eccda7cd 100644 --- a/server.js +++ b/server.js @@ -1,17 +1,65 @@ const express = require('express'); const path = require('path'); +const {Pool} = require('pg'); const app = express(); -const publicDirectory = path.join(__dirname, './public'); +const port = 5000; + +const pool = new Pool({ + host: 'localhost', + user: 'postgres', + port: 5432, + password: 'Yasham1984', + database: 'your-fashion-data' +}); + + -/* console.log(__dirname); -console.log(publicDirectory); */ +//Server static files from 'public' directory and CSS from '0public/css' +app.use(express.json()); +const publicDirectory = path.join(__dirname, './public'); app.use(express.static(publicDirectory)); app.set('view engine', 'hbs'); + + +app.use(express.static('./css')); + +//Routes setup app.use('/', require('./routes/pages')); app.use('/products', require('./routes/productsRouteFile')); -app.use('/images', express.static('./public/images')); -app.listen(5000, () => { - console.log("Server is listening on port 5000"); +app.get('/', (req, res) => { + res.send('Welcome to your fashion online shop'); }); + +//query for men-products +app.get('/men-products', async (req, res) => { + try{ + const client = await pool.connect(); + const { rows } = await client.query("SELECT * FROM products WHERE category = 'men' LIMIT 6"); + res.json(rows); + client.release(); + }catch(err){ + res.status(500).send('Server error'); + console.error(err); + } +}); +//query for women-products +app.get('/women-products', async (req, res) => { + try{ + const client = await pool.connect(); + const { rows } = await client.query("SELECT * FROM products WHERE category = 'women'"); + res.json(rows); + client.release(); + }catch(err){ + res.status(500).send('Server error'); + console.error('Error exucting query', err.stack); + } +}); + +app.listen(port, () => { + console.log(`Server is listening on port ${port}`); +}); + + + diff --git a/views/index.hbs b/views/index.hbs index 4842f7cfb6f73fefda2f8cace876d6984e78b44e..4feb76698cf9e88ec2206505736fce3dd7a050f4 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -40,10 +40,10 @@ <li class="nav-item"> - <a class="nav-link" href="/men">Men</a> + <a class="nav-link" id="men-products" href="/men">Men</a> </li> <li class="nav-item"> - <a class="nav-link" href="/women">Women</a> + <a class="nav-link" id="women-products" href="/women">Women</a> </li> <li class="nav-item"> <a class="nav-link" href="/kids">Kids</a> @@ -83,7 +83,7 @@ <div class="carousel__cell"><img class="slides" src="https://cdn.shopify.com/s/files/1/0878/3908/files/social_sharing_shopify.jpg?v=1667977060"></div> <div class="carousel__cell"><img class="slides" src="https://www.nextdirect.com/nxtcms/resource/blob/5587208/f0e6f37c9c409a172eb0ca2236449efb/hero1-kids-data.jpg"></div> <div class="carousel__cell"><img class="slides" src="https://i.ebayimg.com/images/g/9bEAAOSwmh9ez480/s-l1200.webp"></div> - <div class="carousel__cell"><img class="slides" src="https://cdn-fnknc.nitrocdn.com/jwqHRGAzpUgGskUSHlppNQzwuXgXIKwg/assets/images/optimized/rev-b97e6c5/www.fashionbeans.com/wp-content/uploads/2017/11/50britishbrands-3.jpg"></div> + <div class="carousel__cell"><img class="slides" src="https://www.nerdwallet.com/assets/blog/wp-content/uploads/2021/09/GettyImages-1174825598-2400x1440.jpg"></div> <div class="carousel__cell"><img class="slides" src="https://www.realmenrealstyle.com/wp-content/uploads/2023/08/Promote-Positive-Communication.jpg"></div> <div class="carousel__cell"><img class="slides" src="https://i.insider.com/62e40d594b455800188b5fca?width=700"></div> </div> diff --git a/views/men.hbs b/views/men.hbs index f9038097a473f5b1606b784d666e97eafbe35351..683610e64cf140f68fdb3389ca977da1c6633beb 100644 --- a/views/men.hbs +++ b/views/men.hbs @@ -38,10 +38,10 @@ <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <li class="nav-item"> - <a class="nav-link" href="/men">Men</a> + <a class="nav-link" id="men-products" href="/men">Men</a> </li> <li class="nav-item"> - <a class="nav-link" href="/women">Women</a> + <a class="nav-link" id="women-products" href="/women">Women</a> </li> <li class="nav-item"> <a class="nav-link" href="/kids">Kids</a> diff --git a/views/women.hbs b/views/women.hbs index 7024c1825cec9209e88f70d0804518b7613ed7c8..3b0e6c42a6b4bf02809ce9067440b5acd6934e84 100644 --- a/views/women.hbs +++ b/views/women.hbs @@ -66,7 +66,7 @@ </header> <div id="characterList" class="characterLists"></div> - <div class="container"></div> + <div class="container" id="container"></div> <script src="/product-cards.js"></script>