diff --git a/express-server/app.js b/express-server/app.js index 45a88301..d57cdfb2 100644 --- a/express-server/app.js +++ b/express-server/app.js @@ -2,6 +2,7 @@ var createError = require('http-errors'); var express = require('express'); var path = require('path'); var logger = require('morgan'); +var axios = require('axios'); var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); @@ -14,21 +15,24 @@ app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(express.json()); -app.use(express.urlencoded({ extended: false })); +app.use(express.urlencoded({ + extended: false +})); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); +app.use(axios); app.use('/users', usersRouter); // catch 404 and forward to error handler -app.use(function(req, res, next) { +app.use(function (req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler -app.use(function(err, req, res, next) { +app.use(function (err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; @@ -38,4 +42,4 @@ app.use(function(err, req, res, next) { res.render('error'); }); -module.exports = app; +module.exports = app; \ No newline at end of file diff --git a/express-server/db-config/keys.js b/express-server/db-config/keys.js index bd3db0a2..7c9692b7 100644 --- a/express-server/db-config/keys.js +++ b/express-server/db-config/keys.js @@ -1,9 +1,9 @@ -module.exports ={ - postgresSQL:{ - user:"smartshopper-user", - host:"188.166.124.80", - database:"smartshopperdb", - password:"jW^v#&LjNY_b3-k*jYj!U4Xz?T??m_D6249XAeWZ#7C^FRbKm!c_Dt+qj@4&a-Hs", - port:"5432" +module.exports = { + postgresSQL: { + user: "smartshopper-user", + host: "188.166.124.80", + database: "smartshopperdb", + password: "jW^v#&LjNY_b3-k*jYj!U4Xz?T??m_D6249XAeWZ#7C^FRbKm!c_Dt+qj@4&a-Hs", + port: "5432" } -} +} \ No newline at end of file diff --git a/express-server/db-config/postgresql-common.js b/express-server/db-config/postgresql-common.js index 8717cc67..d0314972 100644 --- a/express-server/db-config/postgresql-common.js +++ b/express-server/db-config/postgresql-common.js @@ -1,45 +1,44 @@ -const { Client } = require ("pg"); -const {postgresSQL} = require("./keys") +const { + Client +} = require("pg"); +const { + postgresSQL +} = require("./keys") const client = new Client(postgresSQL); async function connect() { - try{ - await client.connect(); - console.log("Database connected!"); - } - catch(error) - { + try { + await client.connect(); + console.log("Database connected!"); + } catch (error) { console.error(error) } } connect(); -async function query(queryString,param) -{ +async function query(queryString, param) { try { - let result = await client.query(queryString,param); - let resultarray = []; - for(let row of result.rows) - { - resultarray.push(row.obj); - } - return resultarray; - } - catch(error) - { + let result = await client.query(queryString, param); + let resultarray = []; + for (let row of result.rows) { + resultarray.push(row.obj); + } + return resultarray; + } catch (error) { console.log(error) } } -async function nonQuery(queryString,param) { +async function nonQuery(queryString, param) { try { - await client.query(queryString,param); + await client.query(queryString, param); } catch (error) { console.error(error) } } module.exports = { - query, nonQuery + query, + nonQuery } \ No newline at end of file diff --git a/express-server/db-connect/db-connect.js b/express-server/db-connect/db-connect.js index 05e90a27..3b42a995 100644 --- a/express-server/db-connect/db-connect.js +++ b/express-server/db-connect/db-connect.js @@ -1,16 +1,19 @@ -const { query, nonQuery } = require("../db-config/postgresql-common"); +const { + query, + nonQuery +} = require("../db-config/postgresql-common"); const stringSimilarity = require('string-similarity'); + + //Create User Info async function updateUser(uid, mid, name, picture, email) { - try { + try { await nonQuery('INSERT INTO "User" (username, message_id, name, picture, email) VALUES ($1, $2, $3, $4, $5);', [uid, mid, name, picture, email]); - - } - catch (error) { + } catch (error) { console.error(error); } } @@ -20,10 +23,8 @@ async function getmessageids(sl_id) { let members = query('SELECT * FROM "Shoppinglist_member" WHERE sl_id = $1;', [sl_id]); let admin = query('SELECT * FROM "Shoppinglist_admin" WHERE sl_id = $1;', [sl_id]); return users_to_array(admin, members); - - } - catch(error) { + } catch (error) { } } @@ -33,13 +34,13 @@ async function getmessageids(sl_id) { async function searchUsers(searchstring) { try { let users = await query('SELECT row_to_json("User") AS obj FROM "User";'); - return users.filter(function(obj) {return obj.name.toUpperCase().includes(searchstring.toUpperCase())}); - } - - catch(error) { + return users.filter(function (obj) { + return obj.name.toUpperCase().includes(searchstring.toUpperCase()) + }); + } catch (error) { console.error(error); } - + } @@ -47,14 +48,12 @@ async function searchUsers(searchstring) { //SELECT own shopping lists async function getShoppinglistsAdmin(username) { try { - + let result = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" JOIN "Shoppinglist_admin" USING (sl_id) WHERE \ username = $1', [username]); return result; - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -65,9 +64,7 @@ async function getShoppinglistsByLink(link) { console.log("PPPPP LIIINK:", link) let result = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" WHERE invitelink = $1', [link]); return result; - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -79,9 +76,7 @@ async function getShoppinglistsShared(username) { let result = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" JOIN "Shoppinglist_member" USING (sl_id) WHERE username = $1;', [username]); console.log(result); return result; - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -98,27 +93,21 @@ async function newShoppinglist(name, description, username, color) { try { await nonQuery('INSERT INTO "User" (username) VALUES ($1);', [username]); - } - - catch (error) { + } catch (error) { console.error(error); } //insert shoppinglist try { await nonQuery('INSERT INTO "Shoppinglist" (sl_id, name, description, color) VALUES ($1, $2, $3, $4);', [sl_id, name, description, color]); - } - - catch (error) { + } catch (error) { console.error(error); } //insert admin try { await nonQuery('INSERT INTO "Shoppinglist_admin" (username, sl_id) VALUES ($1, $2);', [username, sl_id]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -129,21 +118,19 @@ async function newShoppinglist(name, description, username, color) { async function editShoppinglist(sl_id, newname, newdescription, newcolor) { try { let shoppinglist = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" WHERE sl_id = $1;', [sl_id]); - - if(shoppinglist.name != newname && newname != undefined) { + + if (shoppinglist.name != newname && newname != undefined) { await nonQuery('UPDATE "Shoppinglist" SET name = $1 WHERE sl_id = $2;', [newname, sl_id]); } - if(shoppinglist.description != newdescription && newdescription != undefined) { + if (shoppinglist.description != newdescription && newdescription != undefined) { await nonQuery('UPDATE "Shoppinglist" SET description = $1 WHERE sl_id = $2;', [newdescription, sl_id]); } - if(shoppinglist.color != newcolor && newcolor != undefined) { + if (shoppinglist.color != newcolor && newcolor != undefined) { await nonQuery('UPDATE "Shoppinglist" SET color = $1 WHERE sl_id = $2;', [newcolor, sl_id]); } - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -171,9 +158,7 @@ async function displayShoppinglist(sl_id) { let admin = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_admin" USING (username) WHERE sl_id = $1', [sl_id]); return items_in_groups(groups, items, sl_id, admin[0].username, admin[0].message_id, members, shoppinglist[0].name, shoppinglist[0].description); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -186,9 +171,7 @@ async function deleteShoppinglist(sl_id) { await nonQuery('DELETE FROM "Shoppinglist_admin" WHERE sl_id = $1', [sl_id]); await nonQuery('DELETE FROM "Shoppinglist_member" WHERE sl_id = $1', [sl_id]); await nonQuery('DELETE FROM "Shoppinglist" WHERE sl_id = $1', [sl_id]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -199,9 +182,7 @@ async function addGroup(sl_id, name, color, hidden) { try { let grid = generate_group_id(); await nonQuery('INSERT INTO "Group" (group_id, sl_id, name, color, hidden) VALUES ($1, $2, $3, $4, $5);', [grid, sl_id, name, color, hidden]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -212,9 +193,7 @@ async function addItem(group_id, sl_id, name, count) { try { let itid = generate_item_id(); await nonQuery('INSERT INTO "Item" VALUES ($1, $2, $3, $4, $5);', [itid, group_id, sl_id, name, count]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -222,23 +201,21 @@ async function addItem(group_id, sl_id, name, count) { //Edit Group async function editGroup(sl_id, group_id, name, color, hidden) { try { - let group = await query('SELECT row_to_json("Group") AS obj FROM "Group" WHERE group_id = $1 AND sl_id = $2', [sl_id, group_id]); + let group = await query('SELECT row_to_json("Group") AS obj FROM "Group" WHERE group_id = $1 AND sl_id = $2', [sl_id, group_id]); - if(group.name != name && name != undefined) { + if (group.name != name && name != undefined) { await nonQuery('UPDATE "Group" SET name = $1 WHERE group_id = $2 AND sl_id = $3;', [name, group_id, sl_id]); } - if(group.color != color && color != undefined) { + if (group.color != color && color != undefined) { await nonQuery('UPDATE "Group" SET color = $1 WHERE group_id = $2 AND sl_id = $3;', [color, group_id, sl_id]); } - if(group.hidden != hidden && hidden != undefined) { + if (group.hidden != hidden && hidden != undefined) { await nonQuery('UPDATE "Group" SET hidden = $1 WHERE group_id = $2 AND sl_id = $3;', [hidden, group_id, sl_id]); } - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -250,16 +227,14 @@ async function editItem(sl_id, group_id, item_id, name, count) { try { let item = query('SELECT row_to_json("Item") FROM "Item" WHERE item_id = $1 AND group_id = $2 AND sl_id = $3', [item_id, group_id, sl_id]); - if(item.name != name && name != undefined) { + if (item.name != name && name != undefined) { await nonQuery('UPDATE "Item" SET name = $1 WHERE item_id = $2 AND group_id = $3 AND sl_id = $4', [name, item_id, group_id, sl_id]); } - if(item.count != count && count != undefined) { + if (item.count != count && count != undefined) { await nonQuery('UPDATE "Item" SET count = $1 WHERE item_id = $2 AND group_id = $3 AND sl_id = $4', [count, item_id, group_id, sl_id]); } - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -273,9 +248,7 @@ async function deleteGroup(group_id, sl_id) { //Leere Gruppe löschen nonQuery('DELETE FROM "Group" WHERE group_id = $1 AND sl_id = $2', [group_id, sl_id]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -285,9 +258,7 @@ async function deleteGroup(group_id, sl_id) { async function deleteItem(item_id, group_id, sl_id) { try { nonQuery('DELETE FROM "Item" WHERE item_id = $1 AND group_id = $2 AND sl_id = $3;', [item_id, group_id, sl_id]); - } - - catch(error) { + } catch (error) { console.error(error); } } @@ -302,37 +273,69 @@ async function moveDoneItems(uid, sl_id, billcontent) { var today = new Date(); var dd = today.getDate(); - var mm = today.getMonth()+1; + var mm = today.getMonth() + 1; var yyyy = today.getFullYear(); - if(dd<10) { - dd = '0'+dd - } + if (dd < 10) { + dd = '0' + dd + } - if(mm<10) { - mm = '0'+mm - } + if (mm < 10) { + mm = '0' + mm + } today = mm + '/' + dd + '/' + yyyy; - for(let item of removeableItems) { + for (let item of removeableItems) { await nonQuery('INSERT INTO "Done_Purchase" (purchased_item_id, username, name, date, count) VALUES($1,$2,$3,$4,$5);', - [generate_item_id(), uid, item.name, today, 1]); + [generate_item_id(), uid, item.name, today, 1]); } - - for(let item of removeableItems) { + + for (let item of removeableItems) { await nonQuery('DELETE FROM "Item" WHERE item_id = $1 AND group_id = $2 AND sl_id = $3;', [item.item_id, item.group_id, item.sl_id]); console.log(item); } return "done" + } catch (error) { + console.error(error); + } +} + +moveDoneItemMan('dXMuv1J0f4O7RKn2bizGMTHUYkg1', '8l3vop0s', 'hcMssjPd', 'IkNZ76So'); + +async function moveDoneItemMan(uid, sl_id, group_id, item_id) { + try { + let name = await query('SELECT row_to_json("Item") as obj FROM "Item" WHERE item_id = $3 AND group_id = $2 AND sl_id = $1', [sl_id, group_id, item_id]); + console.log(name); + var today = new Date(); + var dd = today.getDate(); + var mm = today.getMonth() + 1; + var yyyy = today.getFullYear(); + + if (dd < 10) { + dd = '0' + dd + } + + if (mm < 10) { + mm = '0' + mm + } + + today = mm + '/' + dd + '/' + yyyy; + + await nonQuery('INSERT INTO "Done_Purchase" (purchased_item_id, username, name, date, count) VALUES($1,$2,$3,$4,$5);', + [generate_item_id(), uid, name, today, 1]); + + await nonQuery('DELETE FROM "Item" WHERE item_id = $1 AND group_id = $2 AND sl_id = $3;', [item_id, group_id, sl_id]); } catch(error) { console.error(error); } + + } //GET Done_Purchases @@ -341,9 +344,7 @@ async function getDonePurchases(uid) { try { let result = await query('SELECT row_to_json("Done_Purchase") AS obj FROM "Done_Purchase" WHERE username = $1;', [uid]); return result; - } - - catch(error) { + } catch (error) { console.error(error); } } @@ -364,9 +365,7 @@ async function verifyInvite(link, user_id) { let sl_id = result[0].sl_id; console.log("!!! SL ID: ", sl_id); await nonQuery('INSERT INTO "Shoppinglist_member" (username, sl_id) VALUES ($1, $2);', [user_id, sl_id]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -375,9 +374,7 @@ async function createInvite(sl_id) { try { let link = generateInviteLink(); await nonQuery('UPDATE "Shoppinglist" SET invitelink = $1 WHERE sl_id = $2;', [link, sl_id]); - } - - catch (error) { + } catch (error) { console.error(error); } } @@ -386,9 +383,7 @@ async function createInvite(sl_id) { async function manInvite(sl_id, uid) { try { await nonQuery('INSERT INTO "Shoppinglist_member" (username, sl_id) VALUES ($1, $2);', [uid, sl_id]); - } - - catch(error) { + } catch (error) { console.error(error); } } @@ -398,9 +393,7 @@ async function manInvite(sl_id, uid) { async function removeMember(uid, sl_id) { try { await nonQuery('DELETE FROM "Shoppinglist_member" WHERE username = $1 AND sl_id = $2', [uid, sl_id]); - } - - catch(error) { + } catch (error) { console.error(error); } } @@ -415,7 +408,7 @@ function generate_sl_id() { var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var output = ""; - for(let i = 0; i < 8; i++) { + for (let i = 0; i < 8; i++) { output += possible.charAt(Math.floor(Math.random() * possible.length)); } @@ -427,7 +420,7 @@ function generate_group_id() { var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var output = ""; - for(let i = 0; i < 8; i++) { + for (let i = 0; i < 8; i++) { output += possible.charAt(Math.floor(Math.random() * possible.length)); } @@ -439,7 +432,7 @@ function generate_item_id() { var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var output = ""; - for(let i = 0; i < 8; i++) { + for (let i = 0; i < 8; i++) { output += possible.charAt(Math.floor(Math.random() * possible.length)); } @@ -460,17 +453,19 @@ function items_in_groups(groups, items, sl_id, admin_uid, admin_mid, members, na groups: [] }; - for(let item of groups) { + for (let item of groups) { result.groups.push({ group_id: item.group_id, name: item.name, color: item.color, - content: items.filter(function(obj) {return obj.group_id == item.group_id}) + content: items.filter(function (obj) { + return obj.group_id == item.group_id + }) }); } - for(let item of members) { + for (let item of members) { result.members.push({ uid: item.username, @@ -486,7 +481,7 @@ function generateInviteLink() { var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var output = ""; - for(let i = 0; i < 50; i++) { + for (let i = 0; i < 50; i++) { output += possible.charAt(Math.floor(Math.random() * possible.length)); } @@ -498,7 +493,7 @@ function users_to_array(admin, members) { users.push(admin.username); - for(let item of members) { + for (let item of members) { users.push(item.username); } @@ -511,28 +506,18 @@ function compareData(listitems, doneitems) { let output = []; - for(let item of listitems) { - if(doneitems.includes(item.name)) { + for (let item of listitems) { + if (doneitems.includes(item.name)) { output.push(item); - } - - else if(doneitems.toUpperCase().includes(item.name.toUpperCase())) { + } else if (doneitems.toUpperCase().includes(item.name.toUpperCase())) { output.push(item); - } - - else if(doneitems.toLowerCase().includes(item.name.toLowerCase())) { + } else if (doneitems.toLowerCase().includes(item.name.toLowerCase())) { output.push(item); - } - - else if(probability(item.name, doneitems) > 0.6) { + } else if (probability(item.name, doneitems) > 0.6) { output.push(item); - } - - else if(probability(item.name.toUpperCase(), doneitems.toUpperCase()) > 0.6) { + } else if (probability(item.name.toUpperCase(), doneitems.toUpperCase()) > 0.6) { output.push(item); - } - - else if(probability(item.name.toLowerCase(), doneitems.toLowerCase()) > 0.6) { + } else if (probability(item.name.toLowerCase(), doneitems.toLowerCase()) > 0.6) { output.push(item); } } @@ -544,11 +529,11 @@ function probability(cur_item, data) { let best = 0; - for(let i = 0; i < data.length; i++) { + for (let i = 0; i < data.length; i++) { let prob = stringSimilarity.compareTwoStrings(cur_item, data.slice(i, i + cur_item.length)); - if(prob > best) { + if (prob > best) { best = prob; } } @@ -559,7 +544,26 @@ function probability(cur_item, data) { module.exports = { - getShoppinglistsAdmin, getShoppinglistsShared, newShoppinglist, displayShoppinglist, deleteShoppinglist, addGroup, - addItem, verifyInvite, createInvite, editShoppinglist, editGroup, editItem, deleteGroup, deleteItem, manInvite, updateUser, - moveDoneItems, getDonePurchases, getShoppinglistsByLink, searchUsers, removeMember -} + getShoppinglistsAdmin, + getShoppinglistsShared, + newShoppinglist, + displayShoppinglist, + deleteShoppinglist, + addGroup, + addItem, + verifyInvite, + createInvite, + editShoppinglist, + editGroup, + editItem, + deleteGroup, + deleteItem, + manInvite, + updateUser, + moveDoneItems, + getDonePurchases, + getShoppinglistsByLink, + searchUsers, + removeMember, + moveDoneItemMan +} \ No newline at end of file diff --git a/express-server/greenlock-https/demo.js b/express-server/greenlock-https/demo.js index d9bee690..3572aa35 100644 --- a/express-server/greenlock-https/demo.js +++ b/express-server/greenlock-https/demo.js @@ -10,28 +10,34 @@ var greenlock = Greenlock.create({ // Let's Encrypt v2 is ACME draft 11 version: 'draft-11' -, server: 'https://acme-v02.api.letsencrypt.org/directory' - // Note: If at first you don't succeed, stop and switch to staging - // https://acme-staging-v02.api.letsencrypt.org/directory + , + server: 'https://acme-v02.api.letsencrypt.org/directory' + // Note: If at first you don't succeed, stop and switch to staging + // https://acme-staging-v02.api.letsencrypt.org/directory - // You MUST change this to a valid email address -, email: 'jon@example.com' + // You MUST change this to a valid email address + , + email: 'jon@example.com' - // You MUST NOT build clients that accept the ToS without asking the user -, agreeTos: true + // You MUST NOT build clients that accept the ToS without asking the user + , + agreeTos: true - // You MUST change these to valid domains - // NOTE: all domains will validated and listed on the certificate -, approvedDomains: [ 'example.com', 'www.example.com' ] + // You MUST change these to valid domains + // NOTE: all domains will validated and listed on the certificate + , + approvedDomains: ['example.com', 'www.example.com'] - // You MUST have access to write to directory where certs are saved - // ex: /home/foouser/acme/etc -, configDir: '~/.config/acme/' + // You MUST have access to write to directory where certs are saved + // ex: /home/foouser/acme/etc + , + configDir: '~/.config/acme/' - // Get notified of important updates and help me make greenlock better -, communityMember: true + // Get notified of important updates and help me make greenlock better + , + communityMember: true -//, debug: true + //, debug: true }); @@ -45,8 +51,8 @@ var greenlock = Greenlock.create({ var redirectHttps = require('redirect-https')(); var acmeChallengeHandler = greenlock.middleware(function (req, res) { res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.end('