From 84563d18290b0314db2f8eb7d266662344e54e0c Mon Sep 17 00:00:00 2001 From: jerl Date: Tue, 28 May 2024 21:32:00 -0500 Subject: [PATCH] thread fix --- src/events/thread.js | 122 +++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 62 deletions(-) diff --git a/src/events/thread.js b/src/events/thread.js index ecab383..93d2e7b 100644 --- a/src/events/thread.js +++ b/src/events/thread.js @@ -4,32 +4,34 @@ const check_permission = require('../check_permission'); async function create_thread(msg, respond) { // validate inputs - if (typeof msg.name !== 'string') { + if (typeof msg.name !== 'string') return respond({ success: false, message: 'thread name required' }); - } - if (msg.name.length > 200) { + if (msg.name.length > 200) return respond({ success: false, message: 'thread name 200 chars max' }); - } + if (!Array.isArray(msg.members) || msg.members.find(m => typeof m?.name !== 'string')) + return respond({ + success: false, + message: 'invalid members' + }); // add to db - const insert = await db.query( + const thread_id = (await db.query( 'insert into thread (name, creator) values (?, ?) returning id', [msg.name, msg.auth_user.id] - ); - const thread_id = insert.rows[0].id; + )).rows[0].id; // set up permissions - if (!msg.permissions || !msg.permissions.view_limited) { + if (!msg.permissions?.view_limited) { await db.query( `insert into permission (thread, type, mutable, permission, value) values (?, ?, ?, ?, ?)`, [thread_id, 'everyone', true, 'view', 'true'] ); - if (!msg.permissions || !msg.permissions.post_limited) { + if (!msg.permissions?.post_limited) { await db.query( `insert into permission (thread, type, mutable, permission, value) values (?, ?, ?, ?, ?)`, @@ -55,56 +57,58 @@ async function create_thread(msg, respond) { ); } // add members - if (Array.isArray(msg.members)) { - for (let member of msg.members) { - if (!member) continue; - // get user id - const id = await db.query('select id from user where name = ?', [ - member.name, - ]); - if (id.rows.length === 0) { - console.log('user not found: ' + member.name); - continue; - } - await db.query( - 'insert into member (thread, user) values (?, ?)', - [thread_id, id.rows[0].id] - ); - if (typeof member.permissions === 'object') - for (let permission in member.permissions) - await db.query(` - insert into permission (thread, type, user, mutable, permission, value) - values (?, ?, ?, ?, ?, ?)`, - [thread_id, 'user', id.rows[0].id, true, permission, member.permissions[permission]]); + let members = {}; + for (let member of msg.members) { + // get user id + const id = await db.query('select id from user where name = ?', [ + member.name, + ]); + if (id.rows.length === 0) { + console.log('user not found: ' + member.name); + continue; } + await db.query( + 'insert into member (thread, user) values (?, ?)', + [thread_id, id.rows[0].id] + ); + members[member.name] = true; + if (typeof member.permissions === 'object') + for (let permission in member.permissions) + await db.query(` + insert into permission (thread, type, user, mutable, permission, value) + values (?, ?, ?, ?, ?, ?)`, + [thread_id, 'user', id.rows[0].id, true, permission, member.permissions[permission]]); } - if (!msg.permissions || !msg.permissions.view_limited) { + let thread = { + id: thread_id, + name: msg.name, + streams: [] + }; + if (!msg.permissions?.view_limited) { for (let username in vybe.users) { for (let socket of vybe.users[username].sockets) { socket.emit('thread', { - name: msg.name, - id: insert.rows[0].id, + ...thread, permissions: { - is_member: false, view: true, - post: !msg.permissions || !msg.permissions.post_limited + post: !msg.permissions?.post_limited || members[username], + admin: username === msg.auth_user.name } }); } } } - else if (Array.isArray(msg.members)) { + else { for (let member of msg.members) { if (!vybe.users[member.name]) continue; for (let socket of vybe.users[member.name].sockets) { socket.emit('thread', { - name: msg.name, - id: insert.rows[0].id, + ...thread, permissions: { - is_member: true, view: true, - post: true + post: true, + admin: member.name === msg.auth_user.name } }); } @@ -132,10 +136,7 @@ async function list_threads(msg, respond) { [msg.auth_user.id] ); threads = await Promise.all(threads.rows.map(async thread => { - if (vybe.threads[thread.id]) - Object.assign(thread, vybe.threads[thread.id]); - else - thread.streams = []; + thread.streams = vybe.threads[thread.id]?.streams || []; thread.permissions = await check_permission(msg.auth_user.id, thread.id); return thread; })); @@ -209,12 +210,9 @@ async function get_thread(msg, respond) { members: Object.entries(members).map(member => ({ id: member[0], ...member[1] - })) + })), + streams: vybe.threads[thread.id]?.streams || [] }; - if (vybe.threads[thread.id]) - Object.assign(thread, vybe.threads[thread.id]); - else - thread.streams = []; return respond({ success: true, thread @@ -332,35 +330,35 @@ async function edit_thread(msg, respond) { where thread.id = ?`, [msg.id] )).rows.map(row => [row.name, row.id])); - if (!msg.permissions || !msg.permissions.view_limited) { + let thread = { + id: msg.id, + name: msg.name, + streams: vybe.threads[msg.id]?.streams || [] + }; + if (!msg.permissions?.view_limited) { for (let username in vybe.users) for (let socket of vybe.users[username].sockets) socket.emit('thread', { - name: msg.name, - id: msg.id, + ...thread, permissions: { - is_member: username in members, view: true, - post: !msg.permissions || !msg.permissions.post_limited - || username in members, + post: !msg.permissions?.post_limited || username in members, admin: username === msg.auth_user.name && perms.admin, ...permissions } }); } else { - for (let member in members) { - if (!vybe.users[member]) + for (let membername in members) { + if (!vybe.users[membername]) continue; - for (let socket of vybe.users[member].sockets) + for (let socket of vybe.users[membername].sockets) socket.emit('thread', { - name: msg.name, - id: msg.id, + ...thread, permissions: { - is_member: true, view: true, post: true, - admin: member.id === msg.auth_user.id && perms.admin, + admin: membername === msg.auth_user.name && perms.admin, ...permissions } });