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; + }; });