add cached menus

This commit is contained in:
Profile Profile
2026-03-15 21:00:35 +03:00
parent 952dfda73c
commit 283ef8ff95
2 changed files with 64 additions and 32 deletions

View File

@@ -1,6 +1,8 @@
// lib/api/menu-api.ts
import { fetchGraphQL } from './graphql-client.js';
import { cache } from '@lib/cache/manager.js';
import { CACHE_TTL } from '@lib/cache/cache-ttl';
export interface MenuItem {
id: string;
@@ -40,26 +42,40 @@ export type MenuIdentifier =
* Получить меню по идентификатору
*/
export async function fetchMenu(identifier: MenuIdentifier): Promise<Menu | null> {
try {
// Определяем тип запроса на основе переданного идентификатора
if ('id' in identifier) {
return await fetchMenuById(identifier.id);
}
if ('location' in identifier) {
return await fetchMenuByLocation(identifier.location);
}
if ('slug' in identifier) {
return await fetchMenuBySlug(identifier.slug);
}
if ('name' in identifier) {
return await fetchMenuByName(identifier.name);
}
// Создаем ключ кеша на основе типа и значения
let cacheKey;
if ('id' in identifier) cacheKey = `menu:id:${identifier.id}`;
else if ('location' in identifier) cacheKey = `menu:location:${identifier.location}`;
else if ('slug' in identifier) cacheKey = `menu:slug:${identifier.slug}`;
else if ('name' in identifier) cacheKey = `menu:name:${identifier.name}`;
else return null;
return null;
} catch (error) {
console.error('Error fetching menu:', error);
return null;
}
return await cache.wrap(
cacheKey,
async () => {
try {
// Определяем тип запроса на основе переданного идентификатора
if ('id' in identifier) {
return await fetchMenuById(identifier.id);
}
if ('location' in identifier) {
return await fetchMenuByLocation(identifier.location);
}
if ('slug' in identifier) {
return await fetchMenuBySlug(identifier.slug);
}
if ('name' in identifier) {
return await fetchMenuByName(identifier.name);
}
return null;
} catch (error) {
console.error('Error fetching menu:', error);
return null;
}
},
{ ttl: CACHE_TTL.MENU } // Используем константу из cache-ttl
);
}
/**
@@ -294,22 +310,38 @@ export function buildMenuHierarchy(menuItems: MenuItem[]): MenuItem[] {
* Получить меню в виде иерархической структуры
*/
export async function getHierarchicalMenu(identifier: MenuIdentifier): Promise<MenuItem[]> {
const menu = await fetchMenu(identifier);
if (!menu || !menu.menuItems?.nodes?.length) {
return [];
}
const cacheKey = `menu:hierarchical:${JSON.stringify(identifier)}`;
return buildMenuHierarchy(menu.menuItems.nodes);
return await cache.wrap(
cacheKey,
async () => {
const menu = await fetchMenu(identifier);
if (!menu || !menu.menuItems?.nodes?.length) {
return [];
}
return buildMenuHierarchy(menu.menuItems.nodes);
},
{ ttl: CACHE_TTL.MENU }
);
}
/**
* Получить меню в виде плоского списка
*/
export async function getFlatMenu(identifier: MenuIdentifier): Promise<MenuItem[]> {
const menu = await fetchMenu(identifier);
if (!menu || !menu.menuItems?.nodes?.length) {
return [];
}
const cacheKey = `menu:flat:${JSON.stringify(identifier)}`;
return menu.menuItems.nodes.sort((a, b) => a.order - b.order);
return await cache.wrap(
cacheKey,
async () => {
const menu = await fetchMenu(identifier);
if (!menu || !menu.menuItems?.nodes?.length) {
return [];
}
return menu.menuItems.nodes.sort((a, b) => a.order - b.order);
},
{ ttl: CACHE_TTL.MENU }
);
}

View File

@@ -38,7 +38,7 @@ export const prerender = false;
pageInfo={pageInfo}
type="latest"
perLoad={11}
showCount={true}
showCount={false}
/>