diff --git a/functions/index.js b/functions/index.js index 4afd607..11ff9f1 100644 --- a/functions/index.js +++ b/functions/index.js @@ -98,13 +98,24 @@ app.get('/my-products', function(request, responce){ app.get('/my-product', function(request, responce){ if (request.query.uToken && request.query.productid) { admin.auth().verifyIdToken(request.query.uToken) - .then(function(decodedToken) { + .then(async function(decodedToken) { let uid = decodedToken.uid; - var dbRef = database.ref("/products/"+request.query.productid) - dbRef.once('value', function(snapshot){ - data = snapshot.val() - responce.render('my-product.ejs', {item:data, key:request.query.productid}) - }) + let pid = request.query.productid + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + var dbRef = database.ref("/products/"+pid) + dbRef.once('value', function(snapshot){ + data = snapshot.val() + responce.render('my-product.ejs', {item:data, key:pid}) + }) + } + else { + responce.render('404.ejs') + } + } + else { + responce.render('404.ejs') + } }) .catch(function(error) { console.log(error) @@ -119,18 +130,25 @@ app.get('/my-product', function(request, responce){ app.get('/edit-item', function(request, responce){ if (request.query.uToken && request.query.productid) { admin.auth().verifyIdToken(request.query.uToken) - .then(function(decodedToken) { - let uid = decodedToken.uid; - var dbRef = database.ref("/products/"+request.query.productid) - dbRef.once('value', function(snapshot){ - data = snapshot.val() - if (data.owner == uid) { - responce.render('edit-item.ejs', {item:data, key:request.query.productid}) + .then(async function(decodedToken) { + let uid = decodedToken.uid + let pid = request.query.productid + + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + let dbRef = database.ref("/products/"+pid) + dbRef.once('value', function(snapshot){ + data = snapshot.val() + responce.render('edit-item.ejs', {item:data, key:request.query.productid}) + }) + } + else { + responce.render('404.ejs') + } } else { - responce.send('

Unauthorized user

Home') + responce.render('404.ejs') } - }) }) .catch(function(error) { console.log(error) @@ -177,18 +195,28 @@ app.post('/purchase-api', function(request, responce){ let uid = decodedToken.uid; let product = request.body.item var productRef = database.ref("/products/"+product) - productRef.update({owner:uid, status:"sold"}) - .then(function(){ - responce.send({success:true, error:null}) + productRef.once('value', function(snapshot) { + var exists = (snapshot.val() !== null) + if (exists){ + var productRef = database.ref("/products/"+product) + productRef.update({owner:uid, status:"sold"}) + .then(function(){ + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'Item does not exist'}) + } }) - .catch(e => {console.log(e)}) + .catch(e => {console.log(e)}) }) - .catch(function(error) { - responce.send({ error: 'invalid auth token' }) + .catch(function(err) { + responce.send({success:false, error:'invalid auth token'}) }); } else { - responce.send({ error: 'invalid data' }) + responce.send({success:false, error:'invalid data'}) } }) @@ -197,46 +225,104 @@ app.post('/place-on-sale-api', function(request, responce){ admin.auth().verifyIdToken(request.body.user) .then(function(decodedToken) { let uid = decodedToken.uid; - let product = request.body.item - var productRef = database.ref("/products/"+product) - productRef.update({status:"on-sale"}) - .then(function(){ - responce.send({success:true, error:null}) + let productID = request.body.item + var productRef = database.ref("/products/"+productID) + + productRef.once('value',function(snapshot){ + let item = snapshot.val() + if (item){ + let itemOwner = item.owner + if (uid == itemOwner){ + productRef.update({status:"on-sale"}) + .then(function(){ + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'You do not own this item'}) + } + } + else { + responce.send({success:false, error:'Item does not exist'}) + } + }) + .catch(e=>{ + console.log(e) + responce.send({success:false, error:'other, ' + e}) }) - .catch(e => {console.log(e)}) }) .catch(function(error) { - responce.send({ error: 'invalid auth token' }) - }); - } + responce.send({success:false, error:'invalid auth token'}) + }) + } else { - responce.send({ error: 'invalid data' }) + responce.send({success:false, error:'invalid data'}) } }) app.post('/ship-api', function(request, responce){ if (request.body.item && request.body.user) { admin.auth().verifyIdToken(request.body.user) - .then(function(decodedToken) { + .then(async function(decodedToken) { let uid = decodedToken.uid; - let product = request.body.item - var productRef = database.ref("/products/"+product) - productRef.update({status:"shipped"}) - .then(function(){ - processItemShipEmail(product, uid) - responce.send({success:true, error:null}) - }) - .catch(e => {console.log(e)}) + let pid = request.body.item + + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + let productRef = database.ref("/products/"+pid) + productRef.update({status:"shipped"}) + .then(function(){ + processItemShipEmail(pid, uid) + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'You do not own this item'}) + } + } + else { + responce.send({success:false, error:'Item does not exist'}) + } }) .catch(function(error) { - responce.send({ error: 'invalid auth token' }) - }); - } + responce.send({success:false, error:'invalid auth token'}) + }) + } else { - responce.send({ error: 'invalid data' }) + responce.send({success:false, error:'invalid data'}) } }) + +async function authorisedToPurchase(uid, pid){ + return true +} + +async function verifyExists(pid) { + let productRef = database.ref("/products/"+pid) + let snapshot = await productRef.once('value') + if (snapshot.exists()) { + return true + } + else{ + return false + } +} + +async function verifyOwner(uid, pid) { + let productRef = database.ref("/products/"+pid) + let snapshot = await productRef.once('value') + let item = snapshot.val() + if (item.owner == uid){ + return true + } + else { + return false + } +} + function processItemShipEmail(itemID, buyerID){ let productRef = database.ref("/products/"+itemID) productRef.once('value',function(snapshot){ diff --git a/server.js b/server.js index 32437f5..dc2a194 100644 --- a/server.js +++ b/server.js @@ -104,13 +104,24 @@ app.get('/my-products', function(request, responce){ app.get('/my-product', function(request, responce){ if (request.query.uToken && request.query.productid) { admin.auth().verifyIdToken(request.query.uToken) - .then(function(decodedToken) { + .then(async function(decodedToken) { let uid = decodedToken.uid; - var dbRef = database.ref("/products/"+request.query.productid) - dbRef.once('value', function(snapshot){ - data = snapshot.val() - responce.render('my-product.ejs', {item:data, key:request.query.productid}) - }) + let pid = request.query.productid + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + var dbRef = database.ref("/products/"+pid) + dbRef.once('value', function(snapshot){ + data = snapshot.val() + responce.render('my-product.ejs', {item:data, key:pid}) + }) + } + else { + responce.render('404.ejs') + } + } + else { + responce.render('404.ejs') + } }) .catch(function(error) { console.log(error) @@ -125,18 +136,25 @@ app.get('/my-product', function(request, responce){ app.get('/edit-item', function(request, responce){ if (request.query.uToken && request.query.productid) { admin.auth().verifyIdToken(request.query.uToken) - .then(function(decodedToken) { - let uid = decodedToken.uid; - var dbRef = database.ref("/products/"+request.query.productid) - dbRef.once('value', function(snapshot){ - data = snapshot.val() - if (data.owner == uid) { - responce.render('edit-item.ejs', {item:data, key:request.query.productid}) + .then(async function(decodedToken) { + let uid = decodedToken.uid + let pid = request.query.productid + + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + let dbRef = database.ref("/products/"+pid) + dbRef.once('value', function(snapshot){ + data = snapshot.val() + responce.render('edit-item.ejs', {item:data, key:request.query.productid}) + }) + } + else { + responce.render('404.ejs') + } } else { - responce.send('

Unauthorized user

Home') + responce.render('404.ejs') } - }) }) .catch(function(error) { console.log(error) @@ -183,18 +201,28 @@ app.post('/purchase-api', function(request, responce){ let uid = decodedToken.uid; let product = request.body.item var productRef = database.ref("/products/"+product) - productRef.update({owner:uid, status:"sold"}) - .then(function(){ - responce.send({success:true, error:null}) + productRef.once('value', function(snapshot) { + var exists = (snapshot.val() !== null) + if (exists){ + var productRef = database.ref("/products/"+product) + productRef.update({owner:uid, status:"sold"}) + .then(function(){ + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'Item does not exist'}) + } }) - .catch(e => {console.log(e)}) + .catch(e => {console.log(e)}) }) - .catch(function(error) { - responce.send({ error: 'invalid auth token' }) + .catch(function(err) { + responce.send({success:false, error:'invalid auth token'}) }); } else { - responce.send({ error: 'invalid data' }) + responce.send({success:false, error:'invalid data'}) } }) @@ -203,46 +231,149 @@ app.post('/place-on-sale-api', function(request, responce){ admin.auth().verifyIdToken(request.body.user) .then(function(decodedToken) { let uid = decodedToken.uid; - let product = request.body.item - var productRef = database.ref("/products/"+product) - productRef.update({status:"on-sale"}) - .then(function(){ - responce.send({success:true, error:null}) + let productID = request.body.item + var productRef = database.ref("/products/"+productID) + + productRef.once('value',function(snapshot){ + let item = snapshot.val() + if (item){ + let itemOwner = item.owner + if (uid == itemOwner){ + productRef.update({status:"on-sale"}) + .then(function(){ + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'You do not own this item'}) + } + } + else { + responce.send({success:false, error:'Item does not exist'}) + } + }) + .catch(e=>{ + console.log(e) + responce.send({success:false, error:'other, ' + e}) }) - .catch(e => {console.log(e)}) }) .catch(function(error) { - responce.send({ error: 'invalid auth token' }) - }); - } + responce.send({success:false, error:'invalid auth token'}) + }) + } else { - responce.send({ error: 'invalid data' }) + responce.send({success:false, error:'invalid data'}) } }) app.post('/ship-api', function(request, responce){ if (request.body.item && request.body.user) { admin.auth().verifyIdToken(request.body.user) - .then(function(decodedToken) { + .then(async function(decodedToken) { let uid = decodedToken.uid; - let product = request.body.item - var productRef = database.ref("/products/"+product) - productRef.update({status:"shipped"}) - .then(function(){ - processItemShipEmail(product, uid) - responce.send({success:true, error:null}) - }) - .catch(e => {console.log(e)}) + let pid = request.body.item + + if (await verifyExists(pid)){ + if (await verifyOwner(uid, pid)) { + let productRef = database.ref("/products/"+pid) + productRef.update({status:"shipped"}) + .then(function(){ + processItemShipEmail(pid, uid) + responce.send({success:true, error:null}) + }) + .catch(e => {console.log(e)}) + } + else { + responce.send({success:false, error:'You do not own this item'}) + } + } + else { + responce.send({success:false, error:'Item does not exist'}) + } }) .catch(function(error) { - responce.send({ error: 'invalid auth token' }) + responce.send({success:false, error:'invalid auth token'}) + }) + } + else { + responce.send({success:false, error:'invalid data'}) + } +}) + + +app.post('/demo-api', function(request, responce){ + if (request.body.item && request.body.user) { + admin.auth().verifyIdToken(request.body.user) + .then(async function(decodedToken) { + if (await verifyExists(request.body.item)){ + if (await verifyOwner(decodedToken.uid, request.body.item)) { + responce.send({success:true, error:null, data:"x"}) + } + else { + responce.send({success:false, error:'You do not own this item'}) + } + } + else { + responce.send({success:false, error:'Item does not exist'}) + } + }) + .catch(function(error) { + responce.send({success:false, error:'invalid auth token'}) + console.log(error) }); } else { - responce.send({ error: 'invalid data' }) + responce.send({error: 'invalid data'}) } }) + + + +async function authorisedToPurchase(uid, pid){ + return true +} + +async function verifyExists(pid) { + let productRef = database.ref("/products/"+pid) + let snapshot = await productRef.once('value') + if (snapshot.exists()) { + return true + } + else{ + return false + } +} + +async function verifyOwner(uid, pid) { + let productRef = database.ref("/products/"+pid) + let snapshot = await productRef.once('value') + let item = snapshot.val() + if (item.owner == uid){ + return true + } + else { + return false + } +} + +function sendEmail(address, content){ + var mailOptions = { + from: 'noreply.projectgg@gmail.com', + to: address, + subject: 'Your Item has been requested', + text: content + } + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + console.log(error); + } else { + console.log('Email sent: ' + info.response); + } + }) +} + function processItemShipEmail(itemID, buyerID){ let productRef = database.ref("/products/"+itemID) productRef.once('value',function(snapshot){ @@ -268,22 +399,6 @@ function processItemShipEmail(itemID, buyerID){ }) } -function sendEmail(address, content){ - var mailOptions = { - from: 'noreply.projectgg@gmail.com', - to: address, - subject: 'Your Item has been requested', - text: content - } - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - console.log(error); - } else { - console.log('Email sent: ' + info.response); - } - }) -} - app.get('*', function(request, responce){ responce.render('404.ejs') })