All files / services cover-cascade.ts

100% Statements 22/22
100% Branches 14/14
100% Functions 6/6
100% Lines 13/13

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                          76x 34x 76x 76x 23x 34x   23x 11x 15x 15x 13x 13x   8x    
import type { Room, Media } from "../db/schema/projects";
 
/**
 * Resolves project cover image using the cascade:
 * 1. Default room (project.defaultRoomId) → isCover media
 * 2. Default room → first media by sort_order
 * 3. First room by sort_order → isCover media
 * 4. null
 */
export function resolveProjectCover(
	rooms: Array<Room & { media: Media[] }>,
	defaultRoomId?: number | null,
): string | null {
	if (rooms.length === 0) return null;
	const featuredRoom = (defaultRoomId ? rooms.find((r) => r.id === defaultRoomId) : undefined) || rooms[0];
	const coverMedia = featuredRoom.media.find((m) => m.isCover);
	if (coverMedia) return coverMedia.storageKey;
	const firstMedia = featuredRoom.media.sort(
		(a, b) => a.sortOrder - b.sortOrder,
	)[0];
	if (firstMedia) return firstMedia.storageKey;
	for (const room of rooms) {
		const cover = room.media.find((m) => m.isCover);
		if (cover) return cover.storageKey;
		const first = room.media.sort((a, b) => a.sortOrder - b.sortOrder)[0];
		if (first) return first.storageKey;
	}
	return null;
}