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/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/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..4d69167 100644 --- a/src/services/itemService.js +++ b/src/services/itemService.js @@ -1,18 +1,58 @@ -let items = [ - { id: 1, name: 'Sample Item', description: 'This is a sample item' } -]; +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' }] 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 + }, + + deleteItem: (id) => { + const targetId = parseInt(id, 10) + + const rawContent = fs.readFileSync(dataFilePath, 'utf8') + let allItems = JSON.parse(rawContent) + + 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 + } + +}