From f3d6f53f6dcf882c79453e18b469b47b5fd01f38 Mon Sep 17 00:00:00 2001 From: Zed Date: Sun, 16 Jan 2022 20:32:45 +0100 Subject: [PATCH] Rework profile cache behavior, fix suspended cache Fixes #480 --- src/api.nim | 2 +- src/experimental/parser/user.nim | 4 ++-- src/redis_cache.nim | 18 ++++++++++++------ src/routes/timeline.nim | 17 +++++------------ 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/api.nim b/src/api.nim index 50771b7..b1ecc57 100644 --- a/src/api.nim +++ b/src/api.nim @@ -34,7 +34,7 @@ proc getProfile*(username: string): Future[Profile] {.async.} = let ps = genParams({"screen_name": username}) json = await fetchRaw(userShow ? ps, Api.userShow) - result = parseUser(json) + result = parseUser(json, username) proc getProfileById*(userId: string): Future[Profile] {.async.} = let diff --git a/src/experimental/parser/user.nim b/src/experimental/parser/user.nim index f5b91ac..af8cb82 100644 --- a/src/experimental/parser/user.nim +++ b/src/experimental/parser/user.nim @@ -38,10 +38,10 @@ proc getBanner(user: User): string = return '#' & user.profileLinkColor return "#161616" -proc parseUser*(json: string): Profile = +proc parseUser*(json: string; username=""): Profile = handleErrors: case error.code - of suspended: return Profile(suspended: true) + of suspended: return Profile(username: username, suspended: true) of userNotFound: return else: echo "[error - parseUser]: ", error diff --git a/src/redis_cache.nim b/src/redis_cache.nim index ea1df26..fe622f9 100644 --- a/src/redis_cache.nim +++ b/src/redis_cache.nim @@ -80,16 +80,16 @@ proc cache*(data: PhotoRail; name: string) {.async.} = await setEx("pr:" & toLower(name), baseCacheTime, compress(toFlatty(data))) proc cache*(data: Profile) {.async.} = - if data.username.len == 0 or data.id.len == 0: return + if data.username.len == 0: return let name = toLower(data.username) pool.withAcquire(r): r.startPipelining() dawait r.setEx(name.profileKey, baseCacheTime, compress(toFlatty(data))) - dawait r.setEx("i:" & data.id , baseCacheTime, data.username) - dawait r.hSet(name.pidKey, name, data.id) + if data.id.len > 0: + dawait r.hSet(name.pidKey, name, data.id) dawait r.flushPipeline() -proc cacheProfileId*(username, id: string) {.async.} = +proc cacheProfileId(username, id: string) {.async.} = if username.len == 0 or id.len == 0: return let name = toLower(username) pool.withAcquire(r): @@ -117,15 +117,21 @@ proc getCachedProfile*(username: string; fetch=true): Future[Profile] {.async.} result = fromFlatty(uncompress(prof), Profile) elif fetch: result = await getProfile(username) + await cacheProfileId(result.username, result.id) + if result.suspended: + await cache(result) proc getCachedProfileUsername*(userId: string): Future[string] {.async.} = - let username = await get("i:" & userId) + let + key = "i:" & userId + username = await get(key) + if username != redisNil: result = username else: let profile = await getProfileById(userId) result = profile.username - await cache(profile) + await setEx(key, baseCacheTime, result) proc getCachedPhotoRail*(name: string): Future[PhotoRail] {.async.} = if name.len == 0: return diff --git a/src/routes/timeline.nim b/src/routes/timeline.nim index 12c2baa..9eefc4e 100644 --- a/src/routes/timeline.nim +++ b/src/routes/timeline.nim @@ -30,20 +30,13 @@ proc fetchTimeline*(after: string; query: Query; skipRail=false): if profileId.len == 0: profile = await getCachedProfile(name) - profileId = if profile.suspended: "s" - else: profile.id - - if profileId.len > 0: - await cacheProfileId(profile.username, profileId) - + profileId = profile.id fetched = true - if profileId.len == 0 or profile.protected: - result[0] = profile - return - elif profileId == "s": - result[0] = Profile(username: name, suspended: true) - return + if profile.protected or profile.suspended: + return (profile, Timeline(), @[]) + elif profileId.len == 0: + return (Profile(username: name), Timeline(), @[]) var rail: Future[PhotoRail] if skipRail or profile.protected or query.kind == media: