Przeglądaj źródła

refactor(server): Alter API of ListQueryBuilder.build() method

Michael Bromley 7 lat temu
rodzic
commit
778855dc61

+ 13 - 8
server/src/service/helpers/list-query-builder/list-query-builder.ts

@@ -1,7 +1,7 @@
 import { Injectable } from '@nestjs/common';
 import { InjectConnection } from '@nestjs/typeorm';
 import { ID, Type } from 'shared/shared-types';
-import { Connection, FindConditions, FindManyOptions, SelectQueryBuilder } from 'typeorm';
+import { Connection, FindConditions, FindManyOptions, FindOneOptions, SelectQueryBuilder } from 'typeorm';
 import { FindOptionsUtils } from 'typeorm/find-options/FindOptionsUtils';
 
 import { ListQueryOptions } from '../../../common/types/common-types';
@@ -11,6 +11,13 @@ import { parseChannelParam } from './parse-channel-param';
 import { parseFilterParams } from './parse-filter-params';
 import { parseSortParams } from './parse-sort-params';
 
+export type ExtendedListQueryOptions<T extends VendureEntity> = {
+    relations?: string[];
+    channelId?: ID;
+    where?: FindConditions<T>;
+    orderBy?: FindOneOptions<T>['order'];
+};
+
 @Injectable()
 export class ListQueryBuilder {
     constructor(@InjectConnection() private connection: Connection) {}
@@ -21,9 +28,7 @@ export class ListQueryBuilder {
     build<T extends VendureEntity>(
         entity: Type<T>,
         options: ListQueryOptions<T> = {},
-        relations?: string[],
-        channelId?: ID,
-        findConditions?: FindConditions<T>,
+        extendedOptions: ExtendedListQueryOptions<T> = {},
     ): SelectQueryBuilder<T> {
         const skip = options.skip;
         let take = options.take;
@@ -35,10 +40,10 @@ export class ListQueryBuilder {
 
         const qb = this.connection.createQueryBuilder<T>(entity, entity.name.toLowerCase());
         FindOptionsUtils.applyFindManyOptionsOrConditionsToQueryBuilder(qb, {
-            relations,
+            relations: extendedOptions.relations,
             take,
             skip,
-            where: findConditions || {},
+            where: extendedOptions.where || {},
         } as FindManyOptions<T>);
         // tslint:disable-next-line:no-non-null-assertion
         FindOptionsUtils.joinEagerRelations(qb, qb.alias, qb.expressionMap.mainAlias!.metadata);
@@ -51,8 +56,8 @@ export class ListQueryBuilder {
             }
         });
 
-        if (channelId) {
-            const channelFilter = parseChannelParam(this.connection, entity, channelId);
+        if (extendedOptions.channelId) {
+            const channelFilter = parseChannelParam(this.connection, entity, extendedOptions.channelId);
             if (channelFilter) {
                 qb.andWhere(channelFilter.clause, channelFilter.parameters);
             }

+ 1 - 1
server/src/service/services/administrator.service.ts

@@ -32,7 +32,7 @@ export class AdministratorService {
 
     findAll(options?: ListQueryOptions<Administrator>): Promise<PaginatedList<Administrator>> {
         return this.listQueryBuilder
-            .build(Administrator, options, ['user', 'user.roles'])
+            .build(Administrator, options, { relations: ['user', 'user.roles'] })
             .getManyAndCount()
             .then(([items, totalItems]) => ({
                 items,

+ 1 - 1
server/src/service/services/order.service.ts

@@ -43,7 +43,7 @@ export class OrderService {
 
     findAll(ctx: RequestContext, options?: ListQueryOptions<Order>): Promise<PaginatedList<Order>> {
         return this.listQueryBuilder
-            .build(Order, options, ['lines', 'lines.productVariant', 'customer'])
+            .build(Order, options, { relations: ['lines', 'lines.productVariant', 'customer'] })
             .getManyAndCount()
             .then(([items, totalItems]) => {
                 return {

+ 1 - 1
server/src/service/services/product.service.ts

@@ -40,7 +40,7 @@ export class ProductService {
         const relations = ['featuredAsset', 'assets', 'optionGroups', 'channels'];
 
         return this.listQueryBuilder
-            .build(Product, options, relations, ctx.channelId)
+            .build(Product, options, { relations, channelId: ctx.channelId })
             .getManyAndCount()
             .then(async ([products, totalItems]) => {
                 const items = products.map(product =>

+ 1 - 1
server/src/service/services/role.service.ts

@@ -34,7 +34,7 @@ export class RoleService {
 
     findAll(options?: ListQueryOptions<Role>): Promise<PaginatedList<Role>> {
         return this.listQueryBuilder
-            .build(Role, options, ['channels'])
+            .build(Role, options, { relations: ['channels'] })
             .getManyAndCount()
             .then(([items, totalItems]) => ({
                 items,

+ 1 - 1
server/src/service/services/shipping-method.service.ts

@@ -46,7 +46,7 @@ export class ShippingMethodService {
 
     findAll(options?: ListQueryOptions<ShippingMethod>): Promise<PaginatedList<ShippingMethod>> {
         return this.listQueryBuilder
-            .build(ShippingMethod, options, ['channels'])
+            .build(ShippingMethod, options, { relations: ['channels'] })
             .getManyAndCount()
             .then(([items, totalItems]) => ({
                 items,

+ 1 - 1
server/src/service/services/tax-rate.service.ts

@@ -38,7 +38,7 @@ export class TaxRateService {
 
     findAll(options?: ListQueryOptions<TaxRate>): Promise<PaginatedList<TaxRate>> {
         return this.listQueryBuilder
-            .build(TaxRate, options, ['category', 'zone', 'customerGroup'])
+            .build(TaxRate, options, { relations: ['category', 'zone', 'customerGroup'] })
             .getManyAndCount()
             .then(([items, totalItems]) => ({
                 items,