All files / lib project-mutations.ts

100% Statements 3/3
100% Branches 0/0
100% Functions 2/2
100% Lines 3/3

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);
}