135 lines
2.9 KiB
JavaScript
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}`);
|
|
});
|