605 lines
17 KiB
JavaScript
605 lines
17 KiB
JavaScript
var push = require('../push/push');
|
|
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 {
|
|
await nonQuery('INSERT INTO "User" (username, name, picture, email, message_id) VALUES ($1, $2, $3, $4, $5);', [uid, name, picture, email, mid]);
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
async function getmessageids(sl_id) {
|
|
try {
|
|
let members = await query('SELECT row_to_json("User") AS obj FROM "Shoppinglist_member" JOIN "User" USING (username) WHERE sl_id = $1;', [sl_id]);
|
|
let admin = await query('SELECT row_to_json("User") AS obj FROM "Shoppinglist_admin" JOIN "User" USING (username) WHERE sl_id = $1;', [sl_id]);
|
|
return users_to_array(admin, members);
|
|
|
|
} catch (error) {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
async function searchUsers(searchstring) {
|
|
try {
|
|
let users = await query('SELECT row_to_json("User") AS obj FROM "User";');
|
|
var output = [];
|
|
|
|
for(let item of users) {
|
|
if(item.name != null) {
|
|
if(item.name.includes(searchstring)) {
|
|
output.push(item)
|
|
}
|
|
}
|
|
}
|
|
|
|
return output;
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//SELECT own shopping lists
|
|
async function getShoppinglistsByLink(link) {
|
|
try {
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//SELECT shared shopping lists
|
|
|
|
async function getShoppinglistsShared(username) {
|
|
try {
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//INSERT new Shoppinglist
|
|
|
|
async function newShoppinglist(name, description, username, color) {
|
|
|
|
//generate sl_id
|
|
|
|
let sl_id = generate_sl_id();
|
|
|
|
//insert user if not exists
|
|
|
|
try {
|
|
await nonQuery('INSERT INTO "User" (username) VALUES ($1);', [username]);
|
|
} 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) {
|
|
console.error(error);
|
|
}
|
|
|
|
//insert admin
|
|
try {
|
|
await nonQuery('INSERT INTO "Shoppinglist_admin" (username, sl_id) VALUES ($1, $2);', [username, sl_id]);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
return getShoppinglistsAdmin(username);
|
|
}
|
|
|
|
//rename Shoppinglist
|
|
|
|
|
|
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) {
|
|
await nonQuery('UPDATE "Shoppinglist" SET name = $1 WHERE sl_id = $2;', [newname, sl_id]);
|
|
}
|
|
|
|
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) {
|
|
await nonQuery('UPDATE "Shoppinglist" SET color = $1 WHERE sl_id = $2;', [newcolor, sl_id]);
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
/*async function generateUser() {
|
|
//insert user
|
|
|
|
try {
|
|
await nonQuery('INSERT INTO "User" (username) VALUES ($1);', [username]);
|
|
}
|
|
|
|
catch (error) {
|
|
console.error(error);
|
|
}
|
|
}*/
|
|
|
|
//get shoppinglist content
|
|
async function displayShoppinglist(sl_id) {
|
|
try {
|
|
let shoppinglist = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" WHERE sl_id = $1;', [sl_id]);
|
|
let groups = await query('SELECT row_to_json("Group") AS obj FROM "Group" JOIN "Shoppinglist" USING (sl_id) WHERE sl_id = $1;', [sl_id]);
|
|
let items = await query('SELECT row_to_json("Item") AS obj FROM "Item" JOIN "Group" USING (group_id) WHERE "Group".sl_id = $1;', [sl_id]);
|
|
|
|
let members = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_member" USING (username) WHERE sl_id = $1', [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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//delete shoppinglist
|
|
|
|
async function deleteShoppinglist(sl_id,uid) {
|
|
|
|
try {
|
|
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 "Group" WHERE sl_id = $1', [sl_id]);
|
|
await nonQuery('DELETE FROM "Item" WHERE sl_id = $1', [sl_id]);
|
|
await nonQuery('DELETE FROM "Shoppinglist" WHERE sl_id = $1', [sl_id]);
|
|
|
|
return getShoppinglistsAdmin(uid);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//add group into shoppinglist
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Gruppe wurde hinzugefügt!", "Die Gruppe " + name + " wurde hinzugefügt!");
|
|
}
|
|
|
|
//add item into group
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Item wurde hinzugefügt!", "Das Item " + name + " wurde hinzugefügt!");
|
|
}
|
|
|
|
//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]);
|
|
|
|
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) {
|
|
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) {
|
|
await nonQuery('UPDATE "Group" SET hidden = $1 WHERE group_id = $2 AND sl_id = $3;', [hidden, group_id, sl_id]);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Gruppe wurde bearbeitet!", "Die Gruppe " + name + " wurde bearbeitet!");
|
|
}
|
|
|
|
//Edit Item
|
|
|
|
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) {
|
|
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) {
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Item wurde bearbeitet!", "Das Item " + name + " wurde bearbeitet!");
|
|
}
|
|
|
|
//Delete Group
|
|
|
|
async function deleteGroup(group_id, sl_id) {
|
|
try {
|
|
//Alle Items der Group löschen
|
|
nonQuery('DELETE FROM "Item" WHERE group_id = $1 AND sl_id = $2', [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) {
|
|
console.error(error);
|
|
}
|
|
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Gruppe wurde gelöscht!", "Die Gruppe " + name + " wurde gelöscht!");
|
|
}
|
|
|
|
//Delete Item
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
push.sendMultiplePush(await getmessageids(sl_id), "Item wurde gelöscht!", "Das Item " + name + " wurde gelöscht!");
|
|
}
|
|
|
|
//Move to Done Purchases (delete items from shoppinglist & move into done_purchases table)
|
|
|
|
async function moveDoneItems(uid, sl_id, billcontent) {
|
|
try {
|
|
//Get Items From Shoppinglist
|
|
let items = await query('SELECT row_to_json("Item") AS obj FROM "Item" JOIN "Group" USING (group_id) WHERE "Group".sl_id = $1;', [sl_id]);
|
|
let removeableItems = compareData(items, billcontent);
|
|
|
|
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;
|
|
|
|
//Insert Into Done Purchases Table
|
|
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.item.name, today, item.count]);
|
|
|
|
}
|
|
|
|
//Update count From Item Table
|
|
for (let item of removeableItems) {
|
|
await nonQuery('UPDATE "Item" SET count = count - $4 WHERE item_id = $1 AND group_id = $2 AND sl_id = $3;', [item.item.item_id, item.item.group_id, item.item.sl_id, item.count]);
|
|
}
|
|
|
|
//Chech if item count = 0 and delete
|
|
|
|
await nonQuery('DELETE FROM "Item" WHERE count = 0;')
|
|
|
|
return "done"
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
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
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Invite System
|
|
|
|
async function verifyInvite(link, user_id) {
|
|
try {
|
|
|
|
console.log("LIIINK: ", link);
|
|
console.log("UID: ", user_id);
|
|
|
|
let result = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" WHERE invitelink = $1;', [link]);
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//User manuell einladen
|
|
async function manInvite(sl_id, uid) {
|
|
try {
|
|
await nonQuery('INSERT INTO "Shoppinglist_member" (username, sl_id) VALUES ($1, $2);', [uid, sl_id]);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
//member von shoppinglist entfernen
|
|
|
|
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) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//sl_id generieren
|
|
function generate_sl_id() {
|
|
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
var output = "";
|
|
|
|
for (let i = 0; i < 8; i++) {
|
|
output += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
//group_id generieren
|
|
function generate_group_id() {
|
|
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
var output = "";
|
|
|
|
for (let i = 0; i < 8; i++) {
|
|
output += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
//item_id generieren
|
|
function generate_item_id() {
|
|
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
var output = "";
|
|
|
|
for (let i = 0; i < 8; i++) {
|
|
output += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
function items_in_groups(groups, items, sl_id, admin_uid, admin_mid, members, name, description) {
|
|
|
|
let result = {
|
|
sl_id: sl_id,
|
|
name: name,
|
|
description: description,
|
|
admin: {
|
|
uid: admin_uid,
|
|
mid: admin_mid
|
|
},
|
|
members: [],
|
|
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
|
|
})
|
|
});
|
|
}
|
|
|
|
for (let item of members) {
|
|
|
|
result.members.push({
|
|
uid: item.username,
|
|
mid: item.message_id
|
|
});
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
//Create invite link for your own shoppinglist
|
|
function generateInviteLink() {
|
|
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
var output = "";
|
|
|
|
for (let i = 0; i < 50; i++) {
|
|
output += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
function users_to_array(admin, members) {
|
|
let users = [];
|
|
|
|
users.push(admin[0].message_id);
|
|
|
|
for (let item of members) {
|
|
users.push(item.message_id);
|
|
}
|
|
|
|
return users;
|
|
}
|
|
|
|
//Compare Data
|
|
|
|
function compareData(listitems, doneitems) {
|
|
|
|
let output = [];
|
|
|
|
for (let item of listitems) {
|
|
|
|
if (probability(item.name, doneitems).best > 0.6) {
|
|
output.push({item: item, count: probability(item.name, doneitems).count});
|
|
} else if (probability(item.name.toUpperCase(), doneitems.toUpperCase()).best > 0.6) {
|
|
output.push({item: item, count: probability(item.name, doneitems).count});
|
|
output.push(item);
|
|
} else if (probability(item.name.toLowerCase(), doneitems.toLowerCase()).best > 0.6) {
|
|
output.push({item: item, count: probability(item.name, doneitems).count});
|
|
output.push(item);
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
function probability(cur_item, data) {
|
|
let best = 0;
|
|
|
|
let pos;
|
|
let count = 0;
|
|
let numbers = "123456789";
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
|
let prob = stringSimilarity.compareTwoStrings(cur_item, data.slice(i, i + cur_item.length));
|
|
|
|
if (prob > best) {
|
|
best = prob;
|
|
pos = i;
|
|
}
|
|
}
|
|
|
|
for(let i = pos; i >= 0; i--) {
|
|
if(numbers.includes(data.charAt(i)) == true) {
|
|
count = data.charAt(i);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
best: best, count: count
|
|
};
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
getShoppinglistsAdmin,
|
|
getShoppinglistsShared,
|
|
newShoppinglist,
|
|
displayShoppinglist,
|
|
deleteShoppinglist,
|
|
addGroup,
|
|
addItem,
|
|
verifyInvite,
|
|
createInvite,
|
|
editShoppinglist,
|
|
editGroup,
|
|
editItem,
|
|
deleteGroup,
|
|
deleteItem,
|
|
manInvite,
|
|
updateUser,
|
|
moveDoneItems,
|
|
getDonePurchases,
|
|
getShoppinglistsByLink,
|
|
searchUsers,
|
|
removeMember,
|
|
moveDoneItemMan
|
|
} |