Browse Source

feat(server): Automatically populate search index if empty

Michael Bromley 7 years ago
parent
commit
4f60cde953

+ 7 - 1
server/src/plugin/default-search-plugin/default-search-plugin.ts

@@ -1,5 +1,6 @@
 import { Type } from '../../../../shared/shared-types';
-import { VendureConfig, VendurePlugin } from '../../config';
+import { DEFAULT_LANGUAGE_CODE } from '../../common/constants';
+import { InjectorFn, VendureConfig, VendurePlugin } from '../../config';
 
 import { FulltextSearchResolver } from './fulltext-search.resolver';
 import { FulltextSearchService } from './fulltext-search.service';
@@ -12,6 +13,11 @@ export class DefaultSearchPlugin implements VendurePlugin {
         return config;
     }
 
+    async onBootstrap(inject: InjectorFn): Promise<void> {
+        const searchService = inject(FulltextSearchService);
+        await searchService.checkIndex(DEFAULT_LANGUAGE_CODE);
+    }
+
     defineEntities(): Array<Type<any>> {
         return [SearchIndexItem];
     }

+ 1 - 1
server/src/plugin/default-search-plugin/fulltext-search.resolver.ts

@@ -37,6 +37,6 @@ export class FulltextSearchResolver extends BaseSearchResolver {
     @Mutation()
     @Allow(Permission.UpdateCatalog)
     async reindex(@Ctx() ctx: RequestContext): Promise<boolean> {
-        return this.fulltextSearchService.reindex(ctx);
+        return this.fulltextSearchService.reindex(ctx.languageCode);
     }
 }

+ 15 - 2
server/src/plugin/default-search-plugin/fulltext-search.service.ts

@@ -112,8 +112,7 @@ export class FulltextSearchService {
     /**
      * Rebuilds the full search index.
      */
-    async reindex(ctx: RequestContext): Promise<boolean> {
-        const { languageCode } = ctx;
+    async reindex(languageCode: LanguageCode): Promise<boolean> {
         const variants = await this.connection.getRepository(ProductVariant).find({
             relations: this.variantRelations,
         });
@@ -144,6 +143,20 @@ export class FulltextSearchService {
         await this.saveSearchIndexItems(ctx.languageCode, variants);
     }
 
+    /**
+     * Checks to see if the index is empty, and if so triggers a re-index operation.
+     */
+    async checkIndex(languageCode: LanguageCode) {
+        const indexSize = await this.connection.getRepository(SearchIndexItem).count({
+            where: {
+                languageCode,
+            },
+        });
+        if (indexSize === 0) {
+            await this.reindex(languageCode);
+        }
+    }
+
     private applyTermAndFilters(
         qb: SelectQueryBuilder<SearchIndexItem>,
         input: SearchInput,