Files
outline/server/utils/RedisPrefixHelper.ts
T
Tom Moor 0c0facc2a1 perf: Avoid empty webhook processor work via cached subscription lookup (#12593)
* Avoid empty webhook processor work via cached subscription lookup

WebhookProcessor ran for every event but most teams have no matching
webhook subscription, costing an empty processor job and a database query
per event.

Cache a team's enabled subscriptions ({ id, events }) in Redis, invalidated
by model lifecycle hooks, and add an optional BaseProcessor.shouldQueue hook
consulted by the global event queue so the webhook processor only enqueues a
job when a matching subscription exists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feedback

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 17:53:40 -04:00

73 lines
2.0 KiB
TypeScript

/**
* Helper class for Redis cache key generation.
*/
export class RedisPrefixHelper {
/**
* Gets key against which unfurl response for the given url is stored.
*
* @param teamId The team ID to generate a key for.
* @param url The url to generate a key for.
*/
public static getUnfurlKey(teamId: string, url = "") {
return `unfurl:${teamId}:${url}`;
}
/**
* Gets key for caching collection documents structure.
*
* @param collectionId The collection ID to generate a key for.
* @returns the cache key string.
*/
public static getCollectionDocumentsKey(collectionId: string) {
return `cd:${collectionId}`;
}
/**
* Gets key for caching embed check results. This is a global cache key
* (not team-specific) since embed headers are the same for all users.
*
* @param url The URL to generate a cache key for.
* @returns the cache key string.
*/
public static getEmbedCheckKey(url: string) {
return `embed:${url}`;
}
/**
* Gets key for caching a user's accessible collection IDs.
*
* @param userId The user ID to generate a key for.
* @returns the cache key string.
*/
public static getUserCollectionIdsKey(userId: string) {
return `uc:${userId}`;
}
/**
* Gets key for caching a team's enabled webhook subscriptions.
*
* @param teamId The team ID to generate a key for.
* @returns the cache key string.
*/
public static getWebhookSubscriptionsKey(teamId: string) {
return `whs:${teamId}`;
}
/**
* Gets key for caching the count of a relationship managed by the
* `CounterCache` decorator.
*
* @param modelName The owning model name (e.g. "Group").
* @param relationName The relationship reference name (e.g. "members").
* @param id The owning record id.
* @returns the cache key string.
*/
public static getCounterCacheKey(
modelName: string,
relationName: string,
id: string
) {
return `count:${modelName}:${relationName}:${id}`;
}
}