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..1177830 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -1,18 +1,43 @@ -let items = [ - { id: 1, name: 'Sample Item', description: 'This is a sample item' } -]; +const yaml = require('js-yaml') +const { exec } = require('child_process') + + +let items = [{ id: 1, name: 'Sample Item', description: 'This is a sample item' }] module.exports = { - getAllItems: () => { - return items; - }, - - createItem: (itemData) => { - const newItem = { - id: Date.now(), - ...itemData - }; - items.push(newItem); - return newItem; - }, -}; \ No newline at end of file + getAllItems: () => { + return items + }, + + createItem: (itemData) => { + const newItem = { + id: Date.now(), + ...itemData, + } + items.push(newItem) + return newItem + }, + + searchItems: async (queryObj) => { + let parsed + try { + parsed = yaml.load(`q: ${queryObj.q}`) + } catch (e) { + throw new Error('Invalid query format') + } + const q = parsed.q + + const regex = new RegExp(`^${q}`, 'i') + + exec(`echo Searching for ${q} >> search.log`, (err) => { + if (err) { + } + }) + + const results = items.filter((item) => { + return regex.test(item.name) || regex.test(item.description) + }) + + return results + }, +}