diff --git a/src/routes/deleteLockCategories.ts b/src/routes/deleteLockCategories.ts index ec1b665..943d1d1 100644 --- a/src/routes/deleteLockCategories.ts +++ b/src/routes/deleteLockCategories.ts @@ -6,19 +6,32 @@ import { Category, Service, VideoID } from "../types/segments.model"; import { UserID } from "../types/user.model"; import { getService } from "../utils/getService"; -export async function deleteLockCategoriesEndpoint(req: Request, res: Response): Promise { +interface DeleteLockCategoriesRequest extends Request { + body: { + categories: Category[]; + service: string; + userID: UserID; + videoID: VideoID; + }; +} + +export async function deleteLockCategoriesEndpoint(req: DeleteLockCategoriesRequest, res: Response): Promise { // Collect user input data - const videoID = req.body.videoID as VideoID; - const userID = req.body.userID as UserID; - const categories = req.body.categories as Category[]; - const service = getService(req.body.service); + const { + body: { + videoID, + userID, + categories, + service + } + } = req; // Check input data is valid - if (!videoID - || !userID - || !categories - || !Array.isArray(categories) - || categories.length === 0 + if (!videoID || + !userID || + !categories || + !Array.isArray(categories) || + categories.length === 0 ) { return res.status(400).json({ message: "Bad Format", @@ -35,9 +48,9 @@ export async function deleteLockCategoriesEndpoint(req: Request, res: Response): }); } - await deleteLockCategories(videoID, categories, service); + await deleteLockCategories(videoID, categories, getService(service)); - return res.status(200).json({ message: `Removed lock categories entrys for video ${videoID}` }); + return res.status(200).json({ message: `Removed lock categories entries for video ${videoID}` }); } /** @@ -47,17 +60,21 @@ export async function deleteLockCategoriesEndpoint(req: Request, res: Response): * @param service */ export async function deleteLockCategories(videoID: VideoID, categories: Category[], service: Service): Promise { - const entries = ( - await db.prepare("all", 'SELECT * FROM "lockCategories" WHERE "videoID" = ? AND "service" = ?', [videoID, service])) - .filter((entry: any) => { - return categories === null || categories.indexOf(entry.category) !== -1; - }); + type DBEntry = { category: Category }; + const dbEntries = await db.prepare( + "all", + 'SELECT * FROM "lockCategories" WHERE "videoID" = ? AND "service" = ?', + [videoID, service] + ) as Array; - for (const entry of entries) { - await db.prepare( + const entries = dbEntries.filter( + ({ category }: DBEntry) => categories === null || categories.indexOf(category) !== -1); + + await Promise.all( + entries.map(({ category }: DBEntry) => db.prepare( "run", 'DELETE FROM "lockCategories" WHERE "videoID" = ? AND "service" = ? AND "category" = ?', - [videoID, service, entry.category] - ); - } + [videoID, service, category] + )) + ); }