diff --git a/keyserver/src/updaters/role-updaters.js b/keyserver/src/updaters/role-updaters.js --- a/keyserver/src/updaters/role-updaters.js +++ b/keyserver/src/updaters/role-updaters.js @@ -8,6 +8,7 @@ import createIDs from '../creators/id-creator.js'; import { dbQuery, SQL } from '../database/database.js'; +import { deleteRole } from '../deleters/role-deleters.js'; import { fetchRoles } from '../fetchers/role-fetchers.js'; import type { Viewer } from '../session/viewer.js'; @@ -76,6 +77,45 @@ promises.push(dbQuery(updateMembershipsQuery)); } + if (rolePermissions.Voiced && !currentRolePermissions.Voiced) { + const [id] = await createIDs('roles', 1); + const newRow = [ + id, + threadID, + 'Voiced', + JSON.stringify(rolePermissions.Voiced), + Date.now(), + ]; + const insertQuery = SQL` + INSERT INTO roles (id, thread, name, permissions, creation_time) + VALUES ${[newRow]} + `; + await dbQuery(insertQuery); + + const updateMembershipsQuery = SQL` + UPDATE memberships AS main + SET role = ${id} + WHERE thread = ${threadID} + AND user IN ( + SELECT m.user + FROM memberships AS m + JOIN roles AS r ON m.role = r.id + WHERE r.thread IN ( + SELECT community FROM threads WHERE id = ${threadID} + ) + AND JSON_EXTRACT(r.permissions, '$.voiced_in_announcement_channels') = true + ) + `; + promises.push(dbQuery(updateMembershipsQuery)); + } else if (!rolePermissions.Voiced && currentRolePermissions.Voiced) { + promises.push( + deleteRole(viewer, { + community: threadID, + roleID: currentRoleIDs.Voiced, + }), + ); + } + const updatePermissions = {}; for (const name in currentRoleIDs) { const currentPermissions = currentRolePermissions[name];