Browse Source

feat(server): Expose list of Customer's orders

Relates to #52
Michael Bromley 7 years ago
parent
commit
f833d98f43

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


+ 53 - 13
server/e2e/customer.e2e-spec.ts

@@ -16,8 +16,8 @@ import { TestServer } from './test-server';
 describe('Customer resolver', () => {
     const client = new TestClient();
     const server = new TestServer();
-    let firstCustomerId = '';
-    let secondCustomerId = '';
+    let firstCustomer: GetCustomerList.Items;
+    let secondsCustomer: GetCustomerList.Items;
 
     beforeAll(async () => {
         const token = await server.init({
@@ -38,8 +38,8 @@ describe('Customer resolver', () => {
 
         expect(result.customers.items.length).toBe(5);
         expect(result.customers.totalItems).toBe(5);
-        firstCustomerId = result.customers.items[0].id;
-        secondCustomerId = result.customers.items[1].id;
+        firstCustomer = result.customers.items[0];
+        secondsCustomer = result.customers.items[1];
     });
 
     describe('addresses', () => {
@@ -48,7 +48,7 @@ describe('Customer resolver', () => {
         it('createCustomerAddress throws on invalid countryCode', async () => {
             try {
                 await client.query(CREATE_ADDRESS, {
-                    id: firstCustomerId,
+                    id: firstCustomer.id,
                     input: {
                         streetLine1: 'streetLine1',
                         countryCode: 'INVALID',
@@ -64,7 +64,7 @@ describe('Customer resolver', () => {
 
         it('createCustomerAddress creates a new address', async () => {
             const result = await client.query(CREATE_ADDRESS, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
                 input: {
                     fullName: 'fullName',
                     company: 'company',
@@ -97,7 +97,7 @@ describe('Customer resolver', () => {
 
         it('customer query returns addresses', async () => {
             const result = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
             });
 
             expect(result.customer!.addresses!.length).toBe(2);
@@ -118,7 +118,7 @@ describe('Customer resolver', () => {
 
             // assert the first customer's first address is not default
             const result2 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
             });
             expect(result2.customer!.addresses![0].defaultShippingAddress).toBe(false);
             expect(result2.customer!.addresses![0].defaultBillingAddress).toBe(false);
@@ -136,14 +136,14 @@ describe('Customer resolver', () => {
 
             // assert the first customer's second address is not default
             const result4 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
             });
             expect(result4.customer!.addresses![1].defaultShippingAddress).toBe(false);
             expect(result4.customer!.addresses![1].defaultBillingAddress).toBe(false);
 
             // get the second customer's address id
             const result5 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: secondCustomerId,
+                id: secondsCustomer.id,
             });
             const secondCustomerAddressId = result5.customer!.addresses![0].id;
 
@@ -160,7 +160,7 @@ describe('Customer resolver', () => {
 
             // assets the first customer's address defaults are unchanged
             const result7 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
             });
             expect(result7.customer!.addresses![0].defaultShippingAddress).toBe(true);
             expect(result7.customer!.addresses![0].defaultBillingAddress).toBe(true);
@@ -170,7 +170,7 @@ describe('Customer resolver', () => {
 
         it('createCustomerAddress with true defaults unsets existing defaults', async () => {
             const result1 = await client.query(CREATE_ADDRESS, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
                 input: {
                     streetLine1: 'new default streetline',
                     countryCode: 'GB',
@@ -194,7 +194,7 @@ describe('Customer resolver', () => {
             });
 
             const result2 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
-                id: firstCustomerId,
+                id: firstCustomer.id,
             });
             expect(result2.customer!.addresses![0].defaultShippingAddress).toBe(false);
             expect(result2.customer!.addresses![0].defaultBillingAddress).toBe(false);
@@ -204,6 +204,25 @@ describe('Customer resolver', () => {
             expect(result2.customer!.addresses![2].defaultBillingAddress).toBe(true);
         });
     });
+
+    describe('orders', () => {
+        it("lists that user's orders", async () => {
+            // log in as first customer
+            await client.asUserWithCredentials(firstCustomer.emailAddress, 'test');
+            // add an item to the order to create an order
+            const result1 = await client.query(ADD_ITEM_TO_ORDER, {
+                productVariantId: 'T_1',
+                quantity: 1,
+            });
+
+            await client.asSuperAdmin();
+
+            const result2 = await client.query(GET_CUSTOMER_ORDERS, { id: firstCustomer.id });
+
+            expect(result2.customer.orders.totalItems).toBe(1);
+            expect(result2.customer.orders.items[0].id).toBe(result1.addItemToOrder.id);
+        });
+    });
 });
 
 const CREATE_ADDRESS = gql`
@@ -235,3 +254,24 @@ const UPDATE_ADDRESS = gql`
         }
     }
 `;
+
+const ADD_ITEM_TO_ORDER = gql`
+    mutation AddItemToOrder($productVariantId: ID!, $quantity: Int!) {
+        addItemToOrder(productVariantId: $productVariantId, quantity: $quantity) {
+            id
+        }
+    }
+`;
+
+const GET_CUSTOMER_ORDERS = gql`
+    query GetCustomerOrders($id: ID!) {
+        customer(id: $id) {
+            orders {
+                items {
+                    id
+                }
+                totalItems
+            }
+        }
+    }
+`;

+ 35 - 10
server/src/api/resolvers/customer.resolver.ts

@@ -5,15 +5,19 @@ import {
     CreateCustomerMutationArgs,
     CustomerQueryArgs,
     CustomersQueryArgs,
+    OrdersCustomerArgs,
     Permission,
     UpdateCustomerAddressMutationArgs,
     UpdateCustomerMutationArgs,
 } from '../../../../shared/generated-types';
 import { PaginatedList } from '../../../../shared/shared-types';
+import { UnauthorizedError } from '../../common/error/errors';
 import { idsAreEqual } from '../../common/utils';
 import { Address } from '../../entity/address/address.entity';
 import { Customer } from '../../entity/customer/customer.entity';
+import { Order } from '../../entity/order/order.entity';
 import { CustomerService } from '../../service/services/customer.service';
+import { OrderService } from '../../service/services/order.service';
 import { IdCodecService } from '../common/id-codec.service';
 import { RequestContext } from '../common/request-context';
 import { Allow } from '../decorators/allow.decorator';
@@ -22,7 +26,11 @@ import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Customer')
 export class CustomerResolver {
-    constructor(private customerService: CustomerService, private idCodecService: IdCodecService) {}
+    constructor(
+        private customerService: CustomerService,
+        private orderService: OrderService,
+        private idCodecService: IdCodecService,
+    ) {}
 
     @Query()
     @Allow(Permission.ReadCustomer)
@@ -47,18 +55,22 @@ export class CustomerResolver {
 
     @ResolveProperty()
     @Allow(Permission.ReadCustomer, Permission.Owner)
-    async addresses(
+    async addresses(@Ctx() ctx: RequestContext, @Parent() customer: Customer): Promise<Address[]> {
+        this.checkOwnerPermissions(ctx, customer);
+        const customerId = this.idCodecService.decode(customer.id);
+        return this.customerService.findAddressesByCustomerId(customerId);
+    }
+
+    @ResolveProperty()
+    @Allow(Permission.ReadOrder, Permission.Owner)
+    async orders(
         @Ctx() ctx: RequestContext,
         @Parent() customer: Customer,
-    ): Promise<Address[] | undefined> {
-        if (ctx.authorizedAsOwnerOnly) {
-            const userId = customer.user && this.idCodecService.decode(customer.user.id);
-            if (userId && !idsAreEqual(userId, ctx.activeUserId)) {
-                return;
-            }
-        }
+        @Args() args: OrdersCustomerArgs,
+    ): Promise<PaginatedList<Order>> {
+        this.checkOwnerPermissions(ctx, customer);
         const customerId = this.idCodecService.decode(customer.id);
-        return this.customerService.findAddressesByCustomerId(customerId);
+        return this.orderService.findByCustomerId(customerId, args.options || undefined);
     }
 
     @Mutation()
@@ -92,4 +104,17 @@ export class CustomerResolver {
         const { input } = args;
         return this.customerService.updateAddress(input);
     }
+
+    /**
+     * If the current request is authorized as the Owner, ensure that the userId matches that
+     * of the Customer data being requested.
+     */
+    private checkOwnerPermissions(ctx: RequestContext, customer: Customer) {
+        if (ctx.authorizedAsOwnerOnly) {
+            const userId = customer.user && this.idCodecService.decode(customer.user.id);
+            if (userId && !idsAreEqual(userId, ctx.activeUserId)) {
+                throw new UnauthorizedError();
+            }
+        }
+    }
 }

+ 1 - 0
server/src/entity/customer/customer.graphql

@@ -8,6 +8,7 @@ type Customer implements Node {
     phoneNumber: String
     emailAddress: String!
     addresses: [Address!]
+    orders(options: OrderListOptions): OrderList!
     user: User
 }
 

+ 13 - 0
server/src/service/services/order.service.ts

@@ -88,6 +88,19 @@ export class OrderService {
         return order;
     }
 
+    async findByCustomerId(customerId: ID, options?: ListQueryOptions<Order>): Promise<PaginatedList<Order>> {
+        return this.listQueryBuilder
+            .build(Order, options, { relations: ['lines', 'lines.productVariant', 'customer'] })
+            .andWhere('order.customer.id = :customerId', { customerId })
+            .getManyAndCount()
+            .then(([items, totalItems]) => {
+                return {
+                    items,
+                    totalItems,
+                };
+            });
+    }
+
     getOrderPayments(orderId: ID): Promise<Payment[]> {
         return this.connection.getRepository(Payment).find({
             where: {

+ 260 - 245
shared/generated-types.ts

@@ -222,6 +222,7 @@ export interface Customer extends Node {
     phoneNumber?: string | null;
     emailAddress: string;
     addresses?: Address[] | null;
+    orders: OrderList;
     user?: User | null;
     customFields?: Json | null;
 }
@@ -245,68 +246,11 @@ export interface Address extends Node {
     customFields?: Json | null;
 }
 
-export interface FacetList extends PaginatedList {
-    items: Facet[];
+export interface OrderList extends PaginatedList {
+    items: Order[];
     totalItems: number;
 }
 
-export interface Facet extends Node {
-    id: string;
-    createdAt: DateTime;
-    updatedAt: DateTime;
-    languageCode: LanguageCode;
-    name: string;
-    code: string;
-    values: FacetValue[];
-    translations: FacetTranslation[];
-    customFields?: Json | null;
-}
-
-export interface FacetValue extends Node {
-    id: string;
-    createdAt: DateTime;
-    updatedAt: DateTime;
-    languageCode: LanguageCode;
-    facet: Facet;
-    name: string;
-    code: string;
-    translations: FacetValueTranslation[];
-    customFields?: Json | null;
-}
-
-export interface FacetValueTranslation {
-    id: string;
-    createdAt: DateTime;
-    updatedAt: DateTime;
-    languageCode: LanguageCode;
-    name: string;
-}
-
-export interface FacetTranslation {
-    id: string;
-    createdAt: DateTime;
-    updatedAt: DateTime;
-    languageCode: LanguageCode;
-    name: string;
-}
-
-export interface GlobalSettings {
-    id: string;
-    createdAt: DateTime;
-    updatedAt: DateTime;
-    availableLanguages: LanguageCode[];
-    serverConfig: ServerConfig;
-    customFields?: GlobalSettingsCustomFields | null;
-}
-
-export interface ServerConfig {
-    customFields?: Json | null;
-}
-
-export interface GlobalSettingsCustomFields {
-    royalMailId?: string | null;
-}
-
 export interface Order extends Node {
     id: string;
     createdAt: DateTime;
@@ -429,6 +373,46 @@ export interface ProductOptionTranslation {
     name: string;
 }
 
+export interface FacetValue extends Node {
+    id: string;
+    createdAt: DateTime;
+    updatedAt: DateTime;
+    languageCode: LanguageCode;
+    facet: Facet;
+    name: string;
+    code: string;
+    translations: FacetValueTranslation[];
+    customFields?: Json | null;
+}
+
+export interface Facet extends Node {
+    id: string;
+    createdAt: DateTime;
+    updatedAt: DateTime;
+    languageCode: LanguageCode;
+    name: string;
+    code: string;
+    values: FacetValue[];
+    translations: FacetTranslation[];
+    customFields?: Json | null;
+}
+
+export interface FacetTranslation {
+    id: string;
+    createdAt: DateTime;
+    updatedAt: DateTime;
+    languageCode: LanguageCode;
+    name: string;
+}
+
+export interface FacetValueTranslation {
+    id: string;
+    createdAt: DateTime;
+    updatedAt: DateTime;
+    languageCode: LanguageCode;
+    name: string;
+}
+
 export interface ProductVariantTranslation {
     id: string;
     createdAt: DateTime;
@@ -488,11 +472,28 @@ export interface ConfigArg {
     value?: string | null;
 }
 
-export interface OrderList extends PaginatedList {
-    items: Order[];
+export interface FacetList extends PaginatedList {
+    items: Facet[];
     totalItems: number;
 }
 
+export interface GlobalSettings {
+    id: string;
+    createdAt: DateTime;
+    updatedAt: DateTime;
+    availableLanguages: LanguageCode[];
+    serverConfig: ServerConfig;
+    customFields?: GlobalSettingsCustomFields | null;
+}
+
+export interface ServerConfig {
+    customFields?: Json | null;
+}
+
+export interface GlobalSettingsCustomFields {
+    royalMailId?: string | null;
+}
+
 export interface ShippingMethodQuote {
     id: string;
     price: number;
@@ -864,43 +865,43 @@ export interface CustomerFilterParameter {
     updatedAt?: DateOperators | null;
 }
 
-export interface FacetListOptions {
+export interface OrderListOptions {
     take?: number | null;
     skip?: number | null;
-    sort?: FacetSortParameter | null;
-    filter?: FacetFilterParameter | null;
+    sort?: OrderSortParameter | null;
+    filter?: OrderFilterParameter | null;
 }
 
-export interface FacetSortParameter {
+export interface OrderSortParameter {
     id?: SortOrder | null;
     createdAt?: SortOrder | null;
     updatedAt?: SortOrder | null;
-    name?: SortOrder | null;
     code?: SortOrder | null;
 }
 
-export interface FacetFilterParameter {
-    name?: StringOperators | null;
+export interface OrderFilterParameter {
     code?: StringOperators | null;
     createdAt?: DateOperators | null;
     updatedAt?: DateOperators | null;
 }
 
-export interface OrderListOptions {
+export interface FacetListOptions {
     take?: number | null;
     skip?: number | null;
-    sort?: OrderSortParameter | null;
-    filter?: OrderFilterParameter | null;
+    sort?: FacetSortParameter | null;
+    filter?: FacetFilterParameter | null;
 }
 
-export interface OrderSortParameter {
+export interface FacetSortParameter {
     id?: SortOrder | null;
     createdAt?: SortOrder | null;
     updatedAt?: SortOrder | null;
+    name?: SortOrder | null;
     code?: SortOrder | null;
 }
 
-export interface OrderFilterParameter {
+export interface FacetFilterParameter {
+    name?: StringOperators | null;
     code?: StringOperators | null;
     createdAt?: DateOperators | null;
     updatedAt?: DateOperators | null;
@@ -1604,6 +1605,9 @@ export interface TaxRateQueryArgs {
 export interface ZoneQueryArgs {
     id: string;
 }
+export interface OrdersCustomerArgs {
+    options?: OrderListOptions | null;
+}
 export interface CreateAdministratorMutationArgs {
     input: CreateAdministratorInput;
 }
@@ -2996,6 +3000,7 @@ export namespace CustomerResolvers {
         phoneNumber?: PhoneNumberResolver<string | null, any, Context>;
         emailAddress?: EmailAddressResolver<string, any, Context>;
         addresses?: AddressesResolver<Address[] | null, any, Context>;
+        orders?: OrdersResolver<OrderList, any, Context>;
         user?: UserResolver<User | null, any, Context>;
         customFields?: CustomFieldsResolver<Json | null, any, Context>;
     }
@@ -3017,6 +3022,16 @@ export namespace CustomerResolvers {
         Parent,
         Context
     >;
+    export type OrdersResolver<R = OrderList, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context,
+        OrdersArgs
+    >;
+    export interface OrdersArgs {
+        options?: OrderListOptions | null;
+    }
+
     export type UserResolver<R = User | null, Parent = any, Context = any> = Resolver<R, Parent, Context>;
     export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
         R,
@@ -3099,182 +3114,16 @@ export namespace AddressResolvers {
     >;
 }
 
-export namespace FacetListResolvers {
+export namespace OrderListResolvers {
     export interface Resolvers<Context = any> {
-        items?: ItemsResolver<Facet[], any, Context>;
+        items?: ItemsResolver<Order[], any, Context>;
         totalItems?: TotalItemsResolver<number, any, Context>;
     }
 
-    export type ItemsResolver<R = Facet[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type ItemsResolver<R = Order[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
     export type TotalItemsResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
 }
 
-export namespace FacetResolvers {
-    export interface Resolvers<Context = any> {
-        id?: IdResolver<string, any, Context>;
-        createdAt?: CreatedAtResolver<DateTime, any, Context>;
-        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
-        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
-        name?: NameResolver<string, any, Context>;
-        code?: CodeResolver<string, any, Context>;
-        values?: ValuesResolver<FacetValue[], any, Context>;
-        translations?: TranslationsResolver<FacetTranslation[], any, Context>;
-        customFields?: CustomFieldsResolver<Json | null, any, Context>;
-    }
-
-    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CodeResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type ValuesResolver<R = FacetValue[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type TranslationsResolver<R = FacetTranslation[], Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-}
-
-export namespace FacetValueResolvers {
-    export interface Resolvers<Context = any> {
-        id?: IdResolver<string, any, Context>;
-        createdAt?: CreatedAtResolver<DateTime, any, Context>;
-        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
-        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
-        facet?: FacetResolver<Facet, any, Context>;
-        name?: NameResolver<string, any, Context>;
-        code?: CodeResolver<string, any, Context>;
-        translations?: TranslationsResolver<FacetValueTranslation[], any, Context>;
-        customFields?: CustomFieldsResolver<Json | null, any, Context>;
-    }
-
-    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type FacetResolver<R = Facet, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CodeResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type TranslationsResolver<R = FacetValueTranslation[], Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-}
-
-export namespace FacetValueTranslationResolvers {
-    export interface Resolvers<Context = any> {
-        id?: IdResolver<string, any, Context>;
-        createdAt?: CreatedAtResolver<DateTime, any, Context>;
-        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
-        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
-        name?: NameResolver<string, any, Context>;
-    }
-
-    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-}
-
-export namespace FacetTranslationResolvers {
-    export interface Resolvers<Context = any> {
-        id?: IdResolver<string, any, Context>;
-        createdAt?: CreatedAtResolver<DateTime, any, Context>;
-        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
-        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
-        name?: NameResolver<string, any, Context>;
-    }
-
-    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-}
-
-export namespace GlobalSettingsResolvers {
-    export interface Resolvers<Context = any> {
-        id?: IdResolver<string, any, Context>;
-        createdAt?: CreatedAtResolver<DateTime, any, Context>;
-        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
-        availableLanguages?: AvailableLanguagesResolver<LanguageCode[], any, Context>;
-        serverConfig?: ServerConfigResolver<ServerConfig, any, Context>;
-        customFields?: CustomFieldsResolver<GlobalSettingsCustomFields | null, any, Context>;
-    }
-
-    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type AvailableLanguagesResolver<R = LanguageCode[], Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type ServerConfigResolver<R = ServerConfig, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-    export type CustomFieldsResolver<
-        R = GlobalSettingsCustomFields | null,
-        Parent = any,
-        Context = any
-    > = Resolver<R, Parent, Context>;
-}
-
-export namespace ServerConfigResolvers {
-    export interface Resolvers<Context = any> {
-        customFields?: CustomFieldsResolver<Json | null, any, Context>;
-    }
-
-    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-}
-
-export namespace GlobalSettingsCustomFieldsResolvers {
-    export interface Resolvers<Context = any> {
-        royalMailId?: RoyalMailIdResolver<string | null, any, Context>;
-    }
-
-    export type RoyalMailIdResolver<R = string | null, Parent = any, Context = any> = Resolver<
-        R,
-        Parent,
-        Context
-    >;
-}
-
 export namespace OrderResolvers {
     export interface Resolvers<Context = any> {
         id?: IdResolver<string, any, Context>;
@@ -3703,6 +3552,118 @@ export namespace ProductOptionTranslationResolvers {
     export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
 }
 
+export namespace FacetValueResolvers {
+    export interface Resolvers<Context = any> {
+        id?: IdResolver<string, any, Context>;
+        createdAt?: CreatedAtResolver<DateTime, any, Context>;
+        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
+        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
+        facet?: FacetResolver<Facet, any, Context>;
+        name?: NameResolver<string, any, Context>;
+        code?: CodeResolver<string, any, Context>;
+        translations?: TranslationsResolver<FacetValueTranslation[], any, Context>;
+        customFields?: CustomFieldsResolver<Json | null, any, Context>;
+    }
+
+    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type FacetResolver<R = Facet, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CodeResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type TranslationsResolver<R = FacetValueTranslation[], Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+}
+
+export namespace FacetResolvers {
+    export interface Resolvers<Context = any> {
+        id?: IdResolver<string, any, Context>;
+        createdAt?: CreatedAtResolver<DateTime, any, Context>;
+        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
+        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
+        name?: NameResolver<string, any, Context>;
+        code?: CodeResolver<string, any, Context>;
+        values?: ValuesResolver<FacetValue[], any, Context>;
+        translations?: TranslationsResolver<FacetTranslation[], any, Context>;
+        customFields?: CustomFieldsResolver<Json | null, any, Context>;
+    }
+
+    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CodeResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type ValuesResolver<R = FacetValue[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type TranslationsResolver<R = FacetTranslation[], Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+}
+
+export namespace FacetTranslationResolvers {
+    export interface Resolvers<Context = any> {
+        id?: IdResolver<string, any, Context>;
+        createdAt?: CreatedAtResolver<DateTime, any, Context>;
+        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
+        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
+        name?: NameResolver<string, any, Context>;
+    }
+
+    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+}
+
+export namespace FacetValueTranslationResolvers {
+    export interface Resolvers<Context = any> {
+        id?: IdResolver<string, any, Context>;
+        createdAt?: CreatedAtResolver<DateTime, any, Context>;
+        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
+        languageCode?: LanguageCodeResolver<LanguageCode, any, Context>;
+        name?: NameResolver<string, any, Context>;
+    }
+
+    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type LanguageCodeResolver<R = LanguageCode, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+}
+
 export namespace ProductVariantTranslationResolvers {
     export interface Resolvers<Context = any> {
         id?: IdResolver<string, any, Context>;
@@ -3853,16 +3814,70 @@ export namespace ConfigArgResolvers {
     export type ValueResolver<R = string | null, Parent = any, Context = any> = Resolver<R, Parent, Context>;
 }
 
-export namespace OrderListResolvers {
+export namespace FacetListResolvers {
     export interface Resolvers<Context = any> {
-        items?: ItemsResolver<Order[], any, Context>;
+        items?: ItemsResolver<Facet[], any, Context>;
         totalItems?: TotalItemsResolver<number, any, Context>;
     }
 
-    export type ItemsResolver<R = Order[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type ItemsResolver<R = Facet[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
     export type TotalItemsResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
 }
 
+export namespace GlobalSettingsResolvers {
+    export interface Resolvers<Context = any> {
+        id?: IdResolver<string, any, Context>;
+        createdAt?: CreatedAtResolver<DateTime, any, Context>;
+        updatedAt?: UpdatedAtResolver<DateTime, any, Context>;
+        availableLanguages?: AvailableLanguagesResolver<LanguageCode[], any, Context>;
+        serverConfig?: ServerConfigResolver<ServerConfig, any, Context>;
+        customFields?: CustomFieldsResolver<GlobalSettingsCustomFields | null, any, Context>;
+    }
+
+    export type IdResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CreatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type UpdatedAtResolver<R = DateTime, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type AvailableLanguagesResolver<R = LanguageCode[], Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type ServerConfigResolver<R = ServerConfig, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+    export type CustomFieldsResolver<
+        R = GlobalSettingsCustomFields | null,
+        Parent = any,
+        Context = any
+    > = Resolver<R, Parent, Context>;
+}
+
+export namespace ServerConfigResolvers {
+    export interface Resolvers<Context = any> {
+        customFields?: CustomFieldsResolver<Json | null, any, Context>;
+    }
+
+    export type CustomFieldsResolver<R = Json | null, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+}
+
+export namespace GlobalSettingsCustomFieldsResolvers {
+    export interface Resolvers<Context = any> {
+        royalMailId?: RoyalMailIdResolver<string | null, any, Context>;
+    }
+
+    export type RoyalMailIdResolver<R = string | null, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
+}
+
 export namespace ShippingMethodQuoteResolvers {
     export interface Resolvers<Context = any> {
         id?: IdResolver<string, any, Context>;

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