fullstackopen-notes/parts/3/phonebookBackend/index.js

135 lines
2.9 KiB
JavaScript

const express = require("express");
const app = express();
const morgan = require("morgan");
const unknownEndpoint = (request, response) => {
response.status(404).send({ error: "unknown endpoint" });
};
app.use(express.json());
morgan.token("reqBody", (req) => {
return JSON.stringify(req.body);
});
app.use(
morgan(
":method :url :status :res[content-length] - :response-time ms - :reqBody"
)
);
const persons = [
{
id: "1",
name: "Arto Hellas",
number: "040-123456",
},
{
id: "2",
name: "Ada Lovelace",
number: "39-44-5323523",
},
{
id: "3",
name: "Dan Abramov",
number: "12-43-234345",
},
{
id: "4",
name: "Mary Poppendieck",
number: "39-23-6423122",
},
];
app.get("/api/persons", (request, response) => {
response.json(persons);
});
app.get("/api/persons/:id", (request, response) => {
const requestedId = Number(request.params.id);
const requestedPerson = persons.find(
(person) => Number(person.id) === requestedId
);
if (!requestedPerson) {
return response.status(404).json({
error: "ID not found.",
});
}
if (requestedPerson) {
return response.json(requestedPerson);
}
});
app.post("/api/persons/", (request, response) => {
if (!request.body.name || !request.body.number) {
return response.status(400).json({
success: false,
message: "Malformed body.",
});
}
const nameIsInPhonebook = persons.find(
(person) => person.name == request.body.name
);
if (nameIsInPhonebook) {
return response.status(409).json({
success: false,
message: "Name already in phonebook.",
});
}
const newId = Math.floor(Math.random() * 100_000_000 * 21);
const personData = {
id: newId,
name: request.body.name,
number: request.body.number,
};
persons.push(personData);
return response.status(201).json(personData);
});
app.delete("/api/persons/:id", (request, response) => {
const idToDelete = request.params.id;
const requestedPersonIndex = persons.findIndex((person) => {
console.log(`Person ID: ${person.id}`);
console.log(`ID to delete: ${idToDelete}`);
console.log(`Do they match? ${person.id === idToDelete}`);
return person.id === idToDelete;
});
console.log(requestedPersonIndex);
if (requestedPersonIndex !== -1) {
persons.splice(requestedPersonIndex, 1);
return response.status(204).json({ success: true });
}
if (requestedPersonIndex === -1) {
return response
.status(404)
.json({ success: true, message: "id not found" });
}
});
app.get("/info", (request, response) => {
let responseString = `<p>Phonebook has info for ${persons.length} people</p>`;
responseString += `<p>${new Date().toString()}</p>`;
const id = request.params.id;
response.send(responseString);
});
app.use(unknownEndpoint);
const PORT = 3001;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});