This repository has been archived on 2025-12-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
fullstack-open/part3/phonebook/index.js
Andrew Trieu edafd20501 Upload part 3
2023-05-30 08:06:35 +03:00

105 lines
2.4 KiB
JavaScript

/* eslint-disable no-unused-vars */
require('dotenv').config()
const express = require('express')
const app = express()
const cors = require('cors')
const morgan = require('morgan')
const Phonebook = require('./models/phonebook')
app.use(cors())
app.use(express.json())
app.use(express.static('build'))
morgan.token('body', function (req, res) {
return req.method === 'POST' ? JSON.stringify(req.body) : ''
})
app.use(
morgan(':method :url :status :res[content-length] - :response-time ms :body')
)
app.get('/api/persons', (req, res) => {
Phonebook.find({}).then(result => {
res.json(result)
})
})
app.get('/info', (req, res) => {
Phonebook.find({}).then(result => {
res.send(`<p>Phonebook has info for ${result.length} people</p><p>${Date()}</p>`)
})
})
app.get('/api/persons/:id', (req, res, next) => {
Phonebook.findById(req.params.id)
.then(result => {
if (result) {
res.json(result)
} else {
res.status(404).end()
}
})
.catch(error => next(error))
})
app.put('/api/persons/:id', (req, res, next) => {
const { name, number } = req.body
Phonebook.findByIdAndUpdate(
req.params.id,
{ name, number },
{ new: true, runValidators: true, context: 'query' }
)
.then(updatedPerson => {
res.json(updatedPerson)
})
.catch(error => next(error))
})
app.delete('/api/persons/:id', (req, res, next) => {
Phonebook.findByIdAndRemove(req.params.id)
.then(() => {
res.status(204).end()
})
.catch(error => next(error))
})
app.post('/api/persons', (req, res, next) => {
const { name, number } = req.body
if ( name || number) {
return res.status(400).json({
error: 'name or number is missing',
})
}
const phonebook = new Phonebook({
name: name,
number: number,
})
phonebook.save().then(result => {
res.json(result)
}).catch(error => next(error))
})
const unknownEndpoint = (req, res) => {
res.status(404).send({ error: 'unknown endpoint' })
}
app.use(unknownEndpoint)
const errorHandler = (error, res, next) => {
console.error(error.message)
if (error.name === 'CastError') {
return res.status(400).send({ error: 'malformatted id' })
} else if (error.name === 'ValidationError') {
return res.status(400).json({ error: error.message })
}
next(error)
}
app.use(errorHandler)
const PORT = process.env.PORT
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`)
})