All files / src/services bookService.js

100% Statements 29/29
100% Branches 10/10
100% Functions 7/7
100% Lines 29/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 824x 4x             9x 9x                     7x       7x   7x 32x 2x         30x 180x 2x                   2x 2x 1x 1x       2x 2x   2x 1x     1x 1x         1x       2x   2x 1x     1x 1x       4x  
const uuid = require("uuid")
const READING_STATUS = require("../constants/reading-status");
 
class BookService {
  constructor(
    bookRepository,
    { id, user, title, status, startDateReading, endDateReading }
  ) {
    this.bookRepository = bookRepository;
    this.book = {
      id,
      user,
      title,
      status,
      startDateReading,
      endDateReading,
    }
  }
 
  getStatusRef() {
    return READING_STATUS[this.book.status];
  }
 
  validateBody() {
    const { title, fields } = this.getStatusRef();
 
    fields.forEach((field) => {
      if (!this.book[field]) {
        throw new Error(
          `The field "${field}" is required for registers with reading status "${title}"`
        );
      }
      
      for (const BookField in this.book) {
        if(!fields.includes(BookField) && this.book[BookField]) {
          throw new Error(
            `The field "${BookField}" should't be present for records with read status "${title}"`
          );
        }
      }
 
    });
  }
 
  async save() {
    this.book.id = uuid.v4()
    this.validateBody()
    const newBookRegister = await this.bookRepository.save(this.book);
    return newBookRegister
  }
 
  async update() {
    this.validateBody()
    const book = await this.bookRepository.find(this.book.id, "id")
 
    if(!book?.id) {
      throw new Error(`Book with id "${this.book.id}" Not Found!!`)
    }
 
    const { id, user, ...bookData} = this.book
    const updatedBook = await this.bookRepository.update(this.book.id, {
      user: book.user,
      ...bookData
    })
    
    return updatedBook
  }
 
  async delete() {
    const bookExists = await this.bookRepository.find(this.book.id, "id")
 
    if(!bookExists.id) {
      throw new Error(`Book with id "${this.book.id}" Not Found!!`)
    }
 
    this.bookRepository.delete(this.book.id)
    return
  }
}
 
module.exports = BookService;