85 lines
2.4 KiB
JavaScript
85 lines
2.4 KiB
JavaScript
import dayjs from 'dayjs'
|
|
import punycode from 'punycode/'
|
|
|
|
import adjectives from '../res/adjectives.json'
|
|
import crabs from '../res/crabs.json'
|
|
|
|
const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1)
|
|
|
|
// Generate a random name based on an adjective and a crab species
|
|
const generateName = () =>
|
|
`${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}`
|
|
}
|
|
|
|
const createEvent = 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()
|
|
|
|
// 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)
|
|
.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,
|
|
})
|
|
|
|
// Update stats
|
|
const eventCountResult = (await req.datastore.get(req.datastore.key([req.types.stats, 'eventCount'])))[0] || null
|
|
if (eventCountResult) {
|
|
await req.datastore.upsert({
|
|
...eventCountResult,
|
|
value: eventCountResult.value + 1,
|
|
})
|
|
} else {
|
|
await req.datastore.insert({
|
|
key: req.datastore.key([req.types.stats, 'eventCount']),
|
|
data: { value: 1 },
|
|
})
|
|
}
|
|
} catch (e) {
|
|
console.error(e)
|
|
res.sendStatus(400)
|
|
}
|
|
}
|
|
|
|
export default createEvent
|