diff --git a/src/serviceWorker/db.ts b/src/serviceWorker/db.ts index 7e18992..9c3f83e 100644 --- a/src/serviceWorker/db.ts +++ b/src/serviceWorker/db.ts @@ -23,3 +23,9 @@ export const saveBook = async (book: BookT) => * Returns all books saved in IndexedDB */ export const getBooks = async () => (await openDB()).getAll("Books"); + +/** + * Gets book from IndexedDB by hash + */ +export const getBook = async (hash: string) => + (await openDB()).get("Books", hash); diff --git a/src/serviceWorker/fetchHandlers.ts b/src/serviceWorker/fetchHandlers.ts index b21bea7..4f41785 100644 --- a/src/serviceWorker/fetchHandlers.ts +++ b/src/serviceWorker/fetchHandlers.ts @@ -1,4 +1,4 @@ -import { getBooks, saveBook } from "./db"; +import { getBook, getBooks, saveBook } from "./db"; export interface PathHandler { /** Path start for handler */ @@ -43,3 +43,13 @@ export const handleBooks = async () => { return new Response(JSON.stringify(list)); }; + +/** + * Gets book from database + */ +export const handleBook = async (request: Request, hash: string) => { + const book = await getBook(hash); + if (book) return new Response(JSON.stringify(book)); + + return new Response("No such book :("); +}; diff --git a/src/serviceWorker/index.ts b/src/serviceWorker/index.ts index 48c8189..e48cfd2 100644 --- a/src/serviceWorker/index.ts +++ b/src/serviceWorker/index.ts @@ -2,10 +2,12 @@ import { fromCache, precache } from "./cache"; import { openDB as createDB } from "./db"; import { handle, + handleBook, handleBooks, handleBookUpload, PathHandler, } from "./fetchHandlers"; +import { getHash } from "./utils"; declare const self: ServiceWorkerGlobalScope; @@ -21,8 +23,9 @@ self.addEventListener("fetch", (event) => { const path = new URL(request.url).pathname; const handlers: PathHandler[] = [ - { path: "/upload", getResponse: () => handleBookUpload(request) }, { path: "/list", getResponse: () => handleBooks() }, + { path: "/book/", getResponse: () => handleBook(request, getHash(path)) }, + { path: "/upload", getResponse: () => handleBookUpload(request) }, { path: "", getResponse: () => fromCache(request) }, ]; diff --git a/src/serviceWorker/utils.ts b/src/serviceWorker/utils.ts new file mode 100644 index 0000000..c236df6 --- /dev/null +++ b/src/serviceWorker/utils.ts @@ -0,0 +1,9 @@ +/** + * Gets hash string from book path + */ +export const getHash = (path: string) => { + let hashLength = path.length - "/book/".length; + if (path.endsWith("/")) hashLength--; + + return path.substr("/book/".length, hashLength); +};