From e75c556443c7821335c96e20cf2595caba7f8307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Mon, 6 May 2024 22:59:09 +0200 Subject: [PATCH] use $text instead --- server/archive.api.js | 122 ++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 39 deletions(-) diff --git a/server/archive.api.js b/server/archive.api.js index 6779526e2..578004fc0 100644 --- a/server/archive.api.js +++ b/server/archive.api.js @@ -3,61 +3,105 @@ const router = require('express').Router(); const asyncHandler = require('express-async-handler'); const archive = { - archiveApi : router, - /* Searches for matching title, also attempts to partial match */ - findBrews : async (req, res, next)=>{ - try { - console.table(req.query); + archiveApi: router, + /* Searches for matching title, also attempts to partial match */ + findBrews: async (req, res, next) => { + try { + /* + const dbName = HomebrewModel.db.name; + console.log("Database Name:", dbName); + const collectionName = HomebrewModel.collection.name; + console.log("Collection Name:", collectionName); + + */ + console.table(req.query); - const title = req.query.title || ''; - const page = Math.max(parseInt(req.query.page) || 1, 1); - const minPageSize = 6; - const pageSize = Math.max(parseInt(req.query.size) || 10, minPageSize); - const skip = (page - 1) * pageSize; - - const titleQuery = { - title : { $regex: decodeURIComponent(title), $options: 'i' }, - $or: [], - published : true - }; + const title = req.query.title || ''; + const page = Math.max(parseInt(req.query.page) || 1, 1); + const minPageSize = 6; + const pageSize = Math.max( + parseInt(req.query.size) || 10, + minPageSize + ); + const skip = (page - 1) * pageSize; - if (req.query.legacy === 'true') { - titleQuery.$or.push({ renderer: 'legacy' }); + const brewsQuery = { + $or: [], + published: true, }; + if (req.query.legacy === 'true') { + brewsQuery.$or.push({ renderer: 'legacy' }); + } + if (req.query.v3 === 'true') { - titleQuery.$or.push({ renderer: 'V3' }); + brewsQuery.$or.push({ renderer: 'V3' }); + } + + // If user wants to use RegEx it needs to format like /text/ + const titleConditionsArray = + title.startsWith('/') && title.endsWith('/') + ? [ + { + 'title': { + $regex: title.slice(1, -1), + $options: 'i', + }, + }, + ] + : buildTitleConditions(title); + + function buildTitleConditions(inputString) { + return [ + { + $text: { + $search: inputString, + $caseSensitive: false, + }, + }, + ]; + } + + const titleQuery = { + $and: [brewsQuery, ...titleConditionsArray], }; - const projection = { - editId : 0, - googleId : 0, - text : 0, - textBin : 0, - }; - const brews = await HomebrewModel.find(titleQuery, projection) + const projection = { + editId: 0, + googleId: 0, + text: 0, + textBin: 0, + }; + const brews = await HomebrewModel.find(titleQuery, projection) .skip(skip) .limit(pageSize) .maxTimeMS(5000) .exec(); - const totalBrews = await HomebrewModel.countDocuments(titleQuery).maxTimeMS(5000); - - const totalPages = Math.ceil(totalBrews / pageSize); - //console.log('Total brews: ', totalBrews); - //console.log('Total pages: ', totalPages); - return res.json({ brews, page, totalPages, totalBrews}); - } catch (error) { - console.error(error); + const totalBrews = await HomebrewModel.countDocuments( + titleQuery + ).maxTimeMS(5000); + + const totalPages = Math.ceil(totalBrews / pageSize); + console.log('Total brews: ', totalBrews); + console.log('Total pages: ', totalPages); + return res.json({ brews, page, totalPages, totalBrews }); + } catch (error) { + console.error(error); if (error.response && error.response.status === 503) { - return res.status(503).json({ errorCode: '503', message: 'Service Unavailable' }); + return res + .status(503) + .json({ errorCode: '503', message: 'Service Unavailable' }); } else { - return res.status(500).json({ errorCode: '500', message: 'Internal Server Error' }); + return res.status(500).json({ + errorCode: '500', + message: 'Internal Server Error', + }); } - } - } + } + }, }; router.get('/api/archive', asyncHandler(archive.findBrews)); -module.exports = router; \ No newline at end of file +module.exports = router;