Browse Source

feat(core): Add `updateActiveAdministrator` mutation

Michael Bromley 5 years ago
parent
commit
73ab736f93

+ 14 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -409,6 +409,8 @@ export type Mutation = {
   settleRefund: SettleRefundResult;
   transitionFulfillmentToState: TransitionFulfillmentToStateResult;
   transitionOrderToState?: Maybe<TransitionOrderToStateResult>;
+  /** Update the active (currently logged-in) Administrator */
+  updateActiveAdministrator: Administrator;
   /** Update an existing Administrator */
   updateAdministrator: Administrator;
   /** Update an existing Asset */
@@ -816,6 +818,11 @@ export type MutationTransitionOrderToStateArgs = {
 };
 
 
+export type MutationUpdateActiveAdministratorArgs = {
+  input: UpdateActiveAdministratorInput;
+};
+
+
 export type MutationUpdateAdministratorArgs = {
   input: UpdateAdministratorInput;
 };
@@ -957,6 +964,13 @@ export type UpdateAdministratorInput = {
   roleIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type UpdateActiveAdministratorInput = {
+  firstName?: Maybe<Scalars['String']>;
+  lastName?: Maybe<Scalars['String']>;
+  emailAddress?: Maybe<Scalars['String']>;
+  password?: Maybe<Scalars['String']>;
+};
+
 export type MimeTypeError = ErrorResult & {
   __typename?: 'MimeTypeError';
   errorCode: ErrorCode;

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

@@ -244,6 +244,8 @@ export type Mutation = {
     createAdministrator: Administrator;
     /** Update an existing Administrator */
     updateAdministrator: Administrator;
+    /** Update the active (currently logged-in) Administrator */
+    updateActiveAdministrator: Administrator;
     /** Delete an Administrator */
     deleteAdministrator: DeletionResponse;
     /** Assign a Role to an Administrator */
@@ -411,6 +413,10 @@ export type MutationUpdateAdministratorArgs = {
     input: UpdateAdministratorInput;
 };
 
+export type MutationUpdateActiveAdministratorArgs = {
+    input: UpdateActiveAdministratorInput;
+};
+
 export type MutationDeleteAdministratorArgs = {
     id: Scalars['ID'];
 };
@@ -795,6 +801,13 @@ export type UpdateAdministratorInput = {
     roleIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type UpdateActiveAdministratorInput = {
+    firstName?: Maybe<Scalars['String']>;
+    lastName?: Maybe<Scalars['String']>;
+    emailAddress?: Maybe<Scalars['String']>;
+    password?: Maybe<Scalars['String']>;
+};
+
 export type MimeTypeError = ErrorResult & {
     errorCode: ErrorCode;
     message: Scalars['String'];

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

@@ -286,6 +286,8 @@ export type Mutation = {
   createAdministrator: Administrator;
   /** Update an existing Administrator */
   updateAdministrator: Administrator;
+  /** Update the active (currently logged-in) Administrator */
+  updateActiveAdministrator: Administrator;
   /** Delete an Administrator */
   deleteAdministrator: DeletionResponse;
   /** Assign a Role to an Administrator */
@@ -456,6 +458,11 @@ export type MutationUpdateAdministratorArgs = {
 };
 
 
+export type MutationUpdateActiveAdministratorArgs = {
+  input: UpdateActiveAdministratorInput;
+};
+
+
 export type MutationDeleteAdministratorArgs = {
   id: Scalars['ID'];
 };
@@ -926,6 +933,13 @@ export type UpdateAdministratorInput = {
   roleIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type UpdateActiveAdministratorInput = {
+  firstName?: Maybe<Scalars['String']>;
+  lastName?: Maybe<Scalars['String']>;
+  emailAddress?: Maybe<Scalars['String']>;
+  password?: Maybe<Scalars['String']>;
+};
+
 export type MimeTypeError = ErrorResult & {
   __typename?: 'MimeTypeError';
   errorCode: ErrorCode;

+ 1 - 1
packages/core/e2e/__snapshots__/administrator.e2e-spec.ts.snap

@@ -57,7 +57,7 @@ Object {
   "lastName": "new last",
   "user": Object {
     "id": "T_3",
-    "identifier": "test@test.com",
+    "identifier": "new-email",
     "lastLogin": null,
     "roles": Array [
       Object {

+ 49 - 16
packages/core/e2e/administrator.e2e-spec.ts

@@ -15,6 +15,7 @@ import {
     DeletionResult,
     GetAdministrator,
     GetAdministrators,
+    UpdateActiveAdministrator,
     UpdateAdministrator,
 } from './graphql/generated-e2e-admin-types';
 import { CREATE_ADMINISTRATOR } from './graphql/shared-definitions';
@@ -73,22 +74,6 @@ describe('Administrator resolver', () => {
         expect(result.administrator).toEqual(createdAdmin);
     });
 
-    it('activeAdministrator', async () => {
-        await adminClient.asAnonymousUser();
-
-        const { activeAdministrator: result1 } = await adminClient.query<ActiveAdministrator.Query>(
-            GET_ACTIVE_ADMINISTRATOR,
-        );
-        expect(result1).toBeNull();
-
-        await adminClient.asSuperAdmin();
-
-        const { activeAdministrator: result2 } = await adminClient.query<ActiveAdministrator.Query>(
-            GET_ACTIVE_ADMINISTRATOR,
-        );
-        expect(result2?.emailAddress).toBe(SUPER_ADMIN_USER_IDENTIFIER);
-    });
-
     it('updateAdministrator', async () => {
         const result = await adminClient.query<UpdateAdministrator.Mutation, UpdateAdministrator.Variables>(
             UPDATE_ADMINISTRATOR,
@@ -175,6 +160,45 @@ describe('Administrator resolver', () => {
 
         expect(administrator).toBeNull();
     });
+
+    it('activeAdministrator', async () => {
+        await adminClient.asAnonymousUser();
+
+        const { activeAdministrator: result1 } = await adminClient.query<ActiveAdministrator.Query>(
+            GET_ACTIVE_ADMINISTRATOR,
+        );
+        expect(result1).toBeNull();
+
+        await adminClient.asSuperAdmin();
+
+        const { activeAdministrator: result2 } = await adminClient.query<ActiveAdministrator.Query>(
+            GET_ACTIVE_ADMINISTRATOR,
+        );
+        expect(result2?.emailAddress).toBe(SUPER_ADMIN_USER_IDENTIFIER);
+    });
+
+    it('updateActiveAdministrator', async () => {
+        const { updateActiveAdministrator } = await adminClient.query<
+            UpdateActiveAdministrator.Mutation,
+            UpdateActiveAdministrator.Variables
+        >(UPDATE_ACTIVE_ADMINISTRATOR, {
+            input: {
+                firstName: 'Thomas',
+                lastName: 'Anderson',
+                emailAddress: 'neo@metacortex.com',
+            },
+        });
+
+        expect(updateActiveAdministrator.firstName).toBe('Thomas');
+        expect(updateActiveAdministrator.lastName).toBe('Anderson');
+
+        const { activeAdministrator } = await adminClient.query<ActiveAdministrator.Query>(
+            GET_ACTIVE_ADMINISTRATOR,
+        );
+
+        expect(activeAdministrator?.firstName).toBe('Thomas');
+        expect(activeAdministrator?.user.identifier).toBe('neo@metacortex.com');
+    });
 });
 
 export const GET_ADMINISTRATORS = gql`
@@ -207,6 +231,15 @@ export const GET_ACTIVE_ADMINISTRATOR = gql`
     ${ADMINISTRATOR_FRAGMENT}
 `;
 
+export const UPDATE_ACTIVE_ADMINISTRATOR = gql`
+    mutation UpdateActiveAdministrator($input: UpdateActiveAdministratorInput!) {
+        updateActiveAdministrator(input: $input) {
+            ...Administrator
+        }
+    }
+    ${ADMINISTRATOR_FRAGMENT}
+`;
+
 export const UPDATE_ADMINISTRATOR = gql`
     mutation UpdateAdministrator($input: UpdateAdministratorInput!) {
         updateAdministrator(input: $input) {

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

@@ -244,6 +244,8 @@ export type Mutation = {
     createAdministrator: Administrator;
     /** Update an existing Administrator */
     updateAdministrator: Administrator;
+    /** Update the active (currently logged-in) Administrator */
+    updateActiveAdministrator: Administrator;
     /** Delete an Administrator */
     deleteAdministrator: DeletionResponse;
     /** Assign a Role to an Administrator */
@@ -411,6 +413,10 @@ export type MutationUpdateAdministratorArgs = {
     input: UpdateAdministratorInput;
 };
 
+export type MutationUpdateActiveAdministratorArgs = {
+    input: UpdateActiveAdministratorInput;
+};
+
 export type MutationDeleteAdministratorArgs = {
     id: Scalars['ID'];
 };
@@ -795,6 +801,13 @@ export type UpdateAdministratorInput = {
     roleIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type UpdateActiveAdministratorInput = {
+    firstName?: Maybe<Scalars['String']>;
+    lastName?: Maybe<Scalars['String']>;
+    emailAddress?: Maybe<Scalars['String']>;
+    password?: Maybe<Scalars['String']>;
+};
+
 export type MimeTypeError = ErrorResult & {
     errorCode: ErrorCode;
     message: Scalars['String'];
@@ -4014,6 +4027,12 @@ export type ActiveAdministratorQueryVariables = Exact<{ [key: string]: never }>;
 
 export type ActiveAdministratorQuery = { activeAdministrator?: Maybe<AdministratorFragment> };
 
+export type UpdateActiveAdministratorMutationVariables = Exact<{
+    input: UpdateActiveAdministratorInput;
+}>;
+
+export type UpdateActiveAdministratorMutation = { updateActiveAdministrator: AdministratorFragment };
+
 export type UpdateAdministratorMutationVariables = Exact<{
     input: UpdateAdministratorInput;
 }>;
@@ -5753,6 +5772,14 @@ export namespace ActiveAdministrator {
     export type ActiveAdministrator = NonNullable<ActiveAdministratorQuery['activeAdministrator']>;
 }
 
+export namespace UpdateActiveAdministrator {
+    export type Variables = UpdateActiveAdministratorMutationVariables;
+    export type Mutation = UpdateActiveAdministratorMutation;
+    export type UpdateActiveAdministrator = NonNullable<
+        UpdateActiveAdministratorMutation['updateActiveAdministrator']
+    >;
+}
+
 export namespace UpdateAdministrator {
     export type Variables = UpdateAdministratorMutationVariables;
     export type Mutation = UpdateAdministratorMutation;

+ 17 - 0
packages/core/src/api/resolvers/admin/administrator.resolver.ts

@@ -4,6 +4,7 @@ import {
     MutationAssignRoleToAdministratorArgs,
     MutationCreateAdministratorArgs,
     MutationDeleteAdministratorArgs,
+    MutationUpdateActiveAdministratorArgs,
     MutationUpdateAdministratorArgs,
     Permission,
     QueryAdministratorArgs,
@@ -70,6 +71,22 @@ export class AdministratorResolver {
         return this.administratorService.update(ctx, input);
     }
 
+    @Transaction()
+    @Mutation()
+    @Allow(Permission.Owner)
+    async updateActiveAdministrator(
+        @Ctx() ctx: RequestContext,
+        @Args() args: MutationUpdateActiveAdministratorArgs,
+    ): Promise<Administrator | undefined> {
+        if (ctx.activeUserId) {
+            const { input } = args;
+            const administrator = await this.administratorService.findOneByUserId(ctx, ctx.activeUserId);
+            if (administrator) {
+                return this.administratorService.update(ctx, { ...input, id: administrator.id });
+            }
+        }
+    }
+
     @Transaction()
     @Mutation()
     @Allow(Permission.UpdateAdministrator)

+ 9 - 0
packages/core/src/api/schema/admin-api/administrator.api.graphql

@@ -9,6 +9,8 @@ type Mutation {
     createAdministrator(input: CreateAdministratorInput!): Administrator!
     "Update an existing Administrator"
     updateAdministrator(input: UpdateAdministratorInput!): Administrator!
+    "Update the active (currently logged-in) Administrator"
+    updateActiveAdministrator(input: UpdateActiveAdministratorInput!): Administrator!
     "Delete an Administrator"
     deleteAdministrator(id: ID!): DeletionResponse!
     "Assign a Role to an Administrator"
@@ -34,3 +36,10 @@ input UpdateAdministratorInput {
     password: String
     roleIds: [ID!]
 }
+
+input UpdateActiveAdministratorInput {
+    firstName: String
+    lastName: String
+    emailAddress: String
+    password: String
+}

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

@@ -91,6 +91,10 @@ export class AdministratorService {
         let updatedAdministrator = patchEntity(administrator, input);
         await this.connection.getRepository(ctx, Administrator).save(administrator, { reload: false });
 
+        if (input.emailAddress) {
+            updatedAdministrator.user.identifier = input.emailAddress;
+            await this.connection.getRepository(ctx, User).save(updatedAdministrator.user);
+        }
         if (input.password) {
             const user = await this.userService.getUserById(ctx, administrator.user.id);
             if (user) {

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

@@ -244,6 +244,8 @@ export type Mutation = {
     createAdministrator: Administrator;
     /** Update an existing Administrator */
     updateAdministrator: Administrator;
+    /** Update the active (currently logged-in) Administrator */
+    updateActiveAdministrator: Administrator;
     /** Delete an Administrator */
     deleteAdministrator: DeletionResponse;
     /** Assign a Role to an Administrator */
@@ -411,6 +413,10 @@ export type MutationUpdateAdministratorArgs = {
     input: UpdateAdministratorInput;
 };
 
+export type MutationUpdateActiveAdministratorArgs = {
+    input: UpdateActiveAdministratorInput;
+};
+
 export type MutationDeleteAdministratorArgs = {
     id: Scalars['ID'];
 };
@@ -795,6 +801,13 @@ export type UpdateAdministratorInput = {
     roleIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type UpdateActiveAdministratorInput = {
+    firstName?: Maybe<Scalars['String']>;
+    lastName?: Maybe<Scalars['String']>;
+    emailAddress?: Maybe<Scalars['String']>;
+    password?: Maybe<Scalars['String']>;
+};
+
 export type MimeTypeError = ErrorResult & {
     errorCode: ErrorCode;
     message: Scalars['String'];

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