Explorar o código

feat(core): Allow phoneNumber in registerCustomerAccount mutation

Closes #389
Michael Bromley %!s(int64=5) %!d(string=hai) anos
pai
achega
2c710b9b92

+ 3 - 16
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -513,10 +513,6 @@ export type CreateProductInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type CreateProductOptionCustomFieldsInput = {
-  colorHex?: Maybe<Scalars['String']>;
-};
-
 export type CreateProductOptionGroupCustomFieldsInput = {
   linkUrl?: Maybe<Scalars['String']>;
 };
@@ -532,7 +528,7 @@ export type CreateProductOptionInput = {
   productOptionGroupId: Scalars['ID'];
   code: Scalars['String'];
   translations: Array<ProductOptionGroupTranslationInput>;
-  customFields?: Maybe<CreateProductOptionCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductVariantInput = {
@@ -2695,12 +2691,7 @@ export type ProductOption = Node & {
   name: Scalars['String'];
   groupId: Scalars['ID'];
   translations: Array<ProductOptionTranslation>;
-  customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-   __typename?: 'ProductOptionCustomFields';
-  colorHex?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -3690,10 +3681,6 @@ export type UpdateProductInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type UpdateProductOptionCustomFieldsInput = {
-  colorHex?: Maybe<Scalars['String']>;
-};
-
 export type UpdateProductOptionGroupCustomFieldsInput = {
   linkUrl?: Maybe<Scalars['String']>;
 };
@@ -3709,7 +3696,7 @@ export type UpdateProductOptionInput = {
   id: Scalars['ID'];
   code?: Maybe<Scalars['String']>;
   translations?: Maybe<Array<ProductOptionGroupTranslationInput>>;
-  customFields?: Maybe<UpdateProductOptionCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {

+ 3 - 16
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -512,10 +512,6 @@ export type CreateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type CreateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type CreateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -531,7 +527,7 @@ export type CreateProductOptionInput = {
     productOptionGroupId: Scalars['ID'];
     code: Scalars['String'];
     translations: Array<ProductOptionGroupTranslationInput>;
-    customFields?: Maybe<CreateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductVariantInput = {
@@ -2572,12 +2568,7 @@ export type ProductOption = Node & {
     name: Scalars['String'];
     groupId: Scalars['ID'];
     translations: Array<ProductOptionTranslation>;
-    customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-    __typename?: 'ProductOptionCustomFields';
-    colorHex?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -3522,10 +3513,6 @@ export type UpdateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type UpdateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type UpdateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -3541,7 +3528,7 @@ export type UpdateProductOptionInput = {
     id: Scalars['ID'];
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<ProductOptionGroupTranslationInput>>;
-    customFields?: Maybe<UpdateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {

+ 2 - 6
packages/common/src/generated-shop-types.ts

@@ -1768,12 +1768,7 @@ export type ProductOption = Node & {
     name: Scalars['String'];
     groupId: Scalars['ID'];
     translations: Array<ProductOptionTranslation>;
-    customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-    __typename?: 'ProductOptionCustomFields';
-    colorHex?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -1993,6 +1988,7 @@ export type RegisterCustomerInput = {
     title?: Maybe<Scalars['String']>;
     firstName?: Maybe<Scalars['String']>;
     lastName?: Maybe<Scalars['String']>;
+    phoneNumber?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
 };
 

+ 3 - 16
packages/common/src/generated-types.ts

@@ -512,10 +512,6 @@ export type CreateProductInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type CreateProductOptionCustomFieldsInput = {
-  colorHex?: Maybe<Scalars['String']>;
-};
-
 export type CreateProductOptionGroupCustomFieldsInput = {
   linkUrl?: Maybe<Scalars['String']>;
 };
@@ -531,7 +527,7 @@ export type CreateProductOptionInput = {
   productOptionGroupId: Scalars['ID'];
   code: Scalars['String'];
   translations: Array<ProductOptionGroupTranslationInput>;
-  customFields?: Maybe<CreateProductOptionCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductVariantInput = {
@@ -2655,12 +2651,7 @@ export type ProductOption = Node & {
   name: Scalars['String'];
   groupId: Scalars['ID'];
   translations: Array<ProductOptionTranslation>;
-  customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-   __typename?: 'ProductOptionCustomFields';
-  colorHex?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -3642,10 +3633,6 @@ export type UpdateProductInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type UpdateProductOptionCustomFieldsInput = {
-  colorHex?: Maybe<Scalars['String']>;
-};
-
 export type UpdateProductOptionGroupCustomFieldsInput = {
   linkUrl?: Maybe<Scalars['String']>;
 };
@@ -3661,7 +3648,7 @@ export type UpdateProductOptionInput = {
   id: Scalars['ID'];
   code?: Maybe<Scalars['String']>;
   translations?: Maybe<Array<ProductOptionGroupTranslationInput>>;
-  customFields?: Maybe<UpdateProductOptionCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {

+ 3 - 16
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -512,10 +512,6 @@ export type CreateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type CreateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type CreateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -531,7 +527,7 @@ export type CreateProductOptionInput = {
     productOptionGroupId: Scalars['ID'];
     code: Scalars['String'];
     translations: Array<ProductOptionGroupTranslationInput>;
-    customFields?: Maybe<CreateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductVariantInput = {
@@ -2572,12 +2568,7 @@ export type ProductOption = Node & {
     name: Scalars['String'];
     groupId: Scalars['ID'];
     translations: Array<ProductOptionTranslation>;
-    customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-    __typename?: 'ProductOptionCustomFields';
-    colorHex?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -3522,10 +3513,6 @@ export type UpdateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type UpdateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type UpdateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -3541,7 +3528,7 @@ export type UpdateProductOptionInput = {
     id: Scalars['ID'];
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<ProductOptionGroupTranslationInput>>;
-    customFields?: Maybe<UpdateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {

+ 2 - 6
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -1768,12 +1768,7 @@ export type ProductOption = Node & {
     name: Scalars['String'];
     groupId: Scalars['ID'];
     translations: Array<ProductOptionTranslation>;
-    customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-    __typename?: 'ProductOptionCustomFields';
-    colorHex?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -1993,6 +1988,7 @@ export type RegisterCustomerInput = {
     title?: Maybe<Scalars['String']>;
     firstName?: Maybe<Scalars['String']>;
     lastName?: Maybe<Scalars['String']>;
+    phoneNumber?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
 };
 

+ 1 - 0
packages/core/e2e/graphql/shared-definitions.ts

@@ -124,6 +124,7 @@ export const GET_CUSTOMER_LIST = gql`
                 firstName
                 lastName
                 emailAddress
+                phoneNumber
                 user {
                     id
                     verified

+ 34 - 16
packages/core/e2e/shop-auth.e2e-spec.ts

@@ -18,13 +18,14 @@ import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
+import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
 
 import {
     CreateAdministrator,
     CreateRole,
     GetCustomer,
     GetCustomerHistory,
+    GetCustomerList,
     HistoryEntryType,
     Permission,
 } from './graphql/generated-e2e-admin-types';
@@ -43,6 +44,7 @@ import {
     CREATE_ROLE,
     GET_CUSTOMER,
     GET_CUSTOMER_HISTORY,
+    GET_CUSTOMER_LIST,
 } from './graphql/shared-definitions';
 import {
     GET_ACTIVE_CUSTOMER,
@@ -68,16 +70,16 @@ let sendEmailFn: jest.Mock;
 class TestEmailPlugin implements OnModuleInit {
     constructor(private eventBus: EventBus) {}
     onModuleInit() {
-        this.eventBus.ofType(AccountRegistrationEvent).subscribe(event => {
+        this.eventBus.ofType(AccountRegistrationEvent).subscribe((event) => {
             sendEmailFn(event);
         });
-        this.eventBus.ofType(PasswordResetEvent).subscribe(event => {
+        this.eventBus.ofType(PasswordResetEvent).subscribe((event) => {
             sendEmailFn(event);
         });
-        this.eventBus.ofType(IdentifierChangeRequestEvent).subscribe(event => {
+        this.eventBus.ofType(IdentifierChangeRequestEvent).subscribe((event) => {
             sendEmailFn(event);
         });
-        this.eventBus.ofType(IdentifierChangeEvent).subscribe(event => {
+        this.eventBus.ofType(IdentifierChangeEvent).subscribe((event) => {
             sendEmailFn(event);
         });
     }
@@ -134,6 +136,7 @@ describe('Shop auth & accounts', () => {
             const input: RegisterCustomerInput = {
                 firstName: 'Sean',
                 lastName: 'Tester',
+                phoneNumber: '123456',
                 emailAddress,
             };
             const result = await shopClient.query<Register.Mutation, Register.Variables>(REGISTER_ACCOUNT, {
@@ -145,10 +148,27 @@ describe('Shop auth & accounts', () => {
             expect(result.registerCustomerAccount).toBe(true);
             expect(sendEmailFn).toHaveBeenCalled();
             expect(verificationToken).toBeDefined();
+
+            const { customers } = await adminClient.query<GetCustomerList.Query, GetCustomerList.Variables>(
+                GET_CUSTOMER_LIST,
+                {
+                    options: {
+                        filter: {
+                            emailAddress: {
+                                eq: emailAddress,
+                            },
+                        },
+                    },
+                },
+            );
+
+            expect(
+                pick(customers.items[0], ['firstName', 'lastName', 'emailAddress', 'phoneNumber']),
+            ).toEqual(input);
         });
 
         it('issues a new token if attempting to register a second time', async () => {
-            const sendEmail = new Promise<string>(resolve => {
+            const sendEmail = new Promise<string>((resolve) => {
                 sendEmailFn.mockImplementation((event: AccountRegistrationEvent) => {
                     resolve(event.user.verificationToken!);
                 });
@@ -172,7 +192,7 @@ describe('Shop auth & accounts', () => {
         });
 
         it('refreshCustomerVerification issues a new token', async () => {
-            const sendEmail = new Promise<string>(resolve => {
+            const sendEmail = new Promise<string>((resolve) => {
                 sendEmailFn.mockImplementation((event: AccountRegistrationEvent) => {
                     resolve(event.user.verificationToken!);
                 });
@@ -587,9 +607,7 @@ describe('Shop auth & accounts', () => {
 
         const role = roleResult.createRole;
 
-        const identifier = `${code}@${Math.random()
-            .toString(16)
-            .substr(2, 8)}`;
+        const identifier = `${code}@${Math.random().toString(16).substr(2, 8)}`;
         const password = `test`;
 
         const adminResult = await shopClient.query<
@@ -616,7 +634,7 @@ describe('Shop auth & accounts', () => {
      * A "sleep" function which allows the sendEmailFn time to get called.
      */
     function waitForSendEmailFn() {
-        return new Promise(resolve => setTimeout(resolve, 10));
+        return new Promise((resolve) => setTimeout(resolve, 10));
     }
 });
 
@@ -666,7 +684,7 @@ describe('Expiring tokens', () => {
             expect(sendEmailFn).toHaveBeenCalledTimes(1);
             expect(verificationToken).toBeDefined();
 
-            await new Promise(resolve => setTimeout(resolve, 3));
+            await new Promise((resolve) => setTimeout(resolve, 3));
 
             return shopClient.query(VERIFY_EMAIL, {
                 password: 'test',
@@ -697,7 +715,7 @@ describe('Expiring tokens', () => {
             expect(sendEmailFn).toHaveBeenCalledTimes(1);
             expect(passwordResetToken).toBeDefined();
 
-            await new Promise(resolve => setTimeout(resolve, 3));
+            await new Promise((resolve) => setTimeout(resolve, 3));
 
             return shopClient.query<ResetPassword.Mutation, ResetPassword.Variables>(RESET_PASSWORD, {
                 password: 'test',
@@ -832,7 +850,7 @@ describe('Updating email address without email verification', () => {
 });
 
 function getVerificationTokenPromise(): Promise<string> {
-    return new Promise<any>(resolve => {
+    return new Promise<any>((resolve) => {
         sendEmailFn.mockImplementation((event: AccountRegistrationEvent) => {
             resolve(event.user.verificationToken);
         });
@@ -840,7 +858,7 @@ function getVerificationTokenPromise(): Promise<string> {
 }
 
 function getPasswordResetTokenPromise(): Promise<string> {
-    return new Promise<any>(resolve => {
+    return new Promise<any>((resolve) => {
         sendEmailFn.mockImplementation((event: PasswordResetEvent) => {
             resolve(event.user.passwordResetToken);
         });
@@ -851,7 +869,7 @@ function getEmailUpdateTokenPromise(): Promise<{
     identifierChangeToken: string | null;
     pendingIdentifier: string | null;
 }> {
-    return new Promise(resolve => {
+    return new Promise((resolve) => {
         sendEmailFn.mockImplementation((event: IdentifierChangeRequestEvent) => {
             resolve(pick(event.user, ['identifierChangeToken', 'pendingIdentifier']));
         });

+ 1 - 0
packages/core/src/api/schema/shop-api/shop.api.graphql

@@ -72,6 +72,7 @@ input RegisterCustomerInput {
     title: String
     firstName: String
     lastName: String
+    phoneNumber: String
     password: String
 }
 

+ 1 - 0
packages/core/src/service/services/customer.service.ts

@@ -176,6 +176,7 @@ export class CustomerService {
             title: input.title || '',
             firstName: input.firstName || '',
             lastName: input.lastName || '',
+            phoneNumber: input.phoneNumber || '',
         });
         await this.historyService.createHistoryEntryForCustomer({
             customerId: customer.id,

+ 2 - 2
packages/dev-server/dev-config.ts

@@ -63,7 +63,7 @@ export const devConfig: VendureConfig = {
             },
         ],
         ProductOption: [
-            {
+            /*{
                 name: 'colorHex',
                 description: [
                     {
@@ -84,7 +84,7 @@ export const devConfig: VendureConfig = {
             {
                 name: 'colorName',
                 type: 'localeString',
-            },
+            },*/
         ],
     },
     logger: new DefaultLogger({ level: LogLevel.Info }),

+ 3 - 16
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -512,10 +512,6 @@ export type CreateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type CreateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type CreateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -531,7 +527,7 @@ export type CreateProductOptionInput = {
     productOptionGroupId: Scalars['ID'];
     code: Scalars['String'];
     translations: Array<ProductOptionGroupTranslationInput>;
-    customFields?: Maybe<CreateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductVariantInput = {
@@ -2572,12 +2568,7 @@ export type ProductOption = Node & {
     name: Scalars['String'];
     groupId: Scalars['ID'];
     translations: Array<ProductOptionTranslation>;
-    customFields?: Maybe<ProductOptionCustomFields>;
-};
-
-export type ProductOptionCustomFields = {
-    __typename?: 'ProductOptionCustomFields';
-    colorHex?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ProductOptionGroup = Node & {
@@ -3522,10 +3513,6 @@ export type UpdateProductInput = {
     customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type UpdateProductOptionCustomFieldsInput = {
-    colorHex?: Maybe<Scalars['String']>;
-};
-
 export type UpdateProductOptionGroupCustomFieldsInput = {
     linkUrl?: Maybe<Scalars['String']>;
 };
@@ -3541,7 +3528,7 @@ export type UpdateProductOptionInput = {
     id: Scalars['ID'];
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<ProductOptionGroupTranslationInput>>;
-    customFields?: Maybe<UpdateProductOptionCustomFieldsInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
schema-admin.json


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
schema-shop.json


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio