const { query, nonQuery } = require("../db-config/postgresql-common"); //Create User Info async function updateUser(uid, mid) { try { let exists = await query('SELECT row_to_json(username) FROM "User" As obj WHERE username = $1;', [uid]); //existiert if(exists != undefined) { await nonQuery('UPDATE "User" SET message_id = $1 WHERE username = $2', [mid, uid]); } //existiert nicht else { await nonQuery('INSERT INTO "User" (username, message_id) VALUES ($1, $2);', [uid, mid]); } } catch (error) { console.error(error); } } async function getmessageids(sl_id) { try { 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) { } } //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 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); } } //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, username) { try { 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]); return items_in_groups(groups, items, sl_id); } catch (error) { console.error(error); } } //delete shoppinglist async function deleteShoppinglist(sl_id) { 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 "Shoppinglist" WHERE sl_id = $1', [sl_id]); } 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); } } //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); } } //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); } } //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); } } //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); } } //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); } } // Invite System async function verifyInvite(link, user_id) { try { let result = await query('SELECT row_to_json("Shoppinglist") AS obj FROM "Shoppinglist" WHERE invitelink = $1;', [link]); let sl_id = result[0].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); } } 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); } } //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) { let result = { sl_id: sl_id, 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}) }); } 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.username); for(let item of members) { users.push(item.username); } return users; } module.exports = { getShoppinglistsAdmin, getShoppinglistsShared, newShoppinglist, displayShoppinglist, deleteShoppinglist, addGroup, addItem, verifyInvite, createInvite, editShoppinglist, editGroup, editItem, deleteGroup, deleteItem, manInvite, updateUser }