crabfit/crabfit-backend/routes/createEvent.js
Ben Grant a3666930a0 Event ID conflict management
🤜💥🤛
2021-05-12 21:27:00 +10:00

63 lines
1.6 KiB
JavaScript

const dayjs = require('dayjs');
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 generateName = () => {
return `${capitalize(adjectives[Math.floor(Math.random() * adjectives.length)])} ${crabs[Math.floor(Math.random() * crabs.length)]} Crab`;
};
module.exports = async (req, res) => {
const { event } = req.body;
try {
const name = event.name.trim() === '' ? generateName() : event.name.trim();
let eventId = generateId(name);
const currentTime = dayjs().unix();
let eventResult;
do {
const query = req.datastore.createQuery(req.types.event)
.select('__key__')
.filter('__key__', req.datastore.key([req.types.event, eventId]));
eventResult = (await req.datastore.runQuery(query))[0][0];
if (eventResult !== undefined) {
eventId = generateId(name);
}
} while (eventResult !== undefined);
const entity = {
key: req.datastore.key([req.types.event, eventId]),
data: {
name: name,
created: currentTime,
times: event.times,
timezone: event.timezone,
},
};
await req.datastore.insert(entity);
res.status(201).send({
id: eventId,
name: name,
created: currentTime,
times: event.times,
timezone: event.timezone,
});
} catch (e) {
console.error(e);
res.sendStatus(400);
}
};