From 70c563f8183ade4ab638439c5dc3c6031e2e8aa1 Mon Sep 17 00:00:00 2001 From: Max Hunt Date: Sat, 16 May 2020 12:01:03 +0100 Subject: [PATCH] Update --- functions/index.js | 74 ++++++++----- functions/views/add-item.ejs | 2 +- functions/views/css/style.css | 22 +++- functions/views/home.ejs | 4 - functions/views/js/fdb.js | 163 +++++++++++++++++----------- functions/views/partials/header.ejs | 8 +- server.js | 72 +++++++----- 7 files changed, 218 insertions(+), 127 deletions(-) diff --git a/functions/index.js b/functions/index.js index 8855d33..c264d01 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,10 +1,10 @@ -const functions = require('firebase-functions'); +const functions = require('firebase-functions') let express = require('express') let logger = require('morgan') let bodyParser = require('body-parser') -let admin = require("firebase-admin"); -let serviceAccount = require("./project-gg-3b754-firebase-adminsdk-4848h-5a5778b77b.json"); +let admin = require("firebase-admin") +let serviceAccount = require("./project-gg-3b754-firebase-adminsdk-4848h-5a5778b77b.json") let firebaseadmin = admin.initializeApp({ credential: admin.credential.cert(serviceAccount), @@ -14,7 +14,7 @@ let database = firebaseadmin.database() let app = express() app.use(bodyParser.urlencoded({extended: true})) -app.use(bodyParser.json({ limit: '10mb' })); +app.use(bodyParser.json()) app.use(logger('dev')) app.use(express.static('views')) @@ -44,12 +44,7 @@ function homePage(request, responce) { dbRef.orderByChild("status").equalTo("on-sale").limitToLast(5).once('value', function(snapshot){ var data = {} if (snapshot.val()) {data = snapshot.val()} - var x = "none" - if (request.query.itemAdded == "true") { - x = 'block' - } - console.log(data) - responce.render('home.ejs', {products: data, message: x}) + responce.render('home.ejs', {products: data}) }) } @@ -101,7 +96,7 @@ app.get('/my-products', function(request, responce){ if (request.query.uToken) { admin.auth().verifyIdToken(request.query.uToken) .then(function(decodedToken) { - let uid = decodedToken.uid; + let uid = decodedToken.uid var dbRef = database.ref("/products") if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { @@ -153,7 +148,7 @@ app.get('/my-product', function(request, responce){ .catch(function(error) { console.log(error) responce.send("

Bad Auth Token

Home") - }); + }) } else { responce.send("

No Auth Token Provided

Home") @@ -186,7 +181,7 @@ app.get('/edit-item', function(request, responce){ .catch(function(error) { console.log(error) responce.send("

Bad Auth Token

Home") - }); + }) } else { responce.send("

No Auth Token Provided

Home") @@ -250,11 +245,10 @@ app.post('/register-new-user-api', async function(request, responce){ let usersRef = database.ref('/users') let result = await usersRef.push(uData) let key = result.key - let imgPath = key + '/' + pPic ///this is problematic - let imgRootPath = "/user-img/" + imgPath + let imgPath = "/user-img/" + key + '/' + pPic ///this is problematic let userRef = database.ref('/users/' + key) userRef.update({pPic:imgPath}) - .then(responce.send({success:true, error:null, imgRef:imgRootPath})) + .then(responce.send({success:true, error:null, imgRef:imgPath})) .catch(e=>{ responce.send({success:false, error:e}) }) @@ -395,8 +389,8 @@ app.post('/login-user-api', function(request, responce){ }) app.post('/shipping-adress-edit-api', function(request, responce){ - if (request.body.uToken && request.body.address) { - admin.auth().verifyIdToken(request.body.uToken) + if (request.body.authToken && request.body.address) { + admin.auth().verifyIdToken(request.body.authToken) .then(async function(decodedToken) { let newAddress = request.body.address let uid = decodedToken.uid @@ -419,7 +413,35 @@ app.post('/shipping-adress-edit-api', function(request, responce){ .catch(function(error) { responce.send({success:false, error:'invalid auth token'}) console.log(error) - }); + }) + } + else { + responce.send({error: 'invalid data'}) + } +}) + +app.post('/shipping-adress-get-api', function(request, responce){ + if (request.body.authToken) { + admin.auth().verifyIdToken(request.body.authToken) + .then(async function(decodedToken) { + let uid = decodedToken.uid + + let snapshot = await checkUserExists(uid) + if (snapshot){ + let users = snapshot.val() + var keys = Object.keys(users) + let user = users[keys[0]] + let userAddress = user.address + responce.send({success:true, error:null, address:userAddress}) + } + else { + responce.send({success:false, error:'user does not exist'}) + } + }) + .catch(function(error) { + responce.send({success:false, error:'invalid auth token'}) + console.log(error) + }) } else { responce.send({error: 'invalid data'}) @@ -427,7 +449,7 @@ app.post('/shipping-adress-edit-api', function(request, responce){ }) app.post('/new-product-api', async function(request, responce){ - if (request.body.uToken && request.body.product && request.body.image) { + if (request.body.authToken && request.body.product && request.body.image) { let uid = await authCheck(request.body.authToken) if (uid) { if (await checkUserExists(uid)) { @@ -437,10 +459,10 @@ app.post('/new-product-api', async function(request, responce){ let newProductRef = database.ref('/products') newProductRef.push(product).then(key => { let productKey = key.key - let imgPath = productKey + '/' + imageName ///this is problematic + let imgPath = '/product-img/' + productKey + '/' + imageName ///this is problematic let productRef = database.ref('/products/' + productKey) productRef.update({img: imgPath}).then(function(){ - responce.send({success:true, imgRef:'/product-img/'+imgPath, error:null}) + responce.send({success:true, imgRef:imgPath, error:null}) }) .catch(e=>{ responce.send({success:false, error:e}) @@ -464,8 +486,8 @@ app.post('/new-product-api', async function(request, responce){ }) app.post('/update-product-api', function(request, responce){ - if (request.body.uToken && request.body.product && request.body.productID) { - admin.auth().verifyIdToken(request.body.uToken) + if (request.body.authToken && request.body.product && request.body.productID) { + admin.auth().verifyIdToken(request.body.authToken) .then(async function(decodedToken) { let uid = decodedToken.uid let product = request.body.product @@ -493,7 +515,7 @@ app.post('/update-product-api', function(request, responce){ .catch(function(error) { responce.send({success:false, error:'invalid auth token'}) console.log(error) - }); + }) } else { responce.send({error: 'invalid data'}) @@ -567,7 +589,7 @@ function sendEmail(address, content){ } transporter.sendMail(mailOptions, function(error, info){ if (error) { - console.log(error); + console.log(error) } }) } diff --git a/functions/views/add-item.ejs b/functions/views/add-item.ejs index b91a3b1..c85b494 100644 --- a/functions/views/add-item.ejs +++ b/functions/views/add-item.ejs @@ -66,7 +66,7 @@
- + diff --git a/functions/views/css/style.css b/functions/views/css/style.css index 67ab1e9..3dd4811 100644 --- a/functions/views/css/style.css +++ b/functions/views/css/style.css @@ -53,6 +53,10 @@ footer a { font-family: osl; } +input:focus, textarea:focus, select:focus{ + outline: none; +} + .page { background-color: white; } @@ -199,11 +203,25 @@ footer a { color: #898989; transition: 0.3s; } +.notifications:hover { + color: tomato; +} +.notifications:active { + transition: 0.1s; + color: cyan; +} .cart { color: #898989; transition: 0.3s; } +.cart:hover { + color: tomato; +} +.cart:active { + transition: 0.1s; + color: cyan; +} .sbar { height: 55px; @@ -222,7 +240,7 @@ footer a { } .sbar input { - border: 0.5px solid black; + border: 0.5px solid gray; display: inline-flex; position: relative; float: left; @@ -672,9 +690,9 @@ footer a { .ship-adress button:hover { background-color: pink; color: black; - transition: 0.1s; } .ship-adress button:active { + transition: 0.1s; background-color: white; } .ship-adress input { diff --git a/functions/views/home.ejs b/functions/views/home.ejs index 597f271..5010b8f 100644 --- a/functions/views/home.ejs +++ b/functions/views/home.ejs @@ -1,9 +1,5 @@ <%- include("partials/header") %> -
-

Product added successfully

-
-
diff --git a/functions/views/js/fdb.js b/functions/views/js/fdb.js index 0210e17..6a68124 100644 --- a/functions/views/js/fdb.js +++ b/functions/views/js/fdb.js @@ -1,62 +1,79 @@ -async function productSubmitEventHandler(){ - let newProduct = {id: 1,name: "",desc: "",img: "default.png",location: "",stock: 1,status: "on-sale",price: 0,owner: "",holder: ""} - - const nameField = document.getElementById('pName') - const descField = document.getElementById('pDesc') - const locField = document.getElementById('pLoc') - const stockField = document.getElementById('pStock') - const priceField = document.getElementById('pPrice') - - const imgBtn = document.getElementById('pImg') - - let sessUid = firebase.auth().currentUser.uid - - newProduct.id = 999 - newProduct.name = nameField.value - newProduct.desc = descField.value - newProduct.location = locField.value - if (stockField.value) { - newProduct.stock = stockField.value +function checkFields() { + if (document.getElementById('pName').value && document.getElementById('pDesc').value + && document.getElementById('pLoc').value && document.getElementById('pPrice').value + && document.getElementById('pImg').files[0].name) { + return true } - newProduct.price = priceField.value - newProduct.owner = sessUid - newProduct.holder = sessUid - - let image = imgBtn.files[0] - imageName = image.name - let imagePackage = {name:imageName, b64:null} + return false +} +async function productSubmitEventHandler(){ const submitBtn = document.getElementById('pSend') - submitBtn.innerHTML = "Uploading..." - submitBtn.disabled = true + if (submitBtn.innerHTML == "Submit!") { + if (checkFields()) { + submitBtn.innerHTML = "Uploading..." + submitBtn.disabled = true - firebase.auth().currentUser.getIdToken().then(function(idToken){ - let url = 'new-product-api' - let data = {uToken: idToken, product: newProduct, image: imagePackage} - let postData = {method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} - fetch(url, postData) - .then(response => response.json()) - .then(function(result){ - if (result.success) { - let imageRef = firebase.storage().ref(result.imgRef) - imageRef.put(image).then(function(){ - window.location.replace('home?itemAdded=true') + let newProduct = {id: 1,name: "",desc: "",img: "default.png",location: "",stock: 1,status: "on-sale",price: 0,owner: "",holder: ""} + + const nameField = document.getElementById('pName') + const descField = document.getElementById('pDesc') + const locField = document.getElementById('pLoc') + const stockField = document.getElementById('pStock') + const priceField = document.getElementById('pPrice') + const imgBtn = document.getElementById('pImg') + + let uid = firebase.auth().currentUser.uid + + newProduct.id = 999 + newProduct.name = nameField.value + newProduct.desc = descField.value + newProduct.location = locField.value + if (stockField.value) {newProduct.stock = stockField.value} + newProduct.price = priceField.value + newProduct.owner = uid + newProduct.holder = uid + + let image = imgBtn.files[0] + imageName = image.name + let imagePackage = {name:imageName, b64:null} + + firebase.auth().currentUser.getIdToken().then(function(idToken){ + let url = 'new-product-api' + let data = {authToken: idToken, product: newProduct, image: imagePackage} + let postData = {method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} + fetch(url, postData) + .then(response => response.json()) + .then(function(result){ + if (result.success) { + let imageRef = firebase.storage().ref(result.imgRef) + imageRef.put(image).then(function(){ + submitBtn.innerHTML = "Done! Go Home..." + submitBtn.disabled = false + submitBtn.setAttribute('style', 'background:#00FF55; transition:0.5s; width:500px;') + }) + .catch(e=>{ + submitBtn.innerHTML = "Error..." + submitBtn.setAttribute('style', 'color:red;') + document.getElementById("api-response").innerHTML = "Error: " + e + document.getElementById("api-response").setAttribute("style", "display: block") + }) + } + else { + submitBtn.innerHTML = "Error..." + submitBtn.setAttribute('style', 'color:red;') + document.getElementById("api-response").innerHTML = "Error: " + result.error + document.getElementById("api-response").setAttribute("style", "display: block") + } }) - .catch(e=>{ - submitBtn.innerHTML = "Error..." - submitBtn.setAttribute('style', 'color:red;') - document.getElementById("api-response").innerHTML = "Error: " + e - document.getElementById("api-response").setAttribute("style", "display: block") - }) - } - else { - submitBtn.innerHTML = "Error..." - submitBtn.setAttribute('style', 'color:red;') - document.getElementById("api-response").innerHTML = "Error: " + result.error - document.getElementById("api-response").setAttribute("style", "display: block") - } - }) - }) + }) + } else { + document.getElementById("api-response").innerHTML = "Fill in all required fields!" + document.getElementById("api-response").setAttribute("style", "display: block") + } + } else { + window.location.replace('home') + } } function productUpdateEventHandler() { @@ -78,7 +95,7 @@ function productUpdateEventHandler() { firebase.auth().currentUser.getIdToken().then(function(idToken){ let url = 'update-product-api' - let data = {uToken: idToken, product: updates, productID: item_id} + let data = {authToken: idToken, product: updates, productID: item_id} let postData = {method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} fetch(url, postData) .then(response => response.json()) @@ -104,18 +121,12 @@ function productUpdateEventHandler() { function updateImgs() { const storage = firebase.storage() - const productImgRef = storage.ref('/product-img') - const profileImgRef = storage.ref('/user-img') + const imgRef = storage.ref() var images = document.getElementsByClassName('dyn-img') - var pImages = document.getElementsByClassName('profile-img') // console.log(images) Array.from(images).forEach((image) => { - var pathReference = productImgRef.child(image.title) - pathReference.getDownloadURL().then(function(url) {image.src = url}).catch(e => {console.log(e.message)}) - }) - Array.from(pImages).forEach((image) => { - var pathReference = profileImgRef.child(image.title) + var pathReference = imgRef.child(image.title) pathReference.getDownloadURL().then(function(url) {image.src = url}).catch(e => {console.log(e.message)}) }) } @@ -149,7 +160,7 @@ function requestItem(){ .then(function(result){ console.log(result) if (result.success == true) { - reqBtn.setAttribute("style", "background: #00DD00; width:500px; transition: 0.7s;") + reqBtn.setAttribute("style", "background: #00DD00; width:520px; transition: 0.7s;") reqBtn.innerHTML = "Done! Go Home" reqBtn.disabled = false } @@ -270,13 +281,35 @@ function my_products() { function showShipField(){ document.getElementById('shippingaddressbutton').setAttribute("style", "display:none;") document.getElementById('shippingaddressinput').setAttribute("style", "display:block;") + showUserShippingAddress() +} + +function showUserShippingAddress(){ + firebase.auth().currentUser.getIdToken().then(function(idToken){ + let url = 'shipping-adress-get-api' + let data = {authToken: idToken} + let postData = {method: 'POST', body: JSON.stringify(data),headers: {'Content-Type': 'application/json'}} + fetch(url, postData) + .then(response => response.json()) + .then(function(result){ + if (result.success) { + document.getElementById("shippingaddressinput").value = result.address + } + else { + document.getElementById("api-response").innerHTML = "Error: " + result.error + document.getElementById("api-response").setAttribute("style", "display: block") + document.getElementById("shippingaddressinput").value = "" + document.getElementById("shippingaddressinput").placeholder = "Can't retrieve current shipping address" + } + }) + }) } function addShippingAddress(){ let newAddress = document.getElementById('shippingaddressinput').value firebase.auth().currentUser.getIdToken().then(function(idToken){ let url = 'shipping-adress-edit-api' - let data = {uToken: idToken, address: newAddress} + let data = {authToken: idToken, address: newAddress} let postData = {method: 'POST', body: JSON.stringify(data),headers: {'Content-Type': 'application/json'}} fetch(url, postData) .then(response => response.json()) diff --git a/functions/views/partials/header.ejs b/functions/views/partials/header.ejs index 7af40a0..151b081 100644 --- a/functions/views/partials/header.ejs +++ b/functions/views/partials/header.ejs @@ -38,13 +38,13 @@
-
- +
+ 🔔 | <%= 0%>
-
- +
+ 🛒 | <%= 0%>
diff --git a/server.js b/server.js index c521a73..be0449e 100644 --- a/server.js +++ b/server.js @@ -1,8 +1,8 @@ let express = require('express') let logger = require('morgan') let bodyParser = require('body-parser') -let admin = require("firebase-admin"); -let serviceAccount = require("./secrets/project-gg-3b754-firebase-adminsdk-4848h-5a5778b77b.json"); +let admin = require("firebase-admin") +let serviceAccount = require("./secrets/project-gg-3b754-firebase-adminsdk-4848h-5a5778b77b.json") let firebaseadmin = admin.initializeApp({ credential: admin.credential.cert(serviceAccount), @@ -12,7 +12,7 @@ let database = firebaseadmin.database() let app = express() app.use(bodyParser.urlencoded({extended: true})) -app.use(bodyParser.json({ limit: '10mb' })); +app.use(bodyParser.json()) app.use(logger('dev')) app.use(express.static('views')) @@ -42,12 +42,7 @@ function homePage(request, responce) { dbRef.orderByChild("status").equalTo("on-sale").limitToLast(5).once('value', function(snapshot){ var data = {} if (snapshot.val()) {data = snapshot.val()} - var x = "none" - if (request.query.itemAdded == "true") { - x = 'block' - } - console.log(data) - responce.render('home.ejs', {products: data, message: x}) + responce.render('home.ejs', {products: data}) }) } @@ -99,7 +94,7 @@ app.get('/my-products', function(request, responce){ if (request.query.uToken) { admin.auth().verifyIdToken(request.query.uToken) .then(function(decodedToken) { - let uid = decodedToken.uid; + let uid = decodedToken.uid var dbRef = database.ref("/products") if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { @@ -151,7 +146,7 @@ app.get('/my-product', function(request, responce){ .catch(function(error) { console.log(error) responce.send("

Bad Auth Token

Home") - }); + }) } else { responce.send("

No Auth Token Provided

Home") @@ -184,7 +179,7 @@ app.get('/edit-item', function(request, responce){ .catch(function(error) { console.log(error) responce.send("

Bad Auth Token

Home") - }); + }) } else { responce.send("

No Auth Token Provided

Home") @@ -248,11 +243,10 @@ app.post('/register-new-user-api', async function(request, responce){ let usersRef = database.ref('/users') let result = await usersRef.push(uData) let key = result.key - let imgPath = key + '/' + pPic ///this is problematic - let imgRootPath = "/user-img/" + imgPath + let imgPath = "/user-img/" + key + '/' + pPic ///this is problematic let userRef = database.ref('/users/' + key) userRef.update({pPic:imgPath}) - .then(responce.send({success:true, error:null, imgRef:imgRootPath})) + .then(responce.send({success:true, error:null, imgRef:imgPath})) .catch(e=>{ responce.send({success:false, error:e}) }) @@ -393,8 +387,8 @@ app.post('/login-user-api', function(request, responce){ }) app.post('/shipping-adress-edit-api', function(request, responce){ - if (request.body.uToken && request.body.address) { - admin.auth().verifyIdToken(request.body.uToken) + if (request.body.authToken && request.body.address) { + admin.auth().verifyIdToken(request.body.authToken) .then(async function(decodedToken) { let newAddress = request.body.address let uid = decodedToken.uid @@ -417,7 +411,35 @@ app.post('/shipping-adress-edit-api', function(request, responce){ .catch(function(error) { responce.send({success:false, error:'invalid auth token'}) console.log(error) - }); + }) + } + else { + responce.send({error: 'invalid data'}) + } +}) + +app.post('/shipping-adress-get-api', function(request, responce){ + if (request.body.authToken) { + admin.auth().verifyIdToken(request.body.authToken) + .then(async function(decodedToken) { + let uid = decodedToken.uid + + let snapshot = await checkUserExists(uid) + if (snapshot){ + let users = snapshot.val() + var keys = Object.keys(users) + let user = users[keys[0]] + let userAddress = user.address + responce.send({success:true, error:null, address:userAddress}) + } + else { + responce.send({success:false, error:'user does not exist'}) + } + }) + .catch(function(error) { + responce.send({success:false, error:'invalid auth token'}) + console.log(error) + }) } else { responce.send({error: 'invalid data'}) @@ -425,7 +447,7 @@ app.post('/shipping-adress-edit-api', function(request, responce){ }) app.post('/new-product-api', async function(request, responce){ - if (request.body.uToken && request.body.product && request.body.image) { + if (request.body.authToken && request.body.product && request.body.image) { let uid = await authCheck(request.body.authToken) if (uid) { if (await checkUserExists(uid)) { @@ -435,10 +457,10 @@ app.post('/new-product-api', async function(request, responce){ let newProductRef = database.ref('/products') newProductRef.push(product).then(key => { let productKey = key.key - let imgPath = productKey + '/' + imageName ///this is problematic + let imgPath = '/product-img/' + productKey + '/' + imageName ///this is problematic let productRef = database.ref('/products/' + productKey) productRef.update({img: imgPath}).then(function(){ - responce.send({success:true, imgRef:'/product-img/'+imgPath, error:null}) + responce.send({success:true, imgRef:imgPath, error:null}) }) .catch(e=>{ responce.send({success:false, error:e}) @@ -462,8 +484,8 @@ app.post('/new-product-api', async function(request, responce){ }) app.post('/update-product-api', function(request, responce){ - if (request.body.uToken && request.body.product && request.body.productID) { - admin.auth().verifyIdToken(request.body.uToken) + if (request.body.authToken && request.body.product && request.body.productID) { + admin.auth().verifyIdToken(request.body.authToken) .then(async function(decodedToken) { let uid = decodedToken.uid let product = request.body.product @@ -491,7 +513,7 @@ app.post('/update-product-api', function(request, responce){ .catch(function(error) { responce.send({success:false, error:'invalid auth token'}) console.log(error) - }); + }) } else { responce.send({error: 'invalid data'}) @@ -565,7 +587,7 @@ function sendEmail(address, content){ } transporter.sendMail(mailOptions, function(error, info){ if (error) { - console.log(error); + console.log(error) } }) }