diff --git a/src/middleware/etag.ts b/src/middleware/etag.ts index 3f1f30d..5298238 100644 --- a/src/middleware/etag.ts +++ b/src/middleware/etag.ts @@ -1,9 +1,9 @@ import { NextFunction, Request, Response } from "express"; import { VideoID, VideoIDHash, Service } from "../types/segments.model"; import { QueryCacher } from "../utils/queryCacher"; -import { brandingHashKey, brandingKey, skipSegmentsHashKey, skipSegmentsKey, videoLabelsHashKey, videoLabelsKey } from "../utils/redisKeys"; +import { brandingHashKey, brandingKey, skipSegmentsHashKey, skipSegmentsKey, videoLabelsHashKey, videoLabelsKey, videoLabelsLargerHashKey } from "../utils/redisKeys"; -type hashType = "skipSegments" | "skipSegmentsHash" | "videoLabel" | "videoLabelHash" | "branding" | "brandingHash"; +type hashType = "skipSegments" | "skipSegmentsHash" | "videoLabel" | "videoLabelHash" | "videoLabelsLargerHash" | "branding" | "brandingHash"; type ETag = `"${hashType};${VideoIDHash};${Service};${number}"`; type hashKey = string | VideoID | VideoIDHash; @@ -32,6 +32,7 @@ function getLastModified(hashType: hashType, hashKey: hashKey, service: Service) else if (hashType === "skipSegmentsHash") redisKey = skipSegmentsHashKey(hashKey as VideoIDHash, service); else if (hashType === "videoLabel") redisKey = videoLabelsKey(hashKey as VideoID, service); else if (hashType === "videoLabelHash") redisKey = videoLabelsHashKey(hashKey as VideoIDHash, service); + else if (hashType === "videoLabelsLargerHash") redisKey = videoLabelsLargerHashKey(hashKey as VideoIDHash, service); else if (hashType === "branding") redisKey = brandingKey(hashKey as VideoID, service); else if (hashType === "brandingHash") redisKey = brandingHashKey(hashKey as VideoIDHash, service); else return Promise.reject(); diff --git a/src/routes/getVideoLabel.ts b/src/routes/getVideoLabel.ts index 904ac47..a690ac2 100644 --- a/src/routes/getVideoLabel.ts +++ b/src/routes/getVideoLabel.ts @@ -1,8 +1,8 @@ import { Request, Response } from "express"; import { db } from "../databases/databases"; -import { videoLabelsHashKey, videoLabelsKey } from "../utils/redisKeys"; +import { videoLabelsHashKey, videoLabelsKey, videoLabelsLargerHashKey } from "../utils/redisKeys"; import { SBRecord } from "../types/lib.model"; -import { ActionType, Category, DBSegment, Segment, Service, VideoData, VideoID, VideoIDHash } from "../types/segments.model"; +import { ActionType, Category, DBSegment, Service, VideoID, VideoIDHash } from "../types/segments.model"; import { Logger } from "../utils/logger"; import { QueryCacher } from "../utils/queryCacher"; import { getService } from "../utils/getService"; @@ -81,8 +81,10 @@ async function getSegmentsFromDBByHash(hashedVideoIDPrefix: VideoIDHash, service [`${hashedVideoIDPrefix}%`, service] ) as Promise; - if (hashedVideoIDPrefix.length === 3 || hashedVideoIDPrefix.length === 4) { + if (hashedVideoIDPrefix.length === 3) { return await QueryCacher.get(fetchFromDB, videoLabelsHashKey(hashedVideoIDPrefix, service)); + } else if (hashedVideoIDPrefix.length === 4) { + return await QueryCacher.get(fetchFromDB, videoLabelsLargerHashKey(hashedVideoIDPrefix, service)); } return await fetchFromDB(); diff --git a/src/utils/queryCacher.ts b/src/utils/queryCacher.ts index e8ccaa2..cd34310 100644 --- a/src/utils/queryCacher.ts +++ b/src/utils/queryCacher.ts @@ -1,6 +1,6 @@ import redis, { TooManyActiveConnectionsError } from "../utils/redis"; import { Logger } from "../utils/logger"; -import { skipSegmentsHashKey, skipSegmentsKey, reputationKey, ratingHashKey, skipSegmentGroupsKey, userFeatureKey, videoLabelsKey, videoLabelsHashKey, brandingHashKey, brandingKey } from "./redisKeys"; +import { skipSegmentsHashKey, skipSegmentsKey, reputationKey, ratingHashKey, skipSegmentGroupsKey, userFeatureKey, videoLabelsKey, videoLabelsHashKey, brandingHashKey, brandingKey, videoLabelsLargerHashKey } from "./redisKeys"; import { Service, VideoID, VideoIDHash } from "../types/segments.model"; import { Feature, HashedUserID, UserID } from "../types/user.model"; import { config } from "../config"; @@ -127,6 +127,7 @@ function clearSegmentCache(videoInfo: { videoID: VideoID; hashedVideoID: VideoID redis.del(skipSegmentsHashKey(videoInfo.hashedVideoID, videoInfo.service)).catch((err) => Logger.error(err)); redis.del(videoLabelsKey(videoInfo.hashedVideoID, videoInfo.service)).catch((err) => Logger.error(err)); redis.del(videoLabelsHashKey(videoInfo.hashedVideoID, videoInfo.service)).catch((err) => Logger.error(err)); + redis.del(videoLabelsLargerHashKey(videoInfo.hashedVideoID, videoInfo.service)).catch((err) => Logger.error(err)); if (videoInfo.userID) redis.del(reputationKey(videoInfo.userID)).catch((err) => Logger.error(err)); clearBrandingCache(videoInfo); diff --git a/src/utils/redisKeys.ts b/src/utils/redisKeys.ts index b6742df..9ed7616 100644 --- a/src/utils/redisKeys.ts +++ b/src/utils/redisKeys.ts @@ -58,9 +58,17 @@ export const videoLabelsKey = (videoID: VideoID, service: Service): string => `labels.v2.${service}.videoID.${videoID}`; export function videoLabelsHashKey(hashedVideoIDPrefix: VideoIDHash, service: Service): string { - const length = hashedVideoIDPrefix.length; + hashedVideoIDPrefix = hashedVideoIDPrefix.substring(0, 3) as VideoIDHash; + if (hashedVideoIDPrefix.length !== 3) Logger.warn(`Redis video labels hash-prefix key is not length 3! ${hashedVideoIDPrefix}`); - return `labels.v1.${length}.${service}.${hashedVideoIDPrefix}`; + return `labels.v2.3.${service}.${hashedVideoIDPrefix}`; +} + +export function videoLabelsLargerHashKey(hashedVideoIDPrefix: VideoIDHash, service: Service): string { + hashedVideoIDPrefix = hashedVideoIDPrefix.substring(0, 4) as VideoIDHash; + if (hashedVideoIDPrefix.length !== 4) Logger.warn(`Redis video labels hash-prefix key is not length 4! ${hashedVideoIDPrefix}`); + + return `labels.v2.4.${service}.${hashedVideoIDPrefix}`; } export function userFeatureKey (userID: HashedUserID, feature: Feature): string {