From e154350332e2fadebcb3591473caed833c62f33f Mon Sep 17 00:00:00 2001 From: bardansimona123 Date: Mon, 2 Dec 2024 21:06:29 +0000 Subject: [PATCH 1/4] o parte a codului --- models/contacts.js | 52 ++++++++++++++++--- package-lock.json | 112 ++++++++++++++++++++++++++++++++++++++++- package.json | 4 +- routes/api/contacts.js | 75 ++++++++++++++++++++++----- 4 files changed, 221 insertions(+), 22 deletions(-) diff --git a/models/contacts.js b/models/contacts.js index 409d11c7c09..887cb805ecf 100644 --- a/models/contacts.js +++ b/models/contacts.js @@ -1,14 +1,51 @@ -// const fs = require('fs/promises') +const fs = require('fs/promises'); +const path = require('path'); +const nanoid = (...args) => import('nanoid').then(mod => mod.nanoid(...args)); -const listContacts = async () => {} -const getContactById = async (contactId) => {} +const contactsPath = path.join(__dirname, 'contacts.json'); -const removeContact = async (contactId) => {} +const listContacts = async () => { + const data = await fs.readFile(contactsPath, 'utf-8'); + return JSON.parse(data); +}; -const addContact = async (body) => {} +const getContactById = async (contactId) => { + const contacts = await listContacts(); + const contact = contacts.find((c) => c.id === contactId); + return contact || null; +}; -const updateContact = async (contactId, body) => {} +const removeContact = async (contactId) => { + const contacts = await listContacts(); + const index = contacts.findIndex((c) => c.id === contactId); + if (index === -1) { + return null; + } + const [removedContact] = contacts.splice(index, 1); + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); + return removedContact; +}; + +const addContact = async ({ name, email, phone }) => { + const contacts = await listContacts(); + const newContact = { id: await nanoid(), name, email, phone }; // Adăugăm await aici + contacts.push(newContact); + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); + return newContact; +}; + + +const updateContact = async (contactId, { name, email, phone }) => { + const contacts = await listContacts(); + const index = contacts.findIndex((c) => c.id === contactId); + if (index === -1) { + return null; + } + contacts[index] = { id: contactId, name, email, phone }; + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); + return contacts[index]; +}; module.exports = { listContacts, @@ -16,4 +53,5 @@ module.exports = { removeContact, addContact, updateContact, -} +}; + diff --git a/package-lock.json b/package-lock.json index e6d047044e5..77850576336 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,9 @@ "cors": "2.8.5", "cross-env": "7.0.3", "express": "4.17.1", - "morgan": "1.10.0" + "joi": "^17.13.3", + "morgan": "1.10.0", + "nanoid": "^5.0.9" }, "devDependencies": { "eslint": "7.19.0", @@ -141,6 +143,37 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -2166,6 +2199,18 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2439,6 +2484,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3757,6 +3819,37 @@ "strip-json-comments": "^3.1.1" } }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -5269,6 +5362,18 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "requires": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5486,6 +5591,11 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", diff --git a/package.json b/package.json index 5045e827160..13a3e4c4fcb 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "cors": "2.8.5", "cross-env": "7.0.3", "express": "4.17.1", - "morgan": "1.10.0" + "joi": "^17.13.3", + "morgan": "1.10.0", + "nanoid": "^5.0.9" }, "devDependencies": { "eslint": "7.19.0", diff --git a/routes/api/contacts.js b/routes/api/contacts.js index a60ebd69231..7091510a55e 100644 --- a/routes/api/contacts.js +++ b/routes/api/contacts.js @@ -1,25 +1,74 @@ -const express = require('express') +const express = require('express'); +const Joi = require('joi'); +const { + listContacts, + getContactById, + addContact, + removeContact, + updateContact, +} = require('../../models/contacts'); -const router = express.Router() +const router = express.Router(); + +const validateContact = Joi.object({ + name: Joi.string().required(), + email: Joi.string().email().required(), + phone: Joi.string().required(), +}); router.get('/', async (req, res, next) => { - res.json({ message: 'template message' }) -}) + try { + const contacts = await listContacts(); + res.status(200).json(contacts); + } catch (error) { + next(error); + } +}); router.get('/:contactId', async (req, res, next) => { - res.json({ message: 'template message' }) -}) + try { + const { contactId } = req.params; + const contact = await getContactById(contactId); + if (!contact) return res.status(404).json({ message: 'Not found' }); + res.status(200).json(contact); + } catch (error) { + next(error); + } +}); router.post('/', async (req, res, next) => { - res.json({ message: 'template message' }) -}) + try { + const { error } = validateContact.validate(req.body); + if (error) return res.status(400).json({ message: 'missing required name field' }); + const newContact = await addContact(req.body); + res.status(201).json(newContact); + } catch (error) { + next(error); + } +}); router.delete('/:contactId', async (req, res, next) => { - res.json({ message: 'template message' }) -}) + try { + const { contactId } = req.params; + const removedContact = await removeContact(contactId); + if (!removedContact) return res.status(404).json({ message: 'Not found' }); + res.status(200).json({ message: 'contact deleted' }); + } catch (error) { + next(error); + } +}); router.put('/:contactId', async (req, res, next) => { - res.json({ message: 'template message' }) -}) + try { + const { contactId } = req.params; + const { error } = validateContact.validate(req.body); + if (error) return res.status(400).json({ message: 'missing fields' }); + const updatedContact = await updateContact(contactId, req.body); + if (!updatedContact) return res.status(404).json({ message: 'Not found' }); + res.status(200).json(updatedContact); + } catch (error) { + next(error); + } +}); -module.exports = router +module.exports = router; From 0a7b23cc2a94f3243c8099219a5829fa620b5597 Mon Sep 17 00:00:00 2001 From: bardansimona123 Date: Wed, 4 Dec 2024 18:58:45 +0000 Subject: [PATCH 2/4] update --- app.js | 30 ++++--------- models/contacts.js | 85 ++++++++++++++++++------------------ package.json | 1 + routes/api/contacts.js | 98 +++++++++++++++++------------------------- 4 files changed, 90 insertions(+), 124 deletions(-) diff --git a/app.js b/app.js index 40fd9bc167f..6fa0dc1ca6a 100644 --- a/app.js +++ b/app.js @@ -1,25 +1,13 @@ -const express = require('express') -const logger = require('morgan') -const cors = require('cors') +const express = require("express"); +const cors = require("cors"); +const contactsRouter = require("./routes/api/contacts"); -const contactsRouter = require('./routes/api/contacts') +const app = express(); -const app = express() +app.use(cors()); +app.use(express.json()); // Middleware pentru a procesa JSON în cererile HTTP -const formatsLogger = app.get('env') === 'development' ? 'dev' : 'short' +// Rutele contactelor +app.use("/api/contacts", contactsRouter); -app.use(logger(formatsLogger)) -app.use(cors()) -app.use(express.json()) - -app.use('/api/contacts', contactsRouter) - -app.use((req, res) => { - res.status(404).json({ message: 'Not found' }) -}) - -app.use((err, req, res, next) => { - res.status(500).json({ message: err.message }) -}) - -module.exports = app +module.exports = app; diff --git a/models/contacts.js b/models/contacts.js index 887cb805ecf..dd5bf41a11e 100644 --- a/models/contacts.js +++ b/models/contacts.js @@ -1,57 +1,54 @@ -const fs = require('fs/promises'); -const path = require('path'); -const nanoid = (...args) => import('nanoid').then(mod => mod.nanoid(...args)); +const fs = require('fs/promises') +const path = require('path') - -const contactsPath = path.join(__dirname, 'contacts.json'); +const contactsPath = path.join(__dirname, 'contacts.json') const listContacts = async () => { - const data = await fs.readFile(contactsPath, 'utf-8'); - return JSON.parse(data); -}; + const data = await fs.readFile(contactsPath) + return JSON.parse(data) +} const getContactById = async (contactId) => { - const contacts = await listContacts(); - const contact = contacts.find((c) => c.id === contactId); - return contact || null; -}; + const contacts = await listContacts() + return contacts.find(contact => contact.id === contactId) +} const removeContact = async (contactId) => { - const contacts = await listContacts(); - const index = contacts.findIndex((c) => c.id === contactId); - if (index === -1) { - return null; - } - const [removedContact] = contacts.splice(index, 1); - await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); - return removedContact; -}; - -const addContact = async ({ name, email, phone }) => { - const contacts = await listContacts(); - const newContact = { id: await nanoid(), name, email, phone }; // Adăugăm await aici - contacts.push(newContact); - await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); - return newContact; -}; - - -const updateContact = async (contactId, { name, email, phone }) => { - const contacts = await listContacts(); - const index = contacts.findIndex((c) => c.id === contactId); - if (index === -1) { - return null; - } - contacts[index] = { id: contactId, name, email, phone }; - await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)); - return contacts[index]; -}; + const contacts = await listContacts() + const index = contacts.findIndex(contact => contact.id === contactId) + if (index === -1) return null + + const [deletedContact] = contacts.splice(index, 1) + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)) + return deletedContact +} + +const addContact = async (body) => { + const contacts = await listContacts() + const newContact = { ...body, id: generateId() } + contacts.push(newContact) + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)) + return newContact +} + +const updateContact = async (contactId, body) => { + const contacts = await listContacts() + const contact = contacts.find(contact => contact.id === contactId) + if (!contact) return null + + Object.assign(contact, body) + await fs.writeFile(contactsPath, JSON.stringify(contacts, null, 2)) + return contact +} + +const generateId = () => { + return Math.random().toString(36).substr(2, 9) // Basic random ID generator +} module.exports = { listContacts, getContactById, removeContact, addContact, - updateContact, -}; - + updateContact +} diff --git a/package.json b/package.json index 13a3e4c4fcb..5c48100c676 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "template", "version": "0.0.0", + "type": "module", "private": true, "scripts": { "start": "cross-env NODE_ENV=production node ./server.js", diff --git a/routes/api/contacts.js b/routes/api/contacts.js index 7091510a55e..3a4027dd950 100644 --- a/routes/api/contacts.js +++ b/routes/api/contacts.js @@ -1,74 +1,54 @@ -const express = require('express'); -const Joi = require('joi'); -const { - listContacts, - getContactById, - addContact, - removeContact, - updateContact, -} = require('../../models/contacts'); - +const express = require("express"); +const Joi = require("joi"); const router = express.Router(); -const validateContact = Joi.object({ - name: Joi.string().required(), +let nanoid; // Variabila pentru nanoid + +// Folosește import dinamic pentru nanoid +(async () => { + const { nanoid: generatedNanoid } = await import("nanoid"); + nanoid = generatedNanoid; +})(); + +// Schema Joi pentru validarea contactelor +const contactSchema = Joi.object({ + name: Joi.string().min(3).max(30).required(), + phone: Joi.string().pattern(/^[0-9]{10}$/).required(), email: Joi.string().email().required(), - phone: Joi.string().required(), }); -router.get('/', async (req, res, next) => { - try { - const contacts = await listContacts(); - res.status(200).json(contacts); - } catch (error) { - next(error); - } -}); +// Exemplu de contacte +let contacts = []; -router.get('/:contactId', async (req, res, next) => { - try { - const { contactId } = req.params; - const contact = await getContactById(contactId); - if (!contact) return res.status(404).json({ message: 'Not found' }); - res.status(200).json(contact); - } catch (error) { - next(error); - } +// Endpoint pentru obținerea contactelor +router.get("/", (req, res) => { + res.json(contacts); }); -router.post('/', async (req, res, next) => { - try { - const { error } = validateContact.validate(req.body); - if (error) return res.status(400).json({ message: 'missing required name field' }); - const newContact = await addContact(req.body); - res.status(201).json(newContact); - } catch (error) { - next(error); +// Endpoint pentru adăugarea unui contact +router.post("/", (req, res) => { + if (!nanoid) { + return res.status(500).send("Internal server error: nanoid not initialized"); } -}); -router.delete('/:contactId', async (req, res, next) => { - try { - const { contactId } = req.params; - const removedContact = await removeContact(contactId); - if (!removedContact) return res.status(404).json({ message: 'Not found' }); - res.status(200).json({ message: 'contact deleted' }); - } catch (error) { - next(error); - } + const { error } = contactSchema.validate(req.body); + if (error) return res.status(400).send(error.details[0].message); + + const { name, phone, email } = req.body; + const id = nanoid(); // Folosim nanoid pentru a genera un ID unic + + const newContact = { id, name, phone, email }; + contacts.push(newContact); + res.status(201).json(newContact); }); -router.put('/:contactId', async (req, res, next) => { - try { - const { contactId } = req.params; - const { error } = validateContact.validate(req.body); - if (error) return res.status(400).json({ message: 'missing fields' }); - const updatedContact = await updateContact(contactId, req.body); - if (!updatedContact) return res.status(404).json({ message: 'Not found' }); - res.status(200).json(updatedContact); - } catch (error) { - next(error); - } +// Endpoint pentru ștergerea unui contact +router.delete("/:id", (req, res) => { + const contactIndex = contacts.findIndex((contact) => contact.id === req.params.id); + if (contactIndex === -1) return res.status(404).send("Contact not found"); + + contacts.splice(contactIndex, 1); + res.status(204).send(); }); module.exports = router; From 73f1e5f2b3baf36cdfb8bf48491a492ccc92c69b Mon Sep 17 00:00:00 2001 From: bardansimona123 Date: Tue, 10 Dec 2024 18:43:39 +0000 Subject: [PATCH 3/4] finalizare tema 2 --- app.js | 5 +++ models/contacts.js | 17 ++++++-- models/contacts.json | 2 +- package.json | 1 - routes/api/contacts.js | 88 ++++++++++++++++++++++++------------------ 5 files changed, 69 insertions(+), 44 deletions(-) diff --git a/app.js b/app.js index 6fa0dc1ca6a..b13d0931afe 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,11 @@ app.use(cors()); app.use(express.json()); // Middleware pentru a procesa JSON în cererile HTTP // Rutele contactelor +app.use((req, res, next) => { + console.log(`Request received: ${req.method} ${req.url}`); + next(); + }); + app.use("/api/contacts", contactsRouter); module.exports = app; diff --git a/models/contacts.js b/models/contacts.js index dd5bf41a11e..05e354b06ef 100644 --- a/models/contacts.js +++ b/models/contacts.js @@ -2,11 +2,20 @@ const fs = require('fs/promises') const path = require('path') const contactsPath = path.join(__dirname, 'contacts.json') - +console.log('Contacts path:', contactsPath); const listContacts = async () => { - const data = await fs.readFile(contactsPath) - return JSON.parse(data) -} + try { + const data = await fs.readFile(contactsPath, 'utf-8'); + console.log('Data read from file:', data); // Adăugați acest log pentru a verifica ce este citit + return JSON.parse(data); // Încercați să parsezi JSON-ul + } catch (error) { + console.error('Error reading contacts:', error); + if (error.code === 'ENOENT') { + return []; // Dacă fișierul nu există, returnează un array gol + } + throw error; // Aruncă orice altă eroare + } +}; const getContactById = async (contactId) => { const contacts = await listContacts() diff --git a/models/contacts.json b/models/contacts.json index a21679132de..7e4ed721b24 100644 --- a/models/contacts.json +++ b/models/contacts.json @@ -59,4 +59,4 @@ "email": "Donec.elementum@scelerisquescelerisquedui.net", "phone": "(748) 206-2688" } -] +] \ No newline at end of file diff --git a/package.json b/package.json index 5c48100c676..13a3e4c4fcb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "template", "version": "0.0.0", - "type": "module", "private": true, "scripts": { "start": "cross-env NODE_ENV=production node ./server.js", diff --git a/routes/api/contacts.js b/routes/api/contacts.js index 3a4027dd950..0e6ebf74ec3 100644 --- a/routes/api/contacts.js +++ b/routes/api/contacts.js @@ -1,54 +1,66 @@ const express = require("express"); const Joi = require("joi"); -const router = express.Router(); - -let nanoid; // Variabila pentru nanoid +const { listContacts, getContactById, addContact, removeContact } = require("../../models/contacts"); -// Folosește import dinamic pentru nanoid -(async () => { - const { nanoid: generatedNanoid } = await import("nanoid"); - nanoid = generatedNanoid; -})(); +const router = express.Router(); -// Schema Joi pentru validarea contactelor -const contactSchema = Joi.object({ - name: Joi.string().min(3).max(30).required(), - phone: Joi.string().pattern(/^[0-9]{10}$/).required(), - email: Joi.string().email().required(), +// GET /api/contacts - pentru a obține lista de contacte +router.get("/", async (req, res) => { + try { + const contacts = await listContacts(); + res.status(200).json(contacts); + } catch (error) { + res.status(500).json({ message: "Server error" }); + } }); -// Exemplu de contacte -let contacts = []; - -// Endpoint pentru obținerea contactelor -router.get("/", (req, res) => { - res.json(contacts); +// GET /api/contacts/:id - pentru a obține un contact după ID +router.get("/:id", async (req, res) => { + const { id } = req.params; + try { + const contact = await getContactById(id); + if (!contact) { + return res.status(404).json({ message: "Contact not found" }); + } + res.status(200).json(contact); + } catch (error) { + res.status(500).json({ message: "Server error" }); + } }); -// Endpoint pentru adăugarea unui contact -router.post("/", (req, res) => { - if (!nanoid) { - return res.status(500).send("Internal server error: nanoid not initialized"); - } +// POST /api/contacts - pentru a adăuga un nou contact +router.post("/", async (req, res) => { + const { name, phone, email } = req.body; - const { error } = contactSchema.validate(req.body); - if (error) return res.status(400).send(error.details[0].message); + const schema = Joi.object({ + name: Joi.string().min(3).required(), + phone: Joi.string().required(), + email: Joi.string().email().required(), + }); - const { name, phone, email } = req.body; - const id = nanoid(); // Folosim nanoid pentru a genera un ID unic + const { error } = schema.validate({ name, phone, email }); + if (error) return res.status(400).send(error.details[0].message); - const newContact = { id, name, phone, email }; - contacts.push(newContact); - res.status(201).json(newContact); + try { + const newContact = await addContact({ name, phone, email }); + res.status(201).json(newContact); + } catch (error) { + res.status(500).json({ message: "Server error" }); + } }); -// Endpoint pentru ștergerea unui contact -router.delete("/:id", (req, res) => { - const contactIndex = contacts.findIndex((contact) => contact.id === req.params.id); - if (contactIndex === -1) return res.status(404).send("Contact not found"); - - contacts.splice(contactIndex, 1); - res.status(204).send(); +// DELETE /api/contacts/:id - pentru a șterge un contact +router.delete("/:id", async (req, res) => { + const { id } = req.params; + try { + const deletedContact = await removeContact(id); + if (!deletedContact) { + return res.status(404).json({ message: "Contact not found" }); + } + res.status(200).json({ message: "Contact deleted successfully" }); + } catch (error) { + res.status(500).json({ message: "Server error" }); + } }); module.exports = router; From 39a87013812f70aa03bdfd0ddaad16f42aace10c Mon Sep 17 00:00:00 2001 From: bardansimona123 Date: Thu, 26 Dec 2024 17:38:51 +0000 Subject: [PATCH 4/4] Update contacts.js --- models/contacts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/contacts.js b/models/contacts.js index 05e354b06ef..ccaa2e96659 100644 --- a/models/contacts.js +++ b/models/contacts.js @@ -11,9 +11,9 @@ const listContacts = async () => { } catch (error) { console.error('Error reading contacts:', error); if (error.code === 'ENOENT') { - return []; // Dacă fișierul nu există, returnează un array gol + return []; } - throw error; // Aruncă orice altă eroare + throw error; } };