From bc9daa3aa91e30351a260be3c76faa76fb5fc126 Mon Sep 17 00:00:00 2001 From: djdembeck Date: Fri, 19 Aug 2022 18:32:03 -0500 Subject: [PATCH] feat(helper): :sparkles: add `BookDeleteHelper` for delete route --- src/config/routes/books/delete.ts | 15 ++++---- src/helpers/routes/BookDeleteHelper.ts | 50 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 src/helpers/routes/BookDeleteHelper.ts diff --git a/src/config/routes/books/delete.ts b/src/config/routes/books/delete.ts index d3c441ec..40816710 100644 --- a/src/config/routes/books/delete.ts +++ b/src/config/routes/books/delete.ts @@ -1,8 +1,7 @@ import { FastifyInstance } from 'fastify' import { RequestGeneric } from '#config/typing/requests' -import PaprAudibleBookHelper from '#helpers/database/audible/PaprAudibleBookHelper' -import RedisHelper from '#helpers/database/RedisHelper' +import BookDeleteHelper from '#helpers/routes/BookDeleteHelper' import SharedHelper from '#helpers/shared' async function _delete(fastify: FastifyInstance) { @@ -16,20 +15,18 @@ async function _delete(fastify: FastifyInstance) { } // Setup Helpers - const paprHelper = new PaprAudibleBookHelper(request.params.asin, {}) const { redis } = fastify - const redisHelper = new RedisHelper(redis, 'book', request.params.asin) + const helper = new BookDeleteHelper(request.params.asin, redis) - // Get book from database - const existingBook = await paprHelper.findOne() + // Call helper handler + const isHandled = await helper.handler() - if (!existingBook) { + if (!isHandled) { reply.code(404) throw new Error(`${request.params.asin} not found in the database`) } - await redisHelper.deleteOne() - return paprHelper.delete() + return { message: `${request.params.asin} deleted` } }) } diff --git a/src/helpers/routes/BookDeleteHelper.ts b/src/helpers/routes/BookDeleteHelper.ts new file mode 100644 index 00000000..fd994200 --- /dev/null +++ b/src/helpers/routes/BookDeleteHelper.ts @@ -0,0 +1,50 @@ +import { FastifyRedis } from '@fastify/redis' + +import { BookDocument } from '#config/models/Book' +import PaprAudibleBookHelper from '#helpers/database/audible/PaprAudibleBookHelper' +import RedisHelper from '#helpers/database/RedisHelper' + +export default class BookDeleteHelper { + asin: string + paprHelper: PaprAudibleBookHelper + redisHelper: RedisHelper + originalBook: BookDocument | null = null + constructor(asin: string, redis: FastifyRedis | null) { + this.asin = asin + this.paprHelper = new PaprAudibleBookHelper(this.asin, { + seedAuthors: undefined, + update: undefined + }) + this.redisHelper = new RedisHelper(redis, 'book', this.asin) + } + + async getBookFromPapr(): Promise { + return (await this.paprHelper.findOne()).data + } + + /** + * Actions to run when a deletion is requested + */ + async deleteActions() { + // 1. Delete the book from cache + await this.redisHelper.deleteOne() + + // 2. Delete the book from DB + return (await this.paprHelper.delete()).modified + } + + /** + * Main handler for the book delete route + */ + async handler() { + this.originalBook = await this.getBookFromPapr() + + // If the book is already present + if (this.originalBook) { + return this.deleteActions() + } + + // If the book is not present + return false + } +}