From 7d549e7a9bc64ede5a8ab10a38300bcefa7cf288 Mon Sep 17 00:00:00 2001 From: Alistair Henshaw Date: Wed, 19 Jun 2024 16:42:25 +0100 Subject: [PATCH] core hopefully, import done wrong potentially --- assets/api core diagram.png | Bin 0 -> 38246 bytes src/server.js | 120 ++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 assets/api core diagram.png diff --git a/assets/api core diagram.png b/assets/api core diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5c68e4506001aead92dec42ef13a19360be62125 GIT binary patch literal 38246 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
    NxbXqKV@HG>}fa8Ud24~XV)zqYPBY{!r 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 SYcc#Y#^|W2Ug6=B*Z&(7-zlE} literal 0 HcmV?d00001 diff --git a/src/server.js b/src/server.js index 30f0ce3..663269e 100644 --- a/src/server.js +++ b/src/server.js @@ -1,3 +1,5 @@ +// import contacts from "../data/contacts" + const express = require("express") const morgan = require("morgan") const cors = require("cors") @@ -8,6 +10,124 @@ app.use(cors()) app.use(express.json()) // write your app code here +// tried to import contacts but it would crash my terminal using npm start +// console.log(contacts) +const contacts = [ + { + id: 1, + firstName: "John", + lastName: "Carmack", + street: "10 Keen Street", + city: "London", + type: "work", + email: "test@test.com", + linkedin: "https://www.linkedin.com/school/boolean-uk/", + twitter: "https://twitter.com/booleanuk" + }, + { + id: 2, + firstName: "Grace", + lastName: "Hopper", + street: "32 Deebug Road", + city: "London", + type: "personal", + email: "test@test.com", + linkedin: "https://www.linkedin.com/school/boolean-uk/", + twitter: "https://twitter.com/booleanuk" + } +] + +let idCount = 3 +// const contacts = JSON.parse([ +// { +// "id": 1, +// "firstName": "John", +// "lastName": "Carmack", +// "street": "10 Keen Street", +// "city": "London", +// "type": "work", +// "email": "test@test.com", +// "linkedin": "https://www.linkedin.com/school/boolean-uk/", +// "twitter": "https://twitter.com/booleanuk" +// }, +// { +// "id": 2, +// "firstName": "Grace", +// "lastName": "Hopper", +// "street": "32 Deebug Road", +// "city": "London", +// "type": "personal", +// "email": "test@test.com", +// "linkedin": "https://www.linkedin.com/school/boolean-uk/", +// "twitter": "https://twitter.com/booleanuk" +// } +// ]) + +// console.log(contacts) + +app.get("/contacts", (req, res) => { + res.status(200).json({ + contacts + }) +}) + +app.get("/contacts/:id", (req, res) => { + const id = Number(req.params.id) + // console.log(id) + const contact = contacts.find(con => con.id === id) + // console.log(contact) + res.json({ + contact + }) +}) + +app.post("/contacts", (req, res) => { + // console.log(req.body) + let newContact = req.body + newContact.id = idCount + idCount++ + + contacts.push(newContact) + res.status(201).json({ + contact: newContact + }) +}) + +app.delete("/contacts/:id", (req, res) => { + const id = Number(req.params.id) + let contactIndex + for (let x = 0; x < contacts.length; x++) { + if (contacts[x].id === id) { + contactIndex = x + } + } + let contact = contacts.splice(contactIndex, 1) + // console.log(contact) + res.status(200).json({ + contact: contact[0] + }) +}) + +app.put("/contacts/:id", (req, res) => { + const id = Number(req.params.id) + // console.log(req.body) + let contactIndex + let newContact = req.body + newContact.id = id + contacts.forEach((contact, index) => { + if(contact.id === id) { + contactIndex = index + } + }) + contacts.splice(contactIndex, 1, newContact) + + + res.status(200).json({ + contact: newContact + }) +}) + + module.exports = app