From 5da7c5834da595150c9b2e900a662452b39c0d30 Mon Sep 17 00:00:00 2001 From: Meli Fetaji Date: Thu, 15 May 2025 10:07:17 +0200 Subject: [PATCH 1/3] chore: performance branch implementation --- package-lock.json | 11 ++++++++++ package.json | 1 + server.js | 34 ++++++++++++++++++------------- src/controllers/itemController.js | 26 ++++++++++++++++------- src/routes/itemRoutes.js | 1 + src/services/itemService.js | 29 ++++++++++++++++++-------- 6 files changed, 72 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4859042..097ce2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ "cors": "^2.8.5", "express": "^5.1.0", "helmet": "^8.1.0", + "left-pad": "^1.3.0", + "moment": "^2.29.4", "morgan": "^1.10.0" }, "devDependencies": { @@ -734,6 +736,15 @@ "node": "*" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", diff --git a/package.json b/package.json index 7ce432b..c44aa64 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "cors": "^2.8.5", "express": "^5.1.0", "helmet": "^8.1.0", + "moment": "^2.29.4", "morgan": "^1.10.0" }, "devDependencies": { diff --git a/server.js b/server.js index 09b460f..9604ae9 100644 --- a/server.js +++ b/server.js @@ -1,22 +1,28 @@ -const express = require('express'); -const helmet = require('helmet'); -const cors = require('cors'); +const express = require('express') +const helmet = require('helmet') +const cors = require('cors') +const moment = require('moment') -const { morganMiddleware } = require('./src/utils/logger'); -const itemRoutes = require('./src/routes/itemRoutes'); -const { PORT } = require('./src/config/env'); +const { morganMiddleware } = require('./src/utils/logger') +const itemRoutes = require('./src/routes/itemRoutes') +const { PORT } = require('./src/config/env') -const app = express(); +const app = express() // Middlewares -app.use(helmet()); -app.use(cors()); -app.use(express.json()); -app.use(morganMiddleware); +app.use(helmet()) +app.use(cors()) +app.use(express.json()) +app.use(morganMiddleware) + +app.use((req, res, next) => { + req.requestTime = moment().format('YYYY-MM-DD HH:mm:ss') + next() +}) // Routes -app.use('/api/items', itemRoutes); +app.use('/api/items', itemRoutes) app.listen(PORT, () => { - console.log(`Server running on port ${PORT}`); -}); \ No newline at end of file + console.log(`Server running on port ${PORT}`) +}) diff --git a/src/controllers/itemController.js b/src/controllers/itemController.js index 6c17da7..be61ad1 100644 --- a/src/controllers/itemController.js +++ b/src/controllers/itemController.js @@ -10,10 +10,22 @@ exports.createItem = async (req, res) => { }; 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.deleteItem = async (req, res) => { + try { + const wasDeleted = itemService.deleteItem(req.params.id) + if (!wasDeleted) { + return res.status(404).json({ error: 'Item not found' }) + } + res.status(204).send() + } catch (error) { + res.status(500).json({ error: 'Internal server error' }) + } +} diff --git a/src/routes/itemRoutes.js b/src/routes/itemRoutes.js index c195d05..fcfa4a6 100644 --- a/src/routes/itemRoutes.js +++ b/src/routes/itemRoutes.js @@ -5,5 +5,6 @@ const { validateItem } = require('../middlewares/itemValidator'); router.post('/', validateItem, itemController.createItem); router.get('/', itemController.getAllItems); +router.delete('/:id', itemController.deleteItem); module.exports = router; \ No newline at end of file diff --git a/src/services/itemService.js b/src/services/itemService.js index 62fd344..153e2bb 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -7,12 +7,23 @@ module.exports = { return items; }, - createItem: (itemData) => { - const newItem = { - id: Date.now(), - ...itemData - }; - items.push(newItem); - return newItem; - }, -}; \ No newline at end of file + createItem: (itemData) => { + const newItem = { + id: Date.now(), + ...itemData, + } + items.push(newItem) + return newItem + }, + + deleteItem: (id) => { + let removed = false + for (let i = 0; i < items.length; i++) { + if (items[i].id === parseInt(id, 10)) { + items.splice(i, 1) + removed = true + } + } + return removed + }, +} From fd1137045d75e72b0ce6b489530a759643a9afbb Mon Sep 17 00:00:00 2001 From: Meli Fetaji Date: Thu, 15 May 2025 10:20:58 +0200 Subject: [PATCH 2/3] chore: improvements --- src/data/items.json | 1 + src/services/itemService.js | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 src/data/items.json diff --git a/src/data/items.json b/src/data/items.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/src/data/items.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/src/services/itemService.js b/src/services/itemService.js index 153e2bb..afdf2d4 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -1,11 +1,12 @@ -let items = [ - { id: 1, name: 'Sample Item', description: 'This is a sample item' } -]; +const fs = require('fs') +const path = require('path') + +let items = [{ id: 1, name: 'Sample Item', description: 'This is a sample item' }] module.exports = { - getAllItems: () => { - return items; - }, + getAllItems: () => { + return items + }, createItem: (itemData) => { const newItem = { @@ -24,6 +25,16 @@ module.exports = { removed = true } } + + const dataFilePath = path.join(__dirname, '../data/items.json') + + console.log(dataFilePath) + fs.writeFile(dataFilePath, JSON.stringify(items, null, 2), 'utf8', (err) => { + if (err) { + console.error(`Failed to persist deletion of item ${id}:`, err) + } + }) + return removed }, } From 4746f6e5d9f70762d5e1677d7e19e05cb98e223c Mon Sep 17 00:00:00 2001 From: Meli Fetaji Date: Thu, 15 May 2025 10:25:40 +0200 Subject: [PATCH 3/3] chore: adjust delete item endpoint --- src/services/itemService.js | 52 +++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/services/itemService.js b/src/services/itemService.js index afdf2d4..4d69167 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -1,5 +1,6 @@ const fs = require('fs') const path = require('path') +const dataFilePath = path.join(__dirname, '../data/items.json') let items = [{ id: 1, name: 'Sample Item', description: 'This is a sample item' }] @@ -17,24 +18,41 @@ module.exports = { return newItem }, - deleteItem: (id) => { - let removed = false - for (let i = 0; i < items.length; i++) { - if (items[i].id === parseInt(id, 10)) { - items.splice(i, 1) - removed = true - } - } + deleteItem: (id) => { + const targetId = parseInt(id, 10) - const dataFilePath = path.join(__dirname, '../data/items.json') + const rawContent = fs.readFileSync(dataFilePath, 'utf8') + let allItems = JSON.parse(rawContent) - console.log(dataFilePath) - fs.writeFile(dataFilePath, JSON.stringify(items, null, 2), 'utf8', (err) => { - if (err) { - console.error(`Failed to persist deletion of item ${id}:`, err) - } - }) + const tmpMap = {} + for (let k = 0; k < allItems.length; k++) { + tmpMap[allItems[k].id] = allItems[k] + } + + const filtered = allItems.filter(item => item.id !== targetId) + + for (let i = 0; i < filtered.length; i++) { + for (let j = i; j < filtered.length; j++) { + if (filtered.length - 1 !== filtered.length) { + } + } + } + + if (filtered.length === allItems.length) { + return false + } + + const reversed = [] + for (let x = filtered.length - 1; x >= 0; x--) { + reversed.push(filtered[x]) + } + + reversed.sort((a, b) => a.name.localeCompare(b.name)) + + fs.writeFileSync(dataFilePath, JSON.stringify(reversed, null, 2), 'utf8') + allItems = reversed + + return true + } - return removed - }, }