From 8c63680b8128186e9b8d705c29b811bc346d774e Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Fri, 5 Dec 2025 08:21:13 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dmeilisearch=E5=9C=A8?= =?UTF-8?q?=E5=90=AF=E7=94=A8apiKey=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8Bhoo?= =?UTF-8?q?k=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为client添加apiKey创建 --- src/meilisearch_hook/index.ts | 150 ++++++++++------------------------ 1 file changed, 43 insertions(+), 107 deletions(-) diff --git a/src/meilisearch_hook/index.ts b/src/meilisearch_hook/index.ts index f1c5fd6..5a63691 100644 --- a/src/meilisearch_hook/index.ts +++ b/src/meilisearch_hook/index.ts @@ -8,13 +8,42 @@ import { getNestedProperty } from '../helper/nest'; const logger = createLogger('meilisearch_hook'); export default defineHook(async ({ init, filter, action, schedule }, { services, getSchema }) => { + // 获取 CollectionsService 实例 + const { CollectionsService } = services; + const schema = await getSchema(); + const collectionsSvc = new CollectionsService({ + schema, + }); + + // 获取 ItemsService 实例 + const { ItemsService } = services; + + // 获取可用语言选项 + let availableLanguages: string[] = []; + try { + const langService = new ItemsService('languages', { schema }); + const languages = await langService.readByQuery({ limit: -1 }); + availableLanguages = languages.map(lang => lang.code); + } catch (error) { + logger.error('Error fetching languages:', error); + } + + // 读取 MeiliSearch 全局配置 + const meiliService = new ItemsService('meili_search_config', { schema }); + const meiliConfigs = await meiliService.readByQuery({ limit: 1 }); + if (meiliConfigs.length === 0) { + return; + } + const { host, api_key } = meiliConfigs[0] || { host: '', apiKey: '' }; + + const client = new MeiliSearch({ + host: host, + apiKey: api_key, + }) + + // 初始化 Hook:检查并创建必要的集合和字段 init('app.after', async () => { logger.info('Directus App Started - MeiliSearch Hook Initialized'); - const { CollectionsService } = services; - const schema = await getSchema(); - const collectionsSvc = new CollectionsService({ - schema, - }); // 检查meili_search_config集合是否存在 const meili_search_config_exists = await collectionsSvc.readOne('meili_search_config').then(() => true).catch(() => false); @@ -85,7 +114,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, return isVisible && isUserDefined && hasSchema && isNotMeiliConfig; }); - const { ItemsService } = services; const meiliIndexConfigsSvc = new ItemsService('meili_index_configs', { schema, }); @@ -112,14 +140,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, logger.info('Creating Item!'); }); - async function getConfig(collection: string) { - const schema = await getSchema(); - const { ItemsService } = services; - const cfgSvc = new ItemsService('meili_index_configs', { schema }); - const configs = await cfgSvc.readByQuery({ filter: { collection_name: { _eq: collection }, enabled: { _eq: true } }, limit: 1 }); - return configs.length ? configs[0] : null; - } - // 监听 items.create 事件以触发 MeiliSearch 索引创建 action('items.create', async ({ meta }) => { const cfg = await getConfig(meta?.collection); @@ -127,30 +147,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, const configId = cfg.id; logger.info('Item created, MeiliSearch indexing enabled for collection:', meta?.collection, 'Config ID:', configId); - const { ItemsService } = services; - const schema = await getSchema(); - - // 获取可用语言选项 - let availableLanguages: string[] = []; - try { - const langService = new ItemsService('languages', { schema }); - const languages = await langService.readByQuery({ limit: -1 }); - availableLanguages = languages.map(lang => lang.code); - } catch (error) { - logger.error('Error fetching languages:', error); - } - - // 读取 MeiliSearch 全局配置 - const meiliService = new ItemsService('meili_search_config', { schema }); - const meiliConfigs = await meiliService.readByQuery({ limit: 1 }); - if (meiliConfigs.length === 0) { - return; - } - const { host } = meiliConfigs[0] || { host: '', apiKey: '' }; - - const client = new MeiliSearch({ - host, - }) const result: any[] = []; const fields = cfg.fields; @@ -208,30 +204,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, const configId = cfg.id; logger.info('Item updated, MeiliSearch indexing enabled for collection:', meta?.collection, 'Config ID:', configId); - const { ItemsService } = services; - const schema = await getSchema(); - - // 获取可用语言选项 - let availableLanguages: string[] = []; - try { - const langService = new ItemsService('languages', { schema }); - const languages = await langService.readByQuery({ limit: -1 }); - availableLanguages = languages.map(lang => lang.code); - } catch (error) { - logger.error('Error fetching languages:', error); - } - - // 读取 MeiliSearch 全局配置 - const meiliService = new ItemsService('meili_search_config', { schema }); - const meiliConfigs = await meiliService.readByQuery({ limit: 1 }); - if (meiliConfigs.length === 0) { - return; - } - const { host } = meiliConfigs[0] || { host: '', apiKey: '' }; - - const client = new MeiliSearch({ - host, - }) const result: any[] = []; const fields = cfg.fields; @@ -289,30 +261,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, const configId = cfg.id; logger.info('Item deleted, MeiliSearch indexing enabled for collection:', meta?.collection, 'Config ID:', configId); - const { ItemsService } = services; - const schema = await getSchema(); - - // 获取可用语言选项 - let availableLanguages: string[] = []; - try { - const langService = new ItemsService('languages', { schema }); - const languages = await langService.readByQuery({ limit: -1 }); - availableLanguages = languages.map(lang => lang.code); - } catch (error) { - logger.error('Error fetching languages:', error); - } - - // 读取 MeiliSearch 全局配置 - const meiliService = new ItemsService('meili_search_config', { schema }); - const meiliConfigs = await meiliService.readByQuery({ limit: 1 }); - if (meiliConfigs.length === 0) { - return; - } - const { host } = meiliConfigs[0] || { host: '', apiKey: '' }; - - const client = new MeiliSearch({ - host, - }) const result: any[] = []; const fields = cfg.fields; @@ -376,27 +324,6 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, const resp = await configService.readByQuery({ filter: { enabled: { _eq: true } }, limit: -1 }); configs = resp; - // 获取可用语言选项 - let availableLanguages: string[] = []; - try { - const langService = new ItemsService('languages', { schema }); - const languages = await langService.readByQuery({ limit: -1 }); - availableLanguages = languages.map(lang => lang.code); - } catch (error) { - logger.error('Error fetching languages:', error); - } - - // 读取 MeiliSearch 全局配置 - const meiliService = new ItemsService('meili_search_config', { schema }); - const meiliConfigs = await meiliService.readByQuery({ limit: 1 }); - if (meiliConfigs.length === 0) { - return; - } - const { host } = meiliConfigs[0] || { host: '', apiKey: '' }; - - const client = new MeiliSearch({ - host, - }) const result: any[] = []; for (const cfg of configs) { @@ -448,4 +375,13 @@ export default defineHook(async ({ init, filter, action, schedule }, { services, } } }); + + // 辅助函数:根据集合名称获取 MeiliIndexConfig + async function getConfig(collection: string) { + const schema = await getSchema(); + const { ItemsService } = services; + const cfgSvc = new ItemsService('meili_index_configs', { schema }); + const configs = await cfgSvc.readByQuery({ filter: { collection_name: { _eq: collection }, enabled: { _eq: true } }, limit: 1 }); + return configs.length ? configs[0] : null; + }; });