Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 54x 39x 38x | // Shared project cache invalidation utilities
// Consolidates duplicated cache refresh logic from pro route handlers.
import type { Dal } from "../dal";
import type { getDb } from "../db";
import type { Services } from "../services";
import type { DualCache } from "./cache";
import { invalidateEntity } from "./cache-invalidation";
import { precomputeEnrichedProject } from "./project-cache";
import { updateProjectCoverImage } from "./cover-image";
/** Invalidate the pro's project list cache + related marketplace caches.
* Thin wrapper over the centralized contract (invalidateEntity "project"):
* point-deletes proProjects/proFull/room-categories and bumps the pros/
* projects/rooms list generations. The generation bump replaces the old
* `deletePattern(pros-list)` sweep — O(1), and not subject to the 10-iteration
* KV-list cap that could leave filter combos stale (a 24h problem).
* NOTE: Does NOT invalidate homepage — it has its own TTL and only shows
* featured content. Avoid aggressive invalidation. */
export async function invalidateProjectsListCache(
cache: DualCache,
proId: string,
): Promise<void> {
await invalidateEntity(cache, "project", { proId });
}
/**
* Re-compute enriched project cache and cover image after content changes.
* Call via c.executionCtx.waitUntil() after photo/room/media mutations.
*/
export async function recomputeProjectAfterContentChange(
projectId: string,
db: ReturnType<typeof getDb>,
dal: Dal,
services: Services,
): Promise<void> {
// #617: cover must land before enrichment so the cached enriched payload
// reflects the new cover. Running them concurrently risks precompute reading
// the project row before updateProjectCoverImage writes the new coverImage,
// caching a stale `coverImage: null` for up to 5 min.
await updateProjectCoverImage(projectId, dal, services);
await precomputeEnrichedProject(projectId, db, dal, services);
}
|