refactor: resilient integration queries + simplification
- Extract settleIntegrationQueries helper (Promise.allSettled + logging) so one failing integration no longer kills the entire widget - Convert 16 widget routers from Promise.all to settleIntegrationQueries - Add onSettled query invalidation to downloads and media-requests mutations - Inline 4 single-use firewall useUpdating* hooks - Deduplicate firewall router (4 identical procedures → shared factory) - Fix system-resources chart duplicate initial point (ref-based dedup) - Simplify docker table refresh (refetch + isFetching, drop manual state) - Trim invalidateIntegrationCacheAsync to session-store only (dead scan) - Fix Beszel getAlerts: inner Promise.allSettled so systems failure doesn't discard alerts
This commit is contained in:
24 files changed
+242
-408
No files matched your search
@@ -156,34 +156,8 @@ export const removeQueryCacheAsync = async (userId: string, boardId: string) =>
|
||||
await getSetClient.del(queryCacheKey(userId, boardId));
|
||||
};
|
||||
|
||||
/**
|
||||
* Invalidates all cached data for a given integration by deleting every Redis key
|
||||
* that starts with `integration:${integrationId}:` as well as the integration's
|
||||
* session store entry. This ensures that stale data from a misconfigured or
|
||||
* updated integration is never served from cache.
|
||||
*/
|
||||
export const invalidateIntegrationCacheAsync = async (integrationId: string): Promise<void> => {
|
||||
const client = getSetClient as typeof getSetClient | null;
|
||||
if (!client) {
|
||||
return;
|
||||
}
|
||||
|
||||
const patterns = [`integration:${integrationId}:*`, `session-store:${integrationId}`];
|
||||
let deletedCount = 0;
|
||||
for (const pattern of patterns) {
|
||||
let cursor = "0";
|
||||
do {
|
||||
const [nextCursor, keys] = await client.scan(cursor, "MATCH", pattern, "COUNT", 200);
|
||||
cursor = nextCursor;
|
||||
if (keys.length > 0) {
|
||||
await client.del(...keys);
|
||||
deletedCount += keys.length;
|
||||
}
|
||||
} while (cursor !== "0");
|
||||
}
|
||||
if (deletedCount > 0) {
|
||||
logger.info("Invalidated integration cache", { integrationId, deletedKeys: deletedCount });
|
||||
}
|
||||
await getSetClient.del(`session-store:${integrationId}`);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user