소스 검색

feat(core): Add `activeAdministrator` query to Admin API

Michael Bromley 5 년 전
부모
커밋
70e14f221d

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

@@ -19,6 +19,7 @@ export type Scalars = {
 
 export type Query = {
   __typename?: 'Query';
+  activeAdministrator?: Maybe<Administrator>;
   activeChannel: Channel;
   administrator?: Maybe<Administrator>;
   administrators: AdministratorList;

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

@@ -19,6 +19,7 @@ export type Scalars = {
 export type Query = {
     administrators: AdministratorList;
     administrator?: Maybe<Administrator>;
+    activeAdministrator?: Maybe<Administrator>;
     /** Get a list of Assets */
     assets: AssetList;
     /** Get a single Asset by id */

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

@@ -20,6 +20,7 @@ export type Query = {
   __typename?: 'Query';
   administrators: AdministratorList;
   administrator?: Maybe<Administrator>;
+  activeAdministrator?: Maybe<Administrator>;
   /** Get a list of Assets */
   assets: AssetList;
   /** Get a single Asset by id */

+ 28 - 1
packages/core/e2e/administrator.e2e-spec.ts

@@ -1,12 +1,14 @@
+import { SUPER_ADMIN_USER_IDENTIFIER } from '@vendure/common/lib/shared-constants';
 import { createTestEnvironment } from '@vendure/testing';
 import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 
 import { ADMINISTRATOR_FRAGMENT } from './graphql/fragments';
 import {
+    ActiveAdministrator,
     Administrator,
     CreateAdministrator,
     DeleteAdministrator,
@@ -71,6 +73,22 @@ 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,
@@ -180,6 +198,15 @@ export const GET_ADMINISTRATOR = gql`
     ${ADMINISTRATOR_FRAGMENT}
 `;
 
+export const GET_ACTIVE_ADMINISTRATOR = gql`
+    query ActiveAdministrator {
+        activeAdministrator {
+            ...Administrator
+        }
+    }
+    ${ADMINISTRATOR_FRAGMENT}
+`;
+
 export const UPDATE_ADMINISTRATOR = gql`
     mutation UpdateAdministrator($input: UpdateAdministratorInput!) {
         updateAdministrator(input: $input) {

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

@@ -19,6 +19,7 @@ export type Scalars = {
 export type Query = {
     administrators: AdministratorList;
     administrator?: Maybe<Administrator>;
+    activeAdministrator?: Maybe<Administrator>;
     /** Get a list of Assets */
     assets: AssetList;
     /** Get a single Asset by id */
@@ -4009,6 +4010,10 @@ export type GetAdministratorQueryVariables = Exact<{
 
 export type GetAdministratorQuery = { administrator?: Maybe<AdministratorFragment> };
 
+export type ActiveAdministratorQueryVariables = Exact<{ [key: string]: never }>;
+
+export type ActiveAdministratorQuery = { activeAdministrator?: Maybe<AdministratorFragment> };
+
 export type UpdateAdministratorMutationVariables = Exact<{
     input: UpdateAdministratorInput;
 }>;
@@ -5742,6 +5747,12 @@ export namespace GetAdministrator {
     export type Administrator = NonNullable<GetAdministratorQuery['administrator']>;
 }
 
+export namespace ActiveAdministrator {
+    export type Variables = ActiveAdministratorQueryVariables;
+    export type Query = ActiveAdministratorQuery;
+    export type ActiveAdministrator = NonNullable<ActiveAdministratorQuery['activeAdministrator']>;
+}
+
 export namespace UpdateAdministrator {
     export type Variables = UpdateAdministratorMutationVariables;
     export type Mutation = UpdateAdministratorMutation;

+ 2 - 0
packages/core/src/api/api-internal-modules.ts

@@ -31,6 +31,7 @@ import { ShippingMethodResolver } from './resolvers/admin/shipping-method.resolv
 import { TaxCategoryResolver } from './resolvers/admin/tax-category.resolver';
 import { TaxRateResolver } from './resolvers/admin/tax-rate.resolver';
 import { ZoneResolver } from './resolvers/admin/zone.resolver';
+import { AdministratorEntityResolver } from './resolvers/entity/administrator-entity.resolver';
 import { CollectionEntityResolver } from './resolvers/entity/collection-entity.resolver';
 import {
     CustomerAdminEntityResolver,
@@ -101,6 +102,7 @@ const shopResolvers = [
 ];
 
 export const entityResolvers = [
+    AdministratorEntityResolver,
     CollectionEntityResolver,
     CustomerEntityResolver,
     CustomerGroupEntityResolver,

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

@@ -40,6 +40,14 @@ export class AdministratorResolver {
         return this.administratorService.findOne(ctx, args.id);
     }
 
+    @Query()
+    @Allow(Permission.Owner)
+    async activeAdministrator(@Ctx() ctx: RequestContext): Promise<Administrator | undefined> {
+        if (ctx.activeUserId) {
+            return this.administratorService.findOneByUserId(ctx, ctx.activeUserId);
+        }
+    }
+
     @Transaction()
     @Mutation()
     @Allow(Permission.CreateAdministrator)

+ 25 - 0
packages/core/src/api/resolvers/entity/administrator-entity.resolver.ts

@@ -0,0 +1,25 @@
+import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
+
+import { EntityNotFoundError, InternalServerError } from '../../../common/error/errors';
+import { Administrator } from '../../../entity/administrator/administrator.entity';
+import { User } from '../../../entity/user/user.entity';
+import { UserService } from '../../../service/services/user.service';
+import { RequestContext } from '../../common/request-context';
+import { Ctx } from '../../decorators/request-context.decorator';
+
+@Resolver('Administrator')
+export class AdministratorEntityResolver {
+    constructor(private userService: UserService) {}
+
+    @ResolveField()
+    async user(@Ctx() ctx: RequestContext, @Parent() administrator: Administrator): Promise<User> {
+        if (administrator.user) {
+            return administrator.user;
+        }
+        const user = await this.userService.getUserByEmailAddress(ctx, administrator.emailAddress);
+        if (!user) {
+            throw new EntityNotFoundError('User', '<not found>');
+        }
+        return user;
+    }
+}

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

@@ -1,6 +1,7 @@
 type Query {
     administrators(options: AdministratorListOptions): AdministratorList!
     administrator(id: ID!): Administrator
+    activeAdministrator: Administrator
 }
 
 type Mutation {

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

@@ -19,6 +19,7 @@ export type Scalars = {
 export type Query = {
     administrators: AdministratorList;
     administrator?: Maybe<Administrator>;
+    activeAdministrator?: Maybe<Administrator>;
     /** Get a list of Assets */
     assets: AssetList;
     /** Get a single Asset by id */

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
schema-admin.json


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.