From 9d2822709ebce97ebc0b507068022190b921218d Mon Sep 17 00:00:00 2001 From: Samuel Ortion Date: Tue, 13 Feb 2024 19:01:36 +0100 Subject: [PATCH] fix: promisify getCached that did not work as intended --- controllers/api.js | 32 ++--- controllers/cache.js | 5 +- controllers/quizz.js | 87 +++++++------ locales/en.json | 6 +- locales/fr.json | 5 +- package-lock.json | 294 ++++++++++++++++++++++++++++++++++++------- package.json | 5 +- redis.js | 3 + routes/api.js | 3 - views/layout.pug | 4 +- 10 files changed, 332 insertions(+), 112 deletions(-) diff --git a/controllers/api.js b/controllers/api.js index 74fb131..4c1557a 100755 --- a/controllers/api.js +++ b/controllers/api.js @@ -41,7 +41,19 @@ async function question(req, res) { async function quizz(req, res) { const { region } = req.query; req.session.region = region; - const { locale } = req.i18n.locale; + if (region == undefined) { + res.status(400).json({ + error: 'No region specified', + }) + } + const locale = req.i18n.locale; + if (locale == undefined) { + res.status(400).json( + { + error: 'No locale specified' + } + ) + } quizzController.generateQuizz(region, locale, 10) .then(({ questions, answers, propositions }) => { res.json({questions, answers, propositions }).send(); @@ -81,28 +93,10 @@ function check(req, res) { res.json(result); } -async function birdSpeciesCompletion(req, res) { - const { q } = req.query; - const locale = req.i18n.locale; - const region = req.session.region; - if (region === undefined) { - res.status(400).json({error: "Your session is not associated with any region yet"}); - return; - } - if (q === undefined) { - res.status(400).json({error: "No query provided"}); - return; - } - let speciesCompletion = await quizzController.getSpeciesCompletion(region, locale, q); - res.json(speciesCompletion); -} - - const game = { check, question, quizz, - birdSpeciesCompletion } module.exports = { diff --git a/controllers/cache.js b/controllers/cache.js index 8e1b94a..84f007f 100755 --- a/controllers/cache.js +++ b/controllers/cache.js @@ -1,4 +1,3 @@ -const { json } = require('express'); const { redisClient } = require('../redis'); const debug = require('debug')('soundbirder:cache'); @@ -9,9 +8,9 @@ function cacheResponse(request, response) { async function getCached(request) { - const cached = await redisClient.get(request); + let cached = await redisClient.pget(request); if (cached) { - debug("Got cached response", request); + debug("Cached", request); return JSON.parse(cached); } return null; diff --git a/controllers/quizz.js b/controllers/quizz.js index f968280..e737f7f 100755 --- a/controllers/quizz.js +++ b/controllers/quizz.js @@ -14,7 +14,7 @@ async function getQuestionCached(region, locale, size) { let key = questionKey(region, locale, size); let quizz = await cache.pop(key); if (!quizz) { - quizz = generateQuestion(region, locale, size); + quizz = await generateQuestion(region, locale, size); cache.push(key, quizz); } return quizz; @@ -64,12 +64,11 @@ async function generateQuestion(region, locale, nb_propositions) { async function generateQuizz(region, locale, nb_questions) { let questions = []; let answers = []; - const species_in_region = await getSpeciesList(region); - const species_in_region_localized = await getLocalizedNames(species_in_region, locale); - console.error(species_in_region_localized); + let start = Date.now(); + let species_in_region_localized = await getSpeciesNamesInRegion(region, locale); for (let i=0; i < nb_questions; i++) { try { - let question_species = choice(species_in_region_localize); + let question_species = choice(species_in_region_localized); let question_audio = await getAudio(question_species.sciName); questions.push(question_audio); answers.push(question_species); @@ -77,9 +76,24 @@ async function generateQuizz(region, locale, nb_questions) { console.error(error); } } + const millis = Date.now() - start; + console.log(`seconds elapsed = ${Math.floor(millis / 1000)}`); return {questions: questions, answers: answers, propositions: species_in_region_localized}; } +async function getSpeciesNamesInRegion(region, locale) { + const cacheKey = `region-sppnames-${locale}-${region}`; + let cached = await cache.getCached(cacheKey); + if (cached && cached != []) { + return cached; + } else { + const species_in_region = await getSpeciesList(region); + const species_in_region_localized = await getLocalizedNames(species_in_region, locale); + cache.cacheResponse(cacheKey, species_in_region_localized); + return species_in_region_localized; + } +} + async function getSpeciesSelection(region, number) { const regionCode = region; const speciesList = await getSpeciesList(regionCode); @@ -98,21 +112,28 @@ async function getLocalizedNames(speciesCodes, locale) { return localizedNames; } -function getLocalizedName(speciesCode, locale) { - return eBird.ref.taxonomy.ebird({ - fmt: 'json', - locale: locale, - species: speciesCode - }).then( - response => { - const names = response[0]; - debug("Got localized species names"); - debugResponses(names); - return names; - } - ).catch(error => { - throw error; - }); +async function getLocalizedName(speciesCode, locale) { + const cacheKey = `sppnames-${locale}-${speciesCode}`; + const cached = await cache.getCached(cacheKey); + if (cached) { + return cached; + } else { + return eBird.ref.taxonomy.ebird({ + fmt: 'json', + locale: locale, + species: speciesCode + }).then( + response => { + const names = response[0]; + cache.cacheResponse(cacheKey, names); + debug("Got localized species names"); + debugResponses(names); + return names; + } + ).catch(error => { + throw error; + }); + } } async function getSpeciesList(regionCode) { @@ -141,32 +162,24 @@ function getAudio(speciesScientificName) { quality: 'A' }).then(response => { const { recordings } = response; - const randomRecord = choice(recordings); - const audio = randomRecord.file; + let randomRecord; + let audio; + for (let i=0; i < 3; i++) { + randomRecord = choice(recordings); + if ('file' in randomRecord) { + audio = randomRecord.file; + break; + } + } return audio; }).catch(error => { throw error; }); } - -async function getSpeciesCompletion(region, locale, term) { - let speciesList = await getSpeciesList(region); - let localizedSpeciesList = await getLocalizedNames(speciesList, locale); - let termLower = term.toLowerCase(); - let speciesCompletion = localizedSpeciesList.filter(speciesNames => { - let { comName, sciName } = speciesNames; - let name = comName.toLowerCase(); - let sci = sciName.toLowerCase(); - return name.includes(termLower) || sci.includes(termLower); - }); - return speciesCompletion; -} - module.exports = { generateQuestion, getQuestionCached, - getSpeciesCompletion, cacheQuestion, generateQuizz } \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 6642266..3982660 100644 --- a/locales/en.json +++ b/locales/en.json @@ -18,5 +18,9 @@ "Play the quizz": "Play the quizz", "About this game": "About this game", "Launch a quizz": "Launch a quizz", - "The project is made with ♥ by Samuel Ortion.": "The project is made with ♥ by Samuel Ortion." + "The project is made with ♥ by Samuel Ortion.": "The project is made with ♥ by Samuel Ortion.", + "Run a question": "Run a question", + "Play a quizz": "Play a quizz", + "Quizz": "Quizz", + "Enter species name": "Enter species name" } \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index 27767c6..bc87f28 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -20,5 +20,8 @@ "About this game": "À propos de ce jeu", "Set language": "Modifier la langue", "Launch a quizz": "Launch a quizz", - "Enter species name": "Enter species name" + "Enter species name": "Enter species name", + "Run a question": "Run a question", + "Play a quizz": "Play a quizz", + "Quizz": "Quizz" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9b53501..f3e539e 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "soundbirder", - "version": "0.0.0", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "soundbirder", - "version": "0.0.0", + "version": "0.1.0", "dependencies": { "@unclesamulus/ebird-api": "^0.0.0", "@unclesamulus/xeno-canto-api": "^0.0.0", @@ -31,8 +31,9 @@ "postcss": "^8.4.33", "postcss-cli": "^11.0.0", "pug": "^3.0.2", - "redis": "^4.3.0", - "tailwindcss": "^3.1.8" + "redis": "^4.6.13", + "tailwindcss": "^3.1.8", + "util": "^0.12.5" } }, "node_modules/@alloc/quick-lru": { @@ -175,9 +176,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", - "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "version": "1.5.14", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz", + "integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -188,33 +189,33 @@ } }, "node_modules/@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/search": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", - "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", + "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -370,6 +371,17 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -577,12 +589,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -933,6 +951,22 @@ "ms": "2.0.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1015,6 +1049,25 @@ "node": ">= 0.8" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1348,6 +1401,14 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1432,9 +1493,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/generic-pool": { "version": "3.9.0", @@ -1461,14 +1525,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1534,6 +1602,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1550,6 +1629,17 @@ "node": ">= 0.4.0" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -1573,11 +1663,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1586,6 +1676,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -1666,6 +1767,21 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1677,6 +1793,17 @@ "node": ">=8" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", @@ -1713,6 +1840,20 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1752,6 +1893,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", @@ -2680,16 +2835,19 @@ } }, "node_modules/redis": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", - "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.13.tgz", + "integrity": "sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==", + "workspaces": [ + "./packages/*" + ], "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.8", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.3", - "@redis/time-series": "1.0.4" + "@redis/client": "1.5.14", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.6", + "@redis/search": "1.1.6", + "@redis/time-series": "1.0.5" } }, "node_modules/require-directory": { @@ -2864,6 +3022,22 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -3171,6 +3345,18 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3208,6 +3394,24 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/with": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", diff --git a/package.json b/package.json index f1798a3..e33ddf9 100755 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "postcss": "^8.4.33", "postcss-cli": "^11.0.0", "pug": "^3.0.2", - "redis": "^4.3.0", - "tailwindcss": "^3.1.8" + "redis": "^4.6.13", + "tailwindcss": "^3.1.8", + "util": "^0.12.5" } } diff --git a/redis.js b/redis.js index 6031c0f..82b50e1 100755 --- a/redis.js +++ b/redis.js @@ -1,4 +1,5 @@ const redis = require('redis'); +const util = require('util'); const redisHost = process.env.REDIS_HOST ? process.env.REDIS_HOST : 'localhost'; const redisPort = process.env.REDIS_PORT ? process.env.REDIS_PORT : 6379; @@ -9,6 +10,8 @@ const redisClient = redis.createClient({ legacyMode: true }); +redisClient.pget = util.promisify(redisClient.get); + (async () => { redisClient.connect().catch(console.error) })(); diff --git a/routes/api.js b/routes/api.js index da43cf5..c96247b 100755 --- a/routes/api.js +++ b/routes/api.js @@ -11,9 +11,6 @@ router.route('/game/quizz') router.route('/game/check') .get(apiController.game.check); - -router.route('/species/completion') - .get(apiController.game.birdSpeciesCompletion); router.route('/region') .get(apiController.region); diff --git a/views/layout.pug b/views/layout.pug index b2f0a24..ca27bd6 100755 --- a/views/layout.pug +++ b/views/layout.pug @@ -14,7 +14,9 @@ html(lang=locale) nav(role="navigation").flex.flex-row - var i18n_prefix = locale ? '/' + locale : '' span.nav-item - a(href=`${i18n_prefix}/` title=__('Play the quizz')) #{ __('Game') } + a(href=`${i18n_prefix}/` title=__('Run a question')) #{ __('Game') } + span.nav-item + a(href=`${i18n_prefix}/quizz`, title=__('Play a quizz')) #{ __('Quizz') } span.nav-item a(href=`${i18n_prefix}/about` title=__('About this game')) #{ __('About') } include lang.pug