Reusable functions and utilities for opening data and user analytics.
Fetches a specific opening with its related data including transitions and variations.
id{
opening: OpeningWithRelations | null,
variations: Opening[]
}const { opening, variations } = await findOpening('opening-123');
if (opening) {
console.log(`Found: ${opening.name} with ${variations.length} variations`);
}toOpening relationsComprehensive data fetcher for user dashboard with multiple statistical aggregations.
userIdPromise<DashboardData> {
user: UserProfile,
stats: {
totalFavorites: number,
totalVisits: number,
totalPracticeSessions: number
},
mostVisitedOpenings: Array<Opening & { visitCount: number }>,
favoriteOpenings: Opening[],
recentPracticeSessions: PracticeSession[],
mostPracticedOpenings: Array<Opening & { practiceCount: number }>
}Basic user information and preferences
Counts of favorites, visits, and sessions
5 most recent favorite openings
5 most visited openings
Promise.all() for parallel database queriesFormats date strings into a human-readable format.
formatDate('2024-01-15T10:30:00.000Z')
// Returns "Jan 15, 2024"