[perf] optimise defaultUsername

This commit is contained in:
Andrea Vos 2021-07-14 17:55:34 +02:00
parent d5724bdfcc
commit 29cf160270

View File

@ -65,16 +65,20 @@ const invalidateAuthenticator = async (db, id) => {
} }
const defaultUsername = async (db, email) => { const defaultUsername = async (db, email) => {
const base = email.substring(0, email.includes('@') ? email.indexOf('@') : email.length) const base = normalise(
.padEnd(4, '0') email.substring(0, email.includes('@') ? email.indexOf('@') : email.length)
.substring(0, 14) .padEnd(4, '0')
.replace(new RegExp(`[^${USERNAME_CHARS}]`, 'g'), '_'); .substring(0, 14)
.replace(new RegExp(`[^${USERNAME_CHARS}]`, 'g'), '_')
);
const conflicts = (await db.all(SQL`SELECT usernameNorm FROM users WHERE usernameNorm LIKE ${normalise(base) + '%'}`))
.map(({usernameNorm}) => usernameNorm);
let c = 0; let c = 0;
while (true) { while (true) {
let proposal = base + (c || ''); let proposal = base + (c || '');
let dbUser = await db.get(SQL`SELECT id FROM users WHERE usernameNorm = ${normalise(proposal)}`); if (!conflicts.includes(proposal)) {
if (!dbUser) {
return proposal; return proposal;
} }
c++; c++;