Skip to content

Commit

Permalink
feat(route): ✨ add delete route for chapters
Browse files Browse the repository at this point in the history
  • Loading branch information
djdembeck committed Aug 20, 2022
1 parent bc4021e commit cb86799
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
33 changes: 33 additions & 0 deletions src/config/routes/books/chapters/delete.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { FastifyInstance } from 'fastify'

import { RequestGeneric } from '#config/typing/requests'
import ChapterDeleteHelper from '#helpers/routes/ChapterDeleteHelper'
import SharedHelper from '#helpers/shared'

async function _delete(fastify: FastifyInstance) {
fastify.delete<RequestGeneric>('/books/:asin/chapters', async (request, reply) => {
// Setup common helper first
const commonHelpers = new SharedHelper()
// First, check ASIN validity
if (!commonHelpers.checkAsinValidity(request.params.asin)) {
reply.code(400)
throw new Error('Bad ASIN')
}

// Setup helper
const { redis } = fastify
const helper = new ChapterDeleteHelper(request.params.asin, redis)

// Call helper handler
const isHandled = await helper.handler()

if (!isHandled) {
reply.code(404)
throw new Error(`${request.params.asin} not found in the database`)
}

return { message: `${request.params.asin} deleted` }
})
}

export default _delete
49 changes: 49 additions & 0 deletions src/helpers/routes/ChapterDeleteHelper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { FastifyRedis } from '@fastify/redis'

import { ChapterDocument } from '#config/models/Chapter'
import PaprAudibleChapterHelper from '#helpers/database/audible/PaprAudibleChapterHelper'
import RedisHelper from '#helpers/database/RedisHelper'

export default class ChapterDeleteHelper {
asin: string
paprHelper: PaprAudibleChapterHelper
redisHelper: RedisHelper
originalChapter: ChapterDocument | null = null
constructor(asin: string, redis: FastifyRedis | null) {
this.asin = asin
this.paprHelper = new PaprAudibleChapterHelper(this.asin, {
update: undefined
})
this.redisHelper = new RedisHelper(redis, 'chapter', this.asin)
}

async getChaptersFromPapr(): Promise<ChapterDocument | null> {
return (await this.paprHelper.findOne()).data
}

/**
* Actions to run when a deletion is requested
*/
async deleteActions() {
// 1. Delete the chapter from cache
await this.redisHelper.deleteOne()

// 2. Delete the chapter from DB
return (await this.paprHelper.delete()).modified
}

/**
* Main handler for the chapter delete route
*/
async handler() {
this.originalChapter = await this.getChaptersFromPapr()

// If the chapter is already present
if (this.originalChapter) {
return this.deleteActions()
}

// If the chapter is not present
return false
}
}
4 changes: 3 additions & 1 deletion src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { initialize } from '#config/papr'
import deleteAuthor from '#config/routes/authors/delete'
import searchAuthor from '#config/routes/authors/search/show'
import showAuthor from '#config/routes/authors/show'
import deleteChapter from '#config/routes/books/chapters/delete'
import showChapter from '#config/routes/books/chapters/show'
import deleteBook from '#config/routes/books/delete'
import showBook from '#config/routes/books/show'
Expand All @@ -25,8 +26,9 @@ const server = fastify({
// Register routes
server
.register(showBook)
.register(showChapter)
.register(deleteBook)
.register(showChapter)
.register(deleteChapter)
.register(showAuthor)
.register(deleteAuthor)
.register(searchAuthor)
Expand Down

0 comments on commit cb86799

Please sign in to comment.