From a060aaf4961fd9e9db8ffbd398c4eb52786417ac Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 31 Jan 2024 13:32:14 +0800 Subject: [PATCH] Make reading position parsing safer --- .../reading_progress_data_source.ts | 14 ++------ .../src/services/cached_reading_position.ts | 33 +++++++++++++++---- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/api/src/datasources/reading_progress_data_source.ts b/packages/api/src/datasources/reading_progress_data_source.ts index 3c860556f..6c08eca35 100644 --- a/packages/api/src/datasources/reading_progress_data_source.ts +++ b/packages/api/src/datasources/reading_progress_data_source.ts @@ -37,18 +37,8 @@ export class ReadingProgressDataSource { ...progress, } const cacheKey = keyForCachedReadingPosition(uid, libraryItemID) - pushCachedReadingPosition(uid, libraryItemID, cacheItem) - - this.cacheItems[cacheKey] = cacheItem - if ( - await redisDataSource.redisClient?.lpush( - cacheKey, - JSON.stringify(cacheItem) - ) - ) { - console.log('cached reading progress', cacheKey) - } else { - console.log('failed to cache reading progress') + if (await pushCachedReadingPosition(uid, libraryItemID, cacheItem)) { + this.cacheItems[cacheKey] = cacheItem } } } diff --git a/packages/api/src/services/cached_reading_position.ts b/packages/api/src/services/cached_reading_position.ts index 44e7edc72..4b47a49a5 100644 --- a/packages/api/src/services/cached_reading_position.ts +++ b/packages/api/src/services/cached_reading_position.ts @@ -1,6 +1,8 @@ import { redisDataSource } from '../redis_data_source' import { logger } from '../utils/logger' +export const CACHED_READING_POSITION_PREFIX = `omnivore:reading-progress` + export type ReadingProgressCacheItem = { uid: string libraryItemID: string @@ -10,7 +12,23 @@ export type ReadingProgressCacheItem = { updatedAt: string | undefined } -export const CACHED_READING_POSITION_PREFIX = `omnivore:reading-progress` +export const isReadingProgressCacheItem = ( + item: any +): item is ReadingProgressCacheItem => { + return ( + 'uid' in item && 'libraryItemID' in item && 'readingProgressPercent' in item + ) +} + +export const parseReadingProgressCacheItem = ( + item: any +): ReadingProgressCacheItem | undefined => { + const result = JSON.parse(item) as unknown + if (isReadingProgressCacheItem(result)) { + return result + } + return undefined +} export const keyForCachedReadingPosition = ( uid: string, @@ -77,7 +95,6 @@ export const fetchCachedReadingPosition = async ( uid: string, libraryItemID: string ): Promise => { - console.log('checking uid', uid, 'libraryItemId', libraryItemID) const cacheKey = keyForCachedReadingPosition(uid, libraryItemID) try { const cacheItemList = await redisDataSource.redisClient?.lrange( @@ -85,9 +102,9 @@ export const fetchCachedReadingPosition = async ( 0, -1 ) - console.log('cacheItemList: ', cacheKey, cacheItemList) - const items = cacheItemList?.map((item) => JSON.parse(item)) - console.log(' items[]: ', items) + const items = cacheItemList + ?.map((item) => parseReadingProgressCacheItem(item)) + .filter(isReadingProgressCacheItem) if (!items || items.length < 1) { return undefined } @@ -99,12 +116,14 @@ export const fetchCachedReadingPosition = async ( ) const top = Math.max( ...items.map((o) => - 'readingProgressTopPercent' in o ? o.readingProgressTopPercent : 0 + 'readingProgressTopPercent' in o ? o.readingProgressTopPercent ?? 0 : 0 ) ) const anchor = Math.max( ...items.map((o) => - 'readingProgressAnchorIndex' in o ? o.readingProgressAnchorIndex : 0 + 'readingProgressAnchorIndex' in o + ? o.readingProgressAnchorIndex ?? 0 + : 0 ) )