conductor

CI task system
git clone git://git.finwo.net/app/conductor
Log | Files | Refs | README | LICENSE

commit d008a6b37033d0832f86a3b1df45bc348284512c
parent 4125edd5a0a6c836051fa9e004964b065fc26b96
Author: finwo <finwo@pm.me>
Date:   Sun, 18 Oct 2026 03:14:37 +0200

Fix external user username refresh

Diffstat:
Msrc/lib/users.js | 31+++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/lib/users.js b/src/lib/users.js @@ -61,14 +61,29 @@ export function createUsers({ db, logger = console }) { { externalId } ); - if (existing) { - if (existing.role !== desired) { - await tx.run('UPDATE users SET role = {role} WHERE id = {id}', { id: existing.id, role: desired }); - } - await tx.run('UPDATE users SET last_login_at = {now} WHERE id = {id}', - { id: existing.id, now: Date.now() }); - return { ...existing, role: desired }; - } + if (existing) { + if (existing.role !== desired) { + await tx.run('UPDATE users SET role = {role} WHERE id = {id}', { id: existing.id, role: desired }); + } + + const base = sanitizeUsername(username); + if (base) { + let candidate = base; + for (let i = 1; await tx.get('SELECT id FROM users WHERE username = {u} AND id <> {id}', { u: candidate, id: existing.id }); i += 1) { + candidate = `${base}-${i}`; + if (i > 50) throw new Error(`could not find a free username for ${base}`); + } + if (candidate !== existing.username) { + await tx.run('UPDATE users SET username = {username} WHERE id = {id}', + { id: existing.id, username: candidate }); + } + existing.username = candidate; + } + + await tx.run('UPDATE users SET last_login_at = {now} WHERE id = {id}', + { id: existing.id, now: Date.now() }); + return { ...existing, role: desired }; + } // Display names come from the provider and are not guaranteed // unique, so a clash is resolved rather than allowed to fail.