Deleting A Book Listing By ID - Implementation
1 - Route Name
This will be our final API endpoint!
DELETE /api/v1/books/:id
Just like we planned, let's add in the route and our controller.
File: src/routes/book.route.js
const express = require('express')
const router = express.Router()
const {
getAllBooks,
getBookById,
createABook,
updateABook
} = require('../controllers/book')
router.get('/', getAllBooks)
router.get('/:id', getBookById)
router.post('/', createABook)
router.put('/:id', updateABook)
// This is the new route we are adding in
router.delete('/:id', deleteABook)
File: src/controllers/book/deleteABook.js
const catchException = require('../../utils/catchExceptions')
/**
* Deletes an existing new book listing.
*/
const deleteABook = catchException(async (req, res) => {
// Our code goes here
})
2 - Input Request
None.
3 - Middleware
As mentioned before, we will be reusing our isAuthenticated
and bookPermission
middleware.
If we plug those in, our route should look something like this.
File: src/routes/book.route.js
const express = require('express')
const router = express.Router()
const { deleteABook } = require('../controllers/book')
const isAuthenticated = require('../middleware/auth.middleware')
const bookPermission = require('../middleware/bookPermission.middleware')
router.delete('/:id', isAuthenticated, bookPermission, deleteABook)
module.exports = router
4 - Validation
None.
5 - Domain
If you've followed along till this point, then the following will be of no surprise to you. Do note that because we are deleting a book, the deleteOne
method from mongoose will either return a 1 for successful deletion or a 0 for a failed deletion. For a failed deletion to happen, it will have been an invalid bookId
was inputted. Recall that we have already taken care of that in our bookPermission
middleware, so no error handling is necessary here.
File: src/domain/repositories/book.repository.js
const Model = require('../models/book.model')
// Delete
const deleteById = async (id) => {
return await Model.deleteOne({ _id: id })
}
module.exports = {
deleteById
}
File: src/domain/services/book.service.js
const mongoose = require('mongoose')
const ApiException = require('../../utils/ApiException')
const bookRepository = require('../repositories/book.repository')
const checkBookId = require('../../utils/checkBookId')
// Delete a book
const deleteBookById = async (bookId) => {
return await bookRepository.deleteById(bookId)
}
module.exports = {
deleteBookById
}
6 - Events
None.
7 - Response
Once all our error handling will be taken care of by the isAuthenticated
and bookPermission
middleware. If there are no errors, we should show a success message like the following.
const globalResponseDto = require('../../responses/globalResponseDto')
const catchException = require('../../utils/catchExceptions')
const bookService = require('../../domain/services/book.service')
/**
* Deletes an existing new book listing.
*/
const deleteABook = catchException(async (req, res) => {
const book = await bookService.deleteBookById(req.params.id)
res.json(
globalResponseDto({
status: 'success',
code: 200,
message: `The book with the id: ${book.id} was successfully deleted.`,
data: null,
errors: null
})
)
})
module.exports = deleteABook
Last updated