diff --git a/package-lock.json b/package-lock.json index 82adfbb..baf5d88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@fastify/websocket": "^10.0.1", "@mapeo/crypto": "^1.0.0-alpha.10", "@sinclair/typebox": "^0.34.15", + "@sindresorhus/slugify": "^2.2.1", "@types/qrcode": "^1.5.5", "env-schema": "^6.0.1", "fastify": "^4.29.0", @@ -1627,6 +1628,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@trivago/prettier-plugin-sort-imports": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", diff --git a/package.json b/package.json index d7af6c3..7df5862 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@fastify/websocket": "^10.0.1", "@mapeo/crypto": "^1.0.0-alpha.10", "@sinclair/typebox": "^0.34.15", + "@sindresorhus/slugify": "^2.2.1", "@types/qrcode": "^1.5.5", "env-schema": "^6.0.1", "fastify": "^4.29.0", diff --git a/src/routes/observations.js b/src/routes/observations.js index b60124f..fd8511b 100644 --- a/src/routes/observations.js +++ b/src/routes/observations.js @@ -1,4 +1,5 @@ import { Type } from '@sinclair/typebox' +import slugify from '@sindresorhus/slugify' import * as errors from '../errors.js' import * as schemas from '../schemas.js' @@ -106,8 +107,12 @@ export default async function observationRoutes( let preset if (category) { - const presets = await project.preset.getMany({ lang: locale }) - preset = presets.find((p) => p.name === category) + const presets = await project.preset.getMany({ lang: locale || 'en' }) + preset = presets.find( + (p) => + slugify(p.name, { lowercase: true }) === + slugify(category, { lowercase: true }), + ) if (!preset) { throw errors.badRequestError(`Category "${category}" not found`) } diff --git a/src/routes/projects.js b/src/routes/projects.js index b3ca4e7..b425e37 100644 --- a/src/routes/projects.js +++ b/src/routes/projects.js @@ -141,7 +141,7 @@ export default async function projectsRoutes(fastify, opts) { } const presets = locale ? await project.preset.getMany({ lang: locale }) - : await project.preset.getMany({ lang: locale }) + : await project.preset.getMany() const fields = await project.field.getMany() // Create a map of field docIds to field objects for quick lookup