Fix user handle naming logic (#4969) * Fix user handle naming logic * Extract slugify logic into a module func --------- Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Signed| @@ -19,6 +19,20 @@ import { DEFAULT_USER } from '../constants.js'; | |||
| 19 | 19 | ||
| 20 | export const router = express.Router(); | 20 | export const router = express.Router(); |
| 21 | 21 | ||
| 22 | /** | ||
| 23 | * Slugifies a given text string. | ||
| 24 | * - Converts to lowercase | ||
| 25 | * - Trims whitespace | ||
| 26 | * - Replaces spaces and special characters with hyphens | ||
| 27 | * - Removes leading and trailing hyphens | ||
| 28 | * - Uses lodash.deburr to remove diacritical marks | ||
| 29 | * @param {string} text Text to slugify | ||
| 30 | * @returns {string} Slugified text | ||
| 31 | */ | ||
| 32 | function slugify(text) { | ||
| 33 | return lodash.deburr(String(text ?? '').toLowerCase().trim()).replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''); | ||
| 34 | } | ||
| 35 | |||
| 22 | router.post('/get', requireAdminMiddleware, async (_request, response) => { | 36 | router.post('/get', requireAdminMiddleware, async (_request, response) => { |
| 23 | try { | 37 | try { |
| 24 | /** @type {import('../users.js').User[]} */ | 38 | /** @type {import('../users.js').User[]} */ |
| @@ -163,7 +177,7 @@ router.post('/create', requireAdminMiddleware, async (request, response) => { | |||
| 163 | } | 177 | } |
| 164 | 178 | ||
| 165 | const handles = await getAllUserHandles(); | 179 | const handles = await getAllUserHandles(); |
| 166 | const handle = lodash.kebabCase(String(request.body.handle).toLowerCase().trim()); | 180 | const handle = slugify(request.body.handle); |
| 167 | 181 | ||
| 168 | if (!handle) { | 182 | if (!handle) { |
| 169 | console.warn('Create user failed: Invalid handle'); | 183 | console.warn('Create user failed: Invalid handle'); |
| @@ -241,7 +255,7 @@ router.post('/slugify', requireAdminMiddleware, async (request, response) => { | |||
| 241 | return response.status(400).json({ error: 'Missing required fields' }); | 255 | return response.status(400).json({ error: 'Missing required fields' }); |
| 242 | } | 256 | } |
| 243 | 257 | ||
| 244 | const text = lodash.kebabCase(String(request.body.text).toLowerCase().trim()); | 258 | const text = slugify(request.body.text); |
| 245 | 259 | ||
| 246 | return response.send(text); | 260 | return response.send(text); |
| 247 | } catch (error) { | 261 | } catch (error) { |