v0.12.23 group manager display update
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rosterchirp-backend",
|
"name": "rosterchirp-backend",
|
||||||
"version": "0.12.22",
|
"version": "0.12.23",
|
||||||
"description": "RosterChirp backend server",
|
"description": "RosterChirp backend server",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ router.patch('/:id', authMiddleware, teamManagerMiddleware, async (req, res) =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Array.isArray(memberIds) && ug.dm_group_id) {
|
if (Array.isArray(memberIds)) {
|
||||||
const defaultAdmin = await queryOne(req.schema, 'SELECT id FROM users WHERE is_default_admin=TRUE');
|
const defaultAdmin = await queryOne(req.schema, 'SELECT id FROM users WHERE is_default_admin=TRUE');
|
||||||
const newIds = new Set(memberIds.map(Number).filter(Boolean));
|
const newIds = new Set(memberIds.map(Number).filter(Boolean));
|
||||||
if (defaultAdmin) newIds.delete(defaultAdmin.id); // default admin cannot be in user groups
|
if (defaultAdmin) newIds.delete(defaultAdmin.id); // default admin cannot be in user groups
|
||||||
@@ -289,32 +289,36 @@ router.patch('/:id', authMiddleware, teamManagerMiddleware, async (req, res) =>
|
|||||||
for (const uid of newIds) {
|
for (const uid of newIds) {
|
||||||
if (!currentSet.has(uid)) {
|
if (!currentSet.has(uid)) {
|
||||||
await exec(req.schema, 'INSERT INTO user_group_members (user_group_id,user_id) VALUES ($1,$2) ON CONFLICT DO NOTHING', [ug.id, uid]);
|
await exec(req.schema, 'INSERT INTO user_group_members (user_group_id,user_id) VALUES ($1,$2) ON CONFLICT DO NOTHING', [ug.id, uid]);
|
||||||
await addUserSilent(req.schema, ug.dm_group_id, uid);
|
if (ug.dm_group_id) await addUserSilent(req.schema, ug.dm_group_id, uid);
|
||||||
addedUids.push(uid);
|
addedUids.push(uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const uid of currentSet) {
|
for (const uid of currentSet) {
|
||||||
if (!newIds.has(uid)) {
|
if (!newIds.has(uid)) {
|
||||||
await exec(req.schema, 'DELETE FROM user_group_members WHERE user_group_id=$1 AND user_id=$2', [ug.id, uid]);
|
await exec(req.schema, 'DELETE FROM user_group_members WHERE user_group_id=$1 AND user_id=$2', [ug.id, uid]);
|
||||||
await exec(req.schema, 'DELETE FROM group_members WHERE group_id=$1 AND user_id=$2', [ug.dm_group_id, uid]);
|
if (ug.dm_group_id) {
|
||||||
io.in(R(req.schema,'user',uid)).socketsLeave(R(req.schema,'group',ug.dm_group_id));
|
await exec(req.schema, 'DELETE FROM group_members WHERE group_id=$1 AND user_id=$2', [ug.dm_group_id, uid]);
|
||||||
io.to(R(req.schema,'user',uid)).emit('group:deleted', { groupId: ug.dm_group_id });
|
io.in(R(req.schema,'user',uid)).socketsLeave(R(req.schema,'group',ug.dm_group_id));
|
||||||
|
io.to(R(req.schema,'user',uid)).emit('group:deleted', { groupId: ug.dm_group_id });
|
||||||
|
}
|
||||||
removedUids.push(uid);
|
removedUids.push(uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification rule: single user → named message; multiple users → one generic message
|
// Notification rule (only if DM exists): single user → named message; multiple → generic
|
||||||
if (addedUids.length === 1) {
|
if (ug.dm_group_id) {
|
||||||
const u = await queryOne(req.schema, 'SELECT name,display_name FROM users WHERE id=$1', [addedUids[0]]);
|
if (addedUids.length === 1) {
|
||||||
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${u?.display_name||u?.name||'A user'} has joined the conversation.`);
|
const u = await queryOne(req.schema, 'SELECT name,display_name FROM users WHERE id=$1', [addedUids[0]]);
|
||||||
} else if (addedUids.length > 1) {
|
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${u?.display_name||u?.name||'A user'} has joined the conversation.`);
|
||||||
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${addedUids.length} new members have joined the conversation.`);
|
} else if (addedUids.length > 1) {
|
||||||
}
|
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${addedUids.length} new members have joined the conversation.`);
|
||||||
if (removedUids.length === 1) {
|
}
|
||||||
const u = await queryOne(req.schema, 'SELECT name,display_name FROM users WHERE id=$1', [removedUids[0]]);
|
if (removedUids.length === 1) {
|
||||||
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${u?.display_name||u?.name||'A user'} has been removed from the conversation.`);
|
const u = await queryOne(req.schema, 'SELECT name,display_name FROM users WHERE id=$1', [removedUids[0]]);
|
||||||
} else if (removedUids.length > 1) {
|
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${u?.display_name||u?.name||'A user'} has been removed from the conversation.`);
|
||||||
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${removedUids.length} members have been removed from the conversation.`);
|
} else if (removedUids.length > 1) {
|
||||||
|
await postSysMsg(req.schema, ug.dm_group_id, req.user.id, `${removedUids.length} members have been removed from the conversation.`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Propagate to multi-group DMs
|
// Propagate to multi-group DMs
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -13,7 +13,7 @@
|
|||||||
# ─────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION="${1:-0.12.22}"
|
VERSION="${1:-0.12.23}"
|
||||||
ACTION="${2:-}"
|
ACTION="${2:-}"
|
||||||
REGISTRY="${REGISTRY:-}"
|
REGISTRY="${REGISTRY:-}"
|
||||||
IMAGE_NAME="rosterchirp"
|
IMAGE_NAME="rosterchirp"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rosterchirp-frontend",
|
"name": "rosterchirp-frontend",
|
||||||
"version": "0.12.22",
|
"version": "0.12.23",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -173,10 +173,10 @@ function UserForm({ user, userPass, allUserGroups, onDone, onCancel, isMobile, o
|
|||||||
});
|
});
|
||||||
// Sync group memberships: add newly selected, remove deselected
|
// Sync group memberships: add newly selected, remove deselected
|
||||||
for (const gId of selectedGroupIds) {
|
for (const gId of selectedGroupIds) {
|
||||||
if (!origGroupIds.has(gId)) await api.addUserToGroup(gId, user.id).catch(() => {});
|
if (!origGroupIds.has(gId)) await api.addUserToGroup(gId, user.id);
|
||||||
}
|
}
|
||||||
for (const gId of origGroupIds) {
|
for (const gId of origGroupIds) {
|
||||||
if (!selectedGroupIds.has(gId)) await api.removeUserFromGroup(gId, user.id).catch(() => {});
|
if (!selectedGroupIds.has(gId)) await api.removeUserFromGroup(gId, user.id);
|
||||||
}
|
}
|
||||||
toast('User updated', 'success');
|
toast('User updated', 'success');
|
||||||
} else {
|
} else {
|
||||||
@@ -191,7 +191,7 @@ function UserForm({ user, userPass, allUserGroups, onDone, onCancel, isMobile, o
|
|||||||
});
|
});
|
||||||
// Add to selected groups
|
// Add to selected groups
|
||||||
for (const gId of selectedGroupIds) {
|
for (const gId of selectedGroupIds) {
|
||||||
await api.addUserToGroup(gId, newUser.id).catch(() => {});
|
await api.addUserToGroup(gId, newUser.id);
|
||||||
}
|
}
|
||||||
toast('User created', 'success');
|
toast('User created', 'success');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user