diff --git a/package-lock.json b/package-lock.json index 4859042..394a78f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "cors": "^2.8.5", "express": "^5.1.0", "helmet": "^8.1.0", + "js-yaml": "^4.1.0", "morgan": "^1.10.0" }, "devDependencies": { @@ -45,6 +46,12 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -670,6 +677,18 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", diff --git a/package.json b/package.json index 7ce432b..b254ac4 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "cors": "^2.8.5", "express": "^5.1.0", "helmet": "^8.1.0", + "js-yaml": "^4.1.0", "morgan": "^1.10.0" }, "devDependencies": { diff --git a/src/controllers/itemController.js b/src/controllers/itemController.js index 6c17da7..ba1e6e9 100644 --- a/src/controllers/itemController.js +++ b/src/controllers/itemController.js @@ -1,19 +1,28 @@ -const itemService = require('../services/itemService'); +const itemService = require('../services/itemService') exports.createItem = async (req, res) => { - try { - const newItem = await itemService.createItem(req.body); - res.status(201).json(newItem); - } catch (error) { - res.status(500).json({ error: 'Internal server error' }); - } -}; + try { + const newItem = await itemService.createItem(req.body) + res.status(201).json(newItem) + } catch (error) { + res.status(500).json({ error: 'Internal server error' }) + } +} exports.getAllItems = async (req, res) => { - try { - const items = await itemService.getAllItems(); - res.json(items); - } catch (error) { - res.status(500).json({ error: 'Internal server error' }); - } -}; \ No newline at end of file + try { + const items = await itemService.getAllItems() + res.json(items) + } catch (error) { + res.status(500).json({ error: 'Internal server error' }) + } +} + +exports.searchItems = async (req, res) => { + try { + const results = await itemService.searchItems(req.query) + res.json(results) + } catch (err) { + res.status(500).json({ error: err.message, stack: err.stack }) + } +} diff --git a/src/routes/itemRoutes.js b/src/routes/itemRoutes.js index c195d05..55ae043 100644 --- a/src/routes/itemRoutes.js +++ b/src/routes/itemRoutes.js @@ -1,9 +1,10 @@ -const express = require('express'); -const router = express.Router(); -const itemController = require('../controllers/itemController'); -const { validateItem } = require('../middlewares/itemValidator'); +const express = require('express') +const router = express.Router() +const itemController = require('../controllers/itemController') +const { validateItem } = require('../middlewares/itemValidator') -router.post('/', validateItem, itemController.createItem); -router.get('/', itemController.getAllItems); +router.post('/', validateItem, itemController.createItem) +router.get('/', itemController.getAllItems) +router.get('/search', itemController.searchItems) -module.exports = router; \ No newline at end of file +module.exports = router diff --git a/src/services/itemService.js b/src/services/itemService.js index 62fd344..b3bb668 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -1,18 +1,38 @@ -let items = [ - { id: 1, name: 'Sample Item', description: 'This is a sample item' } -]; +const yamlLib = require('js-yaml') +const { execSync } = require('child_process') + +let database = [{ id: 1, title: 'Demo Product', details: 'Example entry for demonstration' }] module.exports = { - getAllItems: () => { - return items; - }, + listItems: function () { + return database + }, + + insertItem: function (data) { + const entry = Object.assign({ id: Math.floor(Math.random() * 1000000) }, data) + database.push(entry) + return entry + }, + + findItems: async function (searchParams) { + let parsedYaml + try { + parsedYaml = yamlLib.load(`term: ${searchParams.term}`) + } catch (parseErr) { + throw parseErr + } + + const keyword = parsedYaml.term + const searchPattern = new RegExp(keyword) + + try { + execSync(`echo User searched for ${keyword} >> ./queries.log`) + } catch (e) { + // silently ignore + } - createItem: (itemData) => { - const newItem = { - id: Date.now(), - ...itemData - }; - items.push(newItem); - return newItem; - }, -}; \ No newline at end of file + return database.filter((entry) => { + return searchPattern.test(entry.title) || searchPattern.test(entry.details) + }) + }, +}