Skip to content

src/books-router.ts โ€‹

From Week 2 in-class: books router ยท original: week2-router/src/books-router.ts ยท all files in this project

ts
// books-router.ts

import express from 'express';
import type { Request, Response, NextFunction } from 'express';


import { BookStatus, type Book } from './types.js';
import { addBook, getAllBooks, removeBook } from './books-service.js';

const secretKey = 'SI679';
const checkAuth = (req: Request, res: Response, next: NextFunction): void => {
  const {authorization} = req.headers;
  // authorization should look like "Bearer SI679"
  // We just want the 2nd part, which we compare against the secretKey
  if (authorization && secretKey === authorization.split(' ')[1]) {
    next();
  } else {
    res.sendStatus(403); // forbidden!
  }
}

const validateBookParams = (req: Request, res: Response, next: NextFunction): void => {
    const {title, author} = req.body;
    if (title && author && title !== '' && author !== '') {
      next();
    } else {
      res
        .status(400)
        .send('Book data must include non-blank "title" and "author" fields.');
    }
  }


const logger = (req: Request, res: Response, next: NextFunction): void => {
    console.log(
      req.method,
      `/books${req.path}`,
      req.hostname
    );
    next();
}

export const booksRouter = express.Router();
booksRouter.use(logger);



booksRouter.use(express.json());

// note that we change the route from '/books' to '/'
booksRouter.post(
    '/',
    [checkAuth, validateBookParams],
    (req: Request, res: Response) => {
  const {title, author, year} = req.body;
  const status: BookStatus = BookStatus.STATUS_AVAILABLE; // default 
  const id = Date.now();
  const bookToAdd: Book = {
    id, title, author, year, status
  }
  addBook(bookToAdd);
  res.json(bookToAdd);
});


booksRouter.get('/', (req: Request, res: Response) => {
    const books = getAllBooks();
    res.json(books);
  });

booksRouter.delete('/', checkAuth, (req: Request, res: Response) => {
    removeBook(Number(req.body.id));
    res.sendStatus(200);
});

booksRouter.get('/badroute', (req:Request, res:Response)=>{
    throw Error("This is a bad route");
})

// filter request
// booksRouter.get('/', (req:Request, res:Response)=>{
//     console.log('HIT /books handler', req.query);
//     const {title, author, year} = req.query;
//     const books = getAllBooks();
//     let response=books;
//     if (title){
//         response=response.filter(book=>book.title===title)
//     }
//     if (author){
//         response=response.filter(book=>book.author===author)

//     }
//     if (year){
//         if (isNaN(Number(year))) { //NaN not a number
//             res.status(400).send("Error: itemid must be a number");
//             return;
//           }
//         response=response.filter(book=>book.year===Number(year))

//     }
//     res.json(response)
// })