All files / lib project-mutations.ts

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

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                                39x                                 24x          
// 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, CACHE_KEYS, MARKETPLACE } from "./cache";
import { precomputeEnrichedProject } from "./project-cache";
import { updateProjectCoverImage } from "./cover-image";
 
/** Invalidate the pro's project list cache + related marketplace caches.
 *  NOTE: Does NOT invalidate homepage — homepage has its own 5min TTL
 *  and only shows featured content. Avoid aggressive invalidation. */
export async function invalidateProjectsListCache(
	cache: DualCache,
	proId: string,
): Promise<void> {
	await Promise.all([
		cache.delete(MARKETPLACE.proProjects(proId)),
		cache.delete(MARKETPLACE.proFull(proId)),
		cache.delete(CACHE_KEYS.MARKETPLACE_ROOM_CATEGORIES),
	]);
}
 
/**
 * 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> {
	await Promise.all([
		precomputeEnrichedProject(projectId, db, dal, services),
		updateProjectCoverImage(projectId, dal, services),
	]);
}