Bladeren bron

feat(server): Add price and slug to SearchResult type

Michael Bromley 7 jaren geleden
bovenliggende
commit
58f57725f8

File diff suppressed because it is too large
+ 0 - 0
schema.json


+ 1 - 1
server/src/api/resolvers/product-option.resolver.ts

@@ -44,7 +44,7 @@ export class ProductOptionResolver {
     }
 
     @ResolveProperty()
-    @Allow(Permission.ReadCatalog)
+    @Allow(Permission.ReadCatalog, Permission.Public)
     async options(optionGroup: Translated<ProductOptionGroup>): Promise<Array<Translated<ProductOption>>> {
         if (optionGroup.options) {
             return Promise.resolve(optionGroup.options);

+ 3 - 0
server/src/api/types/search.api.graphql

@@ -26,12 +26,15 @@ type SearchResponse {
 
 type SearchResult {
     sku: String!
+    slug: String!
     productId: ID!
     productName: String!
     productPreview: String!
     productVariantId: ID!
     productVariantName: String!
     productVariantPreview: String!
+    price: Int!
+    currencyCode: CurrencyCode!
     description: String!
     facetIds: [String!]!
     facetValueIds: [String!]!

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

@@ -19,7 +19,7 @@ import { FacetValueService } from '../../service/services/facet-value.service';
 import { DefaultSearceReindexResonse } from './default-search-plugin';
 import { SearchIndexItem } from './search-index-item.entity';
 import { MysqlSearchStrategy } from './search-strategy/mysql-search-strategy';
-import { PostgesSearchStrategy } from './search-strategy/postges-search-strategy';
+import { PostgresSearchStrategy } from './search-strategy/postgres-search-strategy';
 import { SearchStrategy } from './search-strategy/search-strategy';
 import { SqliteSearchStrategy } from './search-strategy/sqlite-search-strategy';
 
@@ -61,7 +61,7 @@ export class FulltextSearchService {
                 this.searchStrategy = new SqliteSearchStrategy(connection);
                 break;
             case 'postgres':
-                this.searchStrategy = new PostgesSearchStrategy(connection);
+                this.searchStrategy = new PostgresSearchStrategy(connection);
                 break;
             default:
                 throw new InternalServerError(`error.database-not-supported-by-default-search-plugin`);
@@ -169,6 +169,8 @@ export class FulltextSearchService {
                 v =>
                     new SearchIndexItem({
                         sku: v.sku,
+                        slug: v.product.slug,
+                        price: v.price,
                         languageCode,
                         productVariantId: v.id,
                         productId: v.product.id,

+ 9 - 1
server/src/plugin/default-search-plugin/search-index-item.entity.ts

@@ -1,6 +1,6 @@
 import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
 
-import { LanguageCode } from '../../../../shared/generated-types';
+import { CurrencyCode, LanguageCode } from '../../../../shared/generated-types';
 import { ID } from '../../../../shared/shared-types';
 import { idType } from '../../config/config-helpers';
 
@@ -35,9 +35,17 @@ export class SearchIndexItem {
     @Column('text')
     description: string;
 
+    @Column()
+    slug: string;
+
     @Column()
     sku: string;
 
+    @Column()
+    price: number;
+
+    currencyCode: CurrencyCode;
+
     @Column('simple-array')
     facetIds: string[];
 

+ 23 - 0
server/src/plugin/default-search-plugin/search-strategy/map-to-search-result.ts

@@ -0,0 +1,23 @@
+import { CurrencyCode, SearchResult } from '../../../../../shared/generated-types';
+
+/**
+ * Maps a raw database result to a SearchResult.
+ */
+export function mapToSearchResult(raw: any, currencyCode: CurrencyCode): SearchResult {
+    return {
+        sku: raw.si_sku,
+        slug: raw.si_slug,
+        price: raw.si_price,
+        currencyCode,
+        productVariantId: raw.si_productVariantId,
+        productId: raw.si_productId,
+        productName: raw.si_productName,
+        productVariantName: raw.si_productVariantName,
+        description: raw.si_description,
+        facetIds: raw.si_facetIds.split(',').map(x => x.trim()),
+        facetValueIds: raw.si_facetValueIds.split(',').map(x => x.trim()),
+        productPreview: raw.si_productPreview,
+        productVariantPreview: raw.si_productVariantPreview,
+        score: raw.score || 0,
+    };
+}

+ 2 - 18
server/src/plugin/default-search-plugin/search-strategy/mysql-search-strategy.ts

@@ -6,6 +6,7 @@ import { unique } from '../../../../../shared/unique';
 import { RequestContext } from '../../../api/common/request-context';
 import { SearchIndexItem } from '../search-index-item.entity';
 
+import { mapToSearchResult } from './map-to-search-result';
 import { SearchStrategy } from './search-strategy';
 
 /**
@@ -40,24 +41,7 @@ export class MysqlSearchStrategy implements SearchStrategy {
             .take(take)
             .skip(skip)
             .getRawMany()
-            .then(res =>
-                res.map(r => {
-                    return {
-                        sku: r.si_sku,
-                        productVariantId: r.si_productVariantId,
-                        languageCode: r.si_languageCode,
-                        productId: r.si_productId,
-                        productName: r.si_productName,
-                        productVariantName: r.si_productVariantName,
-                        description: r.si_description,
-                        facetIds: r.si_facetIds.split(',').map(x => x.trim()),
-                        facetValueIds: r.si_facetValueIds.split(',').map(x => x.trim()),
-                        productPreview: r.si_productPreview,
-                        productVariantPreview: r.si_productVariantPreview,
-                        score: r.score || 0,
-                    };
-                }),
-            );
+            .then(res => res.map(r => mapToSearchResult(r, ctx.channel.currencyCode)));
     }
 
     async getTotalCount(ctx: RequestContext, input: SearchInput): Promise<number> {

+ 6 - 20
server/src/plugin/default-search-plugin/search-strategy/postges-search-strategy.ts → server/src/plugin/default-search-plugin/search-strategy/postgres-search-strategy.ts

@@ -6,12 +6,13 @@ import { unique } from '../../../../../shared/unique';
 import { RequestContext } from '../../../api/common/request-context';
 import { SearchIndexItem } from '../search-index-item.entity';
 
+import { mapToSearchResult } from './map-to-search-result';
 import { SearchStrategy } from './search-strategy';
 
 /**
  * A weighted fulltext search for PostgeSQL.
  */
-export class PostgesSearchStrategy implements SearchStrategy {
+export class PostgresSearchStrategy implements SearchStrategy {
     private readonly minTermLength = 2;
 
     constructor(private connection: Connection) {}
@@ -20,7 +21,7 @@ export class PostgesSearchStrategy implements SearchStrategy {
         const facetValuesQb = this.connection
             .getRepository(SearchIndexItem)
             .createQueryBuilder('si')
-            .select("string_agg(si.facetValueIds,',')", 'allFacetValues');
+            .select(`string_agg(si.facetValueIds,',')`, 'allFacetValues');
 
         const facetValuesResult = await this.applyTermAndFilters(facetValuesQb, input, true).getRawOne();
         const allFacetValues = facetValuesResult ? facetValuesResult.allFacetValues || '' : '';
@@ -43,24 +44,7 @@ export class PostgesSearchStrategy implements SearchStrategy {
             .take(take)
             .skip(skip)
             .getRawMany()
-            .then(res =>
-                res.map(r => {
-                    return {
-                        sku: r.si_sku,
-                        productVariantId: r.si_productVariantId,
-                        languageCode: r.si_languageCode,
-                        productId: r.si_productId,
-                        productName: r.si_productName,
-                        productVariantName: r.si_productVariantName,
-                        description: r.si_description,
-                        facetIds: r.si_facetIds.split(',').map(x => x.trim()),
-                        facetValueIds: r.si_facetValueIds.split(',').map(x => x.trim()),
-                        productPreview: r.si_productPreview,
-                        productVariantPreview: r.si_productVariantPreview,
-                        score: r.score || 0,
-                    };
-                }),
-            );
+            .then(res => res.map(r => mapToSearchResult(r, ctx.channel.currencyCode)));
     }
 
     async getTotalCount(ctx: RequestContext, input: SearchInput): Promise<number> {
@@ -136,6 +120,8 @@ export class PostgesSearchStrategy implements SearchStrategy {
     private createPostgresSelect(groupByProduct: boolean): string {
         return [
             'sku',
+            'slug',
+            'price',
             'productVariantId',
             'languageCode',
             'productId',

+ 2 - 18
server/src/plugin/default-search-plugin/search-strategy/sqlite-search-strategy.ts

@@ -6,6 +6,7 @@ import { unique } from '../../../../../shared/unique';
 import { RequestContext } from '../../../api/common/request-context';
 import { SearchIndexItem } from '../search-index-item.entity';
 
+import { mapToSearchResult } from './map-to-search-result';
 import { SearchStrategy } from './search-strategy';
 
 /**
@@ -41,24 +42,7 @@ export class SqliteSearchStrategy implements SearchStrategy {
             .take(take)
             .skip(skip)
             .getRawMany()
-            .then(res =>
-                res.map(r => {
-                    return {
-                        sku: r.si_sku,
-                        productVariantId: r.si_productVariantId,
-                        languageCode: r.si_languageCode,
-                        productId: r.si_productId,
-                        productName: r.si_productName,
-                        productVariantName: r.si_productVariantName,
-                        description: r.si_description,
-                        facetIds: r.si_facetIds.split(',').map(x => x.trim()),
-                        facetValueIds: r.si_facetValueIds.split(',').map(x => x.trim()),
-                        productPreview: r.si_productPreview,
-                        productVariantPreview: r.si_productVariantPreview,
-                        score: r.score || 0,
-                    };
-                }),
-            );
+            .then(res => res.map(r => mapToSearchResult(r, ctx.channel.currencyCode)));
     }
 
     async getTotalCount(ctx: RequestContext, input: SearchInput): Promise<number> {

+ 7 - 1
shared/generated-types.ts

@@ -1,5 +1,5 @@
 // tslint:disable
-// Generated in 2019-02-01T14:23:55+01:00
+// Generated in 2019-02-14T13:50:27+01:00
 export type Maybe<T> = T | null;
 
 
@@ -5452,6 +5452,8 @@ export interface SearchResult {
   
   sku: string;
   
+  slug: string;
+  
   productId: string;
   
   productName: string;
@@ -5464,6 +5466,10 @@ export interface SearchResult {
   
   productVariantPreview: string;
   
+  price: number;
+  
+  currencyCode: CurrencyCode;
+  
   description: string;
   
   facetIds: string[];

Some files were not shown because too many files changed in this diff