From 00b47e2656b3e7e533646cd9c5f020321393e349 Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Thu, 13 May 2021 03:22:26 +1000 Subject: [PATCH] Punycode slug encoding for non-ascii characters --- crabfit-backend/package.json | 3 ++- crabfit-backend/routes/createEvent.js | 21 ++++++++++++++------- crabfit-backend/yarn.lock | 5 +++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/crabfit-backend/package.json b/crabfit-backend/package.json index 885330d..ca93155 100644 --- a/crabfit-backend/package.json +++ b/crabfit-backend/package.json @@ -18,6 +18,7 @@ "cors": "^2.8.5", "dayjs": "^1.10.4", "dotenv": "^8.2.0", - "express": "^4.17.1" + "express": "^4.17.1", + "punycode": "^2.1.1" } } diff --git a/crabfit-backend/routes/createEvent.js b/crabfit-backend/routes/createEvent.js index 0323e2d..9fa0fe1 100644 --- a/crabfit-backend/routes/createEvent.js +++ b/crabfit-backend/routes/createEvent.js @@ -1,20 +1,26 @@ const dayjs = require('dayjs'); +const punycode = require('punycode/'); const adjectives = require('../res/adjectives.json'); const crabs = require('../res/crabs.json'); -const capitalize = (string) => string.charAt(0).toUpperCase() + string.slice(1); - -const generateId = (name) => { - const id = name.trim().toLowerCase().replace(/[^A-Za-z0-9 ]/g, '').replace(/\s+/g, '-'); - const number = Math.floor(100000 + Math.random() * 900000); - return `${id}-${number}`; -}; +const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1); +// Generate a random name based on an adjective and a crab species const generateName = () => { return `${capitalize(adjectives[Math.floor(Math.random() * adjectives.length)])} ${crabs[Math.floor(Math.random() * crabs.length)]} Crab`; }; +// Generate a slug for the crab fit +const generateId = name => { + let id = punycode.encode(name.trim().toLowerCase()).trim().replace(/[^A-Za-z0-9 ]/g, '').replace(/\s+/g, '-'); + if (id.replace(/-/g, '') === '') { + id = generateName().trim().toLowerCase().replace(/[^A-Za-z0-9 ]/g, '').replace(/\s+/g, '-'); + } + const number = Math.floor(100000 + Math.random() * 900000); + return `${id}-${number}`; +}; + module.exports = async (req, res) => { const { event } = req.body; @@ -23,6 +29,7 @@ module.exports = async (req, res) => { let eventId = generateId(name); const currentTime = dayjs().unix(); + // Check if the event ID already exists, and if so generate a new one let eventResult; do { const query = req.datastore.createQuery(req.types.event) diff --git a/crabfit-backend/yarn.lock b/crabfit-backend/yarn.lock index 4c35f38..04adf65 100644 --- a/crabfit-backend/yarn.lock +++ b/crabfit-backend/yarn.lock @@ -942,6 +942,11 @@ pumpify@^2.0.1: inherits "^2.0.3" pump "^3.0.0" +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"