Browse Source

feat(core): Support custom fields on Administrator entity

Relates to #598
Michael Bromley 5 years ago
parent
commit
260ccfc049

+ 5 - 0
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -871,6 +871,7 @@ export type CreateAdministratorInput = {
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     password: Scalars['String'];
     password: Scalars['String'];
     roleIds: Array<Scalars['ID']>;
     roleIds: Array<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateAdministratorInput = {
 export type UpdateAdministratorInput = {
@@ -880,6 +881,7 @@ export type UpdateAdministratorInput = {
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateActiveAdministratorInput = {
 export type UpdateActiveAdministratorInput = {
@@ -887,6 +889,7 @@ export type UpdateActiveAdministratorInput = {
     lastName?: Maybe<Scalars['String']>;
     lastName?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type Administrator = Node & {
 export type Administrator = Node & {
@@ -897,6 +900,7 @@ export type Administrator = Node & {
     lastName: Scalars['String'];
     lastName: Scalars['String'];
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     user: User;
     user: User;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type AdministratorList = PaginatedList & {
 export type AdministratorList = PaginatedList & {
@@ -4468,6 +4472,7 @@ export type NativeAuthInput = {
 
 
 export type CustomFields = {
 export type CustomFields = {
     Address: Array<CustomFieldConfig>;
     Address: Array<CustomFieldConfig>;
+    Administrator: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;

+ 5 - 0
packages/common/src/generated-types.ts

@@ -1015,6 +1015,7 @@ export type CreateAdministratorInput = {
   emailAddress: Scalars['String'];
   emailAddress: Scalars['String'];
   password: Scalars['String'];
   password: Scalars['String'];
   roleIds: Array<Scalars['ID']>;
   roleIds: Array<Scalars['ID']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateAdministratorInput = {
 export type UpdateAdministratorInput = {
@@ -1024,6 +1025,7 @@ export type UpdateAdministratorInput = {
   emailAddress?: Maybe<Scalars['String']>;
   emailAddress?: Maybe<Scalars['String']>;
   password?: Maybe<Scalars['String']>;
   password?: Maybe<Scalars['String']>;
   roleIds?: Maybe<Array<Scalars['ID']>>;
   roleIds?: Maybe<Array<Scalars['ID']>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateActiveAdministratorInput = {
 export type UpdateActiveAdministratorInput = {
@@ -1031,6 +1033,7 @@ export type UpdateActiveAdministratorInput = {
   lastName?: Maybe<Scalars['String']>;
   lastName?: Maybe<Scalars['String']>;
   emailAddress?: Maybe<Scalars['String']>;
   emailAddress?: Maybe<Scalars['String']>;
   password?: Maybe<Scalars['String']>;
   password?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type Administrator = Node & {
 export type Administrator = Node & {
@@ -1042,6 +1045,7 @@ export type Administrator = Node & {
   lastName: Scalars['String'];
   lastName: Scalars['String'];
   emailAddress: Scalars['String'];
   emailAddress: Scalars['String'];
   user: User;
   user: User;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type AdministratorList = PaginatedList & {
 export type AdministratorList = PaginatedList & {
@@ -4717,6 +4721,7 @@ export type NativeAuthInput = {
 export type CustomFields = {
 export type CustomFields = {
   __typename?: 'CustomFields';
   __typename?: 'CustomFields';
   Address: Array<CustomFieldConfig>;
   Address: Array<CustomFieldConfig>;
+  Administrator: Array<CustomFieldConfig>;
   Channel: Array<CustomFieldConfig>;
   Channel: Array<CustomFieldConfig>;
   Collection: Array<CustomFieldConfig>;
   Collection: Array<CustomFieldConfig>;
   Customer: Array<CustomFieldConfig>;
   Customer: Array<CustomFieldConfig>;

+ 5 - 0
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -871,6 +871,7 @@ export type CreateAdministratorInput = {
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     password: Scalars['String'];
     password: Scalars['String'];
     roleIds: Array<Scalars['ID']>;
     roleIds: Array<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateAdministratorInput = {
 export type UpdateAdministratorInput = {
@@ -880,6 +881,7 @@ export type UpdateAdministratorInput = {
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateActiveAdministratorInput = {
 export type UpdateActiveAdministratorInput = {
@@ -887,6 +889,7 @@ export type UpdateActiveAdministratorInput = {
     lastName?: Maybe<Scalars['String']>;
     lastName?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type Administrator = Node & {
 export type Administrator = Node & {
@@ -897,6 +900,7 @@ export type Administrator = Node & {
     lastName: Scalars['String'];
     lastName: Scalars['String'];
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     user: User;
     user: User;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type AdministratorList = PaginatedList & {
 export type AdministratorList = PaginatedList & {
@@ -4468,6 +4472,7 @@ export type NativeAuthInput = {
 
 
 export type CustomFields = {
 export type CustomFields = {
     Address: Array<CustomFieldConfig>;
     Address: Array<CustomFieldConfig>;
+    Administrator: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;

+ 14 - 5
packages/core/src/api/config/configure-graphql-module.ts

@@ -2,7 +2,7 @@ import { DynamicModule } from '@nestjs/common';
 import { ModuleRef } from '@nestjs/core';
 import { ModuleRef } from '@nestjs/core';
 import { GqlModuleOptions, GraphQLModule, GraphQLTypesLoader } from '@nestjs/graphql';
 import { GqlModuleOptions, GraphQLModule, GraphQLTypesLoader } from '@nestjs/graphql';
 import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
 import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
-import { buildSchema, extendSchema, printSchema } from 'graphql';
+import { buildSchema, extendSchema, GraphQLSchema, printSchema } from 'graphql';
 import path from 'path';
 import path from 'path';
 
 
 import { ConfigModule } from '../../config/config.module';
 import { ConfigModule } from '../../config/config.module';
@@ -28,6 +28,7 @@ import { generateListOptions } from './generate-list-options';
 import { generatePermissionEnum } from './generate-permissions';
 import { generatePermissionEnum } from './generate-permissions';
 import { generateResolvers } from './generate-resolvers';
 import { generateResolvers } from './generate-resolvers';
 import {
 import {
+    addActiveAdministratorCustomFields,
     addGraphQLCustomFields,
     addGraphQLCustomFields,
     addModifyOrderCustomFields,
     addModifyOrderCustomFields,
     addOrderLineCustomFieldsInput,
     addOrderLineCustomFieldsInput,
@@ -87,11 +88,18 @@ async function createGraphQLOptions(
     customFieldRelationResolverService: CustomFieldRelationResolverService,
     customFieldRelationResolverService: CustomFieldRelationResolverService,
     options: GraphQLApiOptions,
     options: GraphQLApiOptions,
 ): Promise<GqlModuleOptions> {
 ): Promise<GqlModuleOptions> {
+    const builtSchema = await buildSchemaForApi(options.apiType);
+    const resolvers = generateResolvers(
+        configService,
+        customFieldRelationResolverService,
+        options.apiType,
+        builtSchema,
+    );
     return {
     return {
         path: '/' + options.apiPath,
         path: '/' + options.apiPath,
-        typeDefs: await createTypeDefs(options.apiType),
+        typeDefs: printSchema(builtSchema),
         include: [options.resolverModule, ...getDynamicGraphQlModulesForPlugins(options.apiType)],
         include: [options.resolverModule, ...getDynamicGraphQlModulesForPlugins(options.apiType)],
-        resolvers: generateResolvers(configService, customFieldRelationResolverService, options.apiType),
+        resolvers,
         uploads: {
         uploads: {
             maxFileSize: configService.assetOptions.uploadMaxFileSize,
             maxFileSize: configService.assetOptions.uploadMaxFileSize,
         },
         },
@@ -114,7 +122,7 @@ async function createGraphQLOptions(
      * 2. any custom fields defined in the config
      * 2. any custom fields defined in the config
      * 3. any schema extensions defined by plugins
      * 3. any schema extensions defined by plugins
      */
      */
-    async function createTypeDefs(apiType: 'shop' | 'admin'): Promise<string> {
+    async function buildSchemaForApi(apiType: 'shop' | 'admin'): Promise<GraphQLSchema> {
         const customFields = configService.customFields;
         const customFields = configService.customFields;
         // Paths must be normalized to use forward-slash separators.
         // Paths must be normalized to use forward-slash separators.
         // See https://github.com/nestjs/graphql/issues/336
         // See https://github.com/nestjs/graphql/issues/336
@@ -139,11 +147,12 @@ async function createGraphQLOptions(
         schema = generateErrorCodeEnum(schema);
         schema = generateErrorCodeEnum(schema);
         if (apiType === 'admin') {
         if (apiType === 'admin') {
             schema = addServerConfigCustomFields(schema, customFields);
             schema = addServerConfigCustomFields(schema, customFields);
+            schema = addActiveAdministratorCustomFields(schema, customFields.Administrator);
         }
         }
         if (apiType === 'shop') {
         if (apiType === 'shop') {
             schema = addRegisterCustomerCustomFieldsInput(schema, customFields.Customer || []);
             schema = addRegisterCustomerCustomFieldsInput(schema, customFields.Customer || []);
         }
         }
 
 
-        return printSchema(schema);
+        return schema;
     }
     }
 }
 }

+ 5 - 1
packages/core/src/api/config/generate-resolvers.ts

@@ -1,6 +1,7 @@
 import { StockMovementType } from '@vendure/common/lib/generated-types';
 import { StockMovementType } from '@vendure/common/lib/generated-types';
 import { GraphQLUpload } from 'apollo-server-core';
 import { GraphQLUpload } from 'apollo-server-core';
 import { IFieldResolver, IResolvers } from 'apollo-server-express';
 import { IFieldResolver, IResolvers } from 'apollo-server-express';
+import { GraphQLSchema } from 'graphql';
 import { GraphQLDateTime } from 'graphql-iso-date';
 import { GraphQLDateTime } from 'graphql-iso-date';
 import GraphQLJSON from 'graphql-type-json';
 import GraphQLJSON from 'graphql-type-json';
 
 
@@ -27,6 +28,7 @@ export function generateResolvers(
     configService: ConfigService,
     configService: ConfigService,
     customFieldRelationResolverService: CustomFieldRelationResolverService,
     customFieldRelationResolverService: CustomFieldRelationResolverService,
     apiType: ApiType,
     apiType: ApiType,
+    schema: GraphQLSchema,
 ) {
 ) {
     // Prevent `Type "Node" is missing a "resolveType" resolver.` warnings.
     // Prevent `Type "Node" is missing a "resolveType" resolver.` warnings.
     // See https://github.com/apollographql/apollo-server/issues/1075
     // See https://github.com/apollographql/apollo-server/issues/1075
@@ -99,6 +101,7 @@ export function generateResolvers(
     const customFieldRelationResolvers = generateCustomFieldRelationResolvers(
     const customFieldRelationResolvers = generateCustomFieldRelationResolvers(
         configService,
         configService,
         customFieldRelationResolverService,
         customFieldRelationResolverService,
+        schema,
     );
     );
 
 
     const adminResolvers = {
     const adminResolvers = {
@@ -128,6 +131,7 @@ export function generateResolvers(
 function generateCustomFieldRelationResolvers(
 function generateCustomFieldRelationResolvers(
     configService: ConfigService,
     configService: ConfigService,
     customFieldRelationResolverService: CustomFieldRelationResolverService,
     customFieldRelationResolverService: CustomFieldRelationResolverService,
+    schema: GraphQLSchema,
 ) {
 ) {
     const ENTITY_ID_KEY = '__entityId__';
     const ENTITY_ID_KEY = '__entityId__';
     const adminResolvers: IResolvers = {};
     const adminResolvers: IResolvers = {};
@@ -135,7 +139,7 @@ function generateCustomFieldRelationResolvers(
 
 
     for (const [entityName, customFields] of Object.entries(configService.customFields)) {
     for (const [entityName, customFields] of Object.entries(configService.customFields)) {
         const relationCustomFields = customFields.filter(isRelationalType);
         const relationCustomFields = customFields.filter(isRelationalType);
-        if (relationCustomFields.length === 0) {
+        if (relationCustomFields.length === 0 || !schema.getType(entityName)) {
             continue;
             continue;
         }
         }
         const customFieldTypeName = `${entityName}CustomFields`;
         const customFieldTypeName = `${entityName}CustomFields`;

+ 15 - 0
packages/core/src/api/config/graphql-custom-fields.ts

@@ -232,6 +232,21 @@ export function addServerConfigCustomFields(
     return extendSchema(schema, parse(customFieldTypeDefs));
     return extendSchema(schema, parse(customFieldTypeDefs));
 }
 }
 
 
+export function addActiveAdministratorCustomFields(
+    typeDefsOrSchema: string | GraphQLSchema,
+    administratorCustomFields: CustomFieldConfig[],
+) {
+    const schema = typeof typeDefsOrSchema === 'string' ? buildSchema(typeDefsOrSchema) : typeDefsOrSchema;
+    const extension = `
+        extend input UpdateActiveAdministratorInput {
+            customFields: ${
+                0 < administratorCustomFields?.length ? 'UpdateAdministratorCustomFieldsInput' : 'JSON'
+            }
+        }
+    `;
+    return extendSchema(schema, parse(extension));
+}
+
 /**
 /**
  * If CustomFields are defined on the Customer entity, then an extra `customFields` field is added to
  * If CustomFields are defined on the Customer entity, then an extra `customFields` field is added to
  * the `RegisterCustomerInput` so that public writable custom fields can be set when a new customer
  * the `RegisterCustomerInput` so that public writable custom fields can be set when a new customer

+ 1 - 0
packages/core/src/config/custom-field/custom-field-types.ts

@@ -184,6 +184,7 @@ export type CustomFieldConfig =
  */
  */
 export interface CustomFields {
 export interface CustomFields {
     Address?: CustomFieldConfig[];
     Address?: CustomFieldConfig[];
+    Administrator?: CustomFieldConfig[];
     Channel?: CustomFieldConfig[];
     Channel?: CustomFieldConfig[];
     Collection?: CustomFieldConfig[];
     Collection?: CustomFieldConfig[];
     Customer?: CustomFieldConfig[];
     Customer?: CustomFieldConfig[];

+ 1 - 0
packages/core/src/config/default-config.ts

@@ -138,6 +138,7 @@ export const defaultConfig: RuntimeVendureConfig = {
     },
     },
     customFields: {
     customFields: {
         Address: [],
         Address: [],
+        Administrator: [],
         Channel: [],
         Channel: [],
         Collection: [],
         Collection: [],
         Customer: [],
         Customer: [],

+ 7 - 2
packages/core/src/entity/administrator/administrator.entity.ts

@@ -2,7 +2,9 @@ import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, JoinColumn, OneToOne } from 'typeorm';
 import { Column, Entity, JoinColumn, OneToOne } from 'typeorm';
 
 
 import { SoftDeletable } from '../../common/types/common-types';
 import { SoftDeletable } from '../../common/types/common-types';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
 import { VendureEntity } from '../base/base.entity';
+import { CustomAdministratorFields } from '../custom-entity-fields';
 import { User } from '../user/user.entity';
 import { User } from '../user/user.entity';
 
 
 /**
 /**
@@ -12,7 +14,7 @@ import { User } from '../user/user.entity';
  * @docsCategory entities
  * @docsCategory entities
  */
  */
 @Entity()
 @Entity()
-export class Administrator extends VendureEntity implements SoftDeletable {
+export class Administrator extends VendureEntity implements SoftDeletable, HasCustomFields {
     constructor(input?: DeepPartial<Administrator>) {
     constructor(input?: DeepPartial<Administrator>) {
         super(input);
         super(input);
     }
     }
@@ -27,7 +29,10 @@ export class Administrator extends VendureEntity implements SoftDeletable {
     @Column({ unique: true })
     @Column({ unique: true })
     emailAddress: string;
     emailAddress: string;
 
 
-    @OneToOne((type) => User)
+    @OneToOne(type => User)
     @JoinColumn()
     @JoinColumn()
     user: User;
     user: User;
+
+    @Column(type => CustomAdministratorFields)
+    customFields: CustomAdministratorFields;
 }
 }

+ 1 - 0
packages/core/src/entity/custom-entity-fields.ts

@@ -1,4 +1,5 @@
 export class CustomAddressFields {}
 export class CustomAddressFields {}
+export class CustomAdministratorFields {}
 export class CustomFacetFields {}
 export class CustomFacetFields {}
 export class CustomFacetFieldsTranslation {}
 export class CustomFacetFieldsTranslation {}
 export class CustomFacetValueFields {}
 export class CustomFacetValueFields {}

+ 2 - 0
packages/core/src/entity/register-custom-entity-fields.ts

@@ -20,6 +20,7 @@ import { VendureConfig } from '../config/vendure-config';
 
 
 import {
 import {
     CustomAddressFields,
     CustomAddressFields,
+    CustomAdministratorFields,
     CustomChannelFields,
     CustomChannelFields,
     CustomCollectionFields,
     CustomCollectionFields,
     CustomCollectionFieldsTranslation,
     CustomCollectionFieldsTranslation,
@@ -209,6 +210,7 @@ function getDefault(customField: CustomFieldConfig, dbEngine: ConnectionOptions[
  */
  */
 export function registerCustomEntityFields(config: VendureConfig) {
 export function registerCustomEntityFields(config: VendureConfig) {
     registerCustomFieldsForEntity(config, 'Address', CustomAddressFields);
     registerCustomFieldsForEntity(config, 'Address', CustomAddressFields);
+    registerCustomFieldsForEntity(config, 'Administrator', CustomAdministratorFields);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFields);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFields);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFieldsTranslation, true);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFieldsTranslation, true);
     registerCustomFieldsForEntity(config, 'Customer', CustomCustomerFields);
     registerCustomFieldsForEntity(config, 'Customer', CustomCustomerFields);

+ 14 - 0
packages/core/src/service/services/administrator.service.ts

@@ -13,6 +13,7 @@ import { ConfigService } from '../../config';
 import { Administrator } from '../../entity/administrator/administrator.entity';
 import { Administrator } from '../../entity/administrator/administrator.entity';
 import { NativeAuthenticationMethod } from '../../entity/authentication-method/native-authentication-method.entity';
 import { NativeAuthenticationMethod } from '../../entity/authentication-method/native-authentication-method.entity';
 import { User } from '../../entity/user/user.entity';
 import { User } from '../../entity/user/user.entity';
+import { CustomFieldRelationService } from '../helpers/custom-field-relation/custom-field-relation.service';
 import { ListQueryBuilder } from '../helpers/list-query-builder/list-query-builder';
 import { ListQueryBuilder } from '../helpers/list-query-builder/list-query-builder';
 import { PasswordCiper } from '../helpers/password-cipher/password-ciper';
 import { PasswordCiper } from '../helpers/password-cipher/password-ciper';
 import { patchEntity } from '../helpers/utils/patch-entity';
 import { patchEntity } from '../helpers/utils/patch-entity';
@@ -30,6 +31,7 @@ export class AdministratorService {
         private passwordCipher: PasswordCiper,
         private passwordCipher: PasswordCiper,
         private userService: UserService,
         private userService: UserService,
         private roleService: RoleService,
         private roleService: RoleService,
+        private customFieldRelationService: CustomFieldRelationService,
     ) {}
     ) {}
 
 
     async initAdministrators() {
     async initAdministrators() {
@@ -80,6 +82,12 @@ export class AdministratorService {
         for (const roleId of input.roleIds) {
         for (const roleId of input.roleIds) {
             createdAdministrator = await this.assignRole(ctx, createdAdministrator.id, roleId);
             createdAdministrator = await this.assignRole(ctx, createdAdministrator.id, roleId);
         }
         }
+        await this.customFieldRelationService.updateRelations(
+            ctx,
+            Administrator,
+            input,
+            createdAdministrator,
+        );
         return createdAdministrator;
         return createdAdministrator;
     }
     }
 
 
@@ -110,6 +118,12 @@ export class AdministratorService {
                 updatedAdministrator = await this.assignRole(ctx, administrator.id, roleId);
                 updatedAdministrator = await this.assignRole(ctx, administrator.id, roleId);
             }
             }
         }
         }
+        await this.customFieldRelationService.updateRelations(
+            ctx,
+            Administrator,
+            input,
+            updatedAdministrator,
+        );
         return updatedAdministrator;
         return updatedAdministrator;
     }
     }
 
 

+ 5 - 0
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -871,6 +871,7 @@ export type CreateAdministratorInput = {
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     password: Scalars['String'];
     password: Scalars['String'];
     roleIds: Array<Scalars['ID']>;
     roleIds: Array<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateAdministratorInput = {
 export type UpdateAdministratorInput = {
@@ -880,6 +881,7 @@ export type UpdateAdministratorInput = {
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
     roleIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type UpdateActiveAdministratorInput = {
 export type UpdateActiveAdministratorInput = {
@@ -887,6 +889,7 @@ export type UpdateActiveAdministratorInput = {
     lastName?: Maybe<Scalars['String']>;
     lastName?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     emailAddress?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
     password?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type Administrator = Node & {
 export type Administrator = Node & {
@@ -897,6 +900,7 @@ export type Administrator = Node & {
     lastName: Scalars['String'];
     lastName: Scalars['String'];
     emailAddress: Scalars['String'];
     emailAddress: Scalars['String'];
     user: User;
     user: User;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 };
 
 
 export type AdministratorList = PaginatedList & {
 export type AdministratorList = PaginatedList & {
@@ -4468,6 +4472,7 @@ export type NativeAuthInput = {
 
 
 export type CustomFields = {
 export type CustomFields = {
     Address: Array<CustomFieldConfig>;
     Address: Array<CustomFieldConfig>;
+    Administrator: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;

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


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