commit d008a6b37033d0832f86a3b1df45bc348284512c
parent 4125edd5a0a6c836051fa9e004964b065fc26b96
Author: finwo <finwo@pm.me>
Date: Sun, 18 Oct 2026 03:14:37 +0200
Fix external user username refresh
Diffstat:
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.