Prechádzať zdrojové kódy

fix(core): Add resolver for `Zone.members` field

Michael Bromley 3 rokov pred
rodič
commit
3b67e61e37

+ 50 - 31
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -6937,6 +6937,24 @@ export type TransitionPaymentToStateMutationVariables = Exact<{
 
 export type TransitionPaymentToStateMutation = { transitionPaymentToState: PaymentFragment | Pick<PaymentStateTransitionError, 'errorCode' | 'message' | 'transitionError'> };
 
+export type GetProductVariantListQueryVariables = Exact<{
+  options?: Maybe<ProductVariantListOptions>;
+  productId?: Maybe<Scalars['ID']>;
+}>;
+
+
+export type GetProductVariantListQuery = { productVariants: (
+    Pick<ProductVariantList, 'totalItems'>
+    & { items: Array<Pick<ProductVariant, 'id' | 'name' | 'sku' | 'price' | 'priceWithTax'>> }
+  ) };
+
+export type DeletePromotionMutationVariables = Exact<{
+  id: Scalars['ID'];
+}>;
+
+
+export type DeletePromotionMutation = { deletePromotion: Pick<DeletionResponse, 'result'> };
+
 export type CancelJobMutationVariables = Exact<{
   id: Scalars['ID'];
 }>;
@@ -7265,17 +7283,6 @@ export type GetProductVariantQueryVariables = Exact<{
 
 export type GetProductVariantQuery = { productVariant?: Maybe<Pick<ProductVariant, 'id' | 'name'>> };
 
-export type GetProductVariantListQueryVariables = Exact<{
-  options?: Maybe<ProductVariantListOptions>;
-  productId?: Maybe<Scalars['ID']>;
-}>;
-
-
-export type GetProductVariantListQuery = { productVariants: (
-    Pick<ProductVariantList, 'totalItems'>
-    & { items: Array<Pick<ProductVariant, 'id' | 'name' | 'sku' | 'price' | 'priceWithTax'>> }
-  ) };
-
 export type GetProductWithVariantListQueryVariables = Exact<{
   id?: Maybe<Scalars['ID']>;
   variantListOptions?: Maybe<ProductVariantListOptions>;
@@ -7290,13 +7297,6 @@ export type GetProductWithVariantListQuery = { product?: Maybe<(
     ) }
   )> };
 
-export type DeletePromotionMutationVariables = Exact<{
-  id: Scalars['ID'];
-}>;
-
-
-export type DeletePromotionMutation = { deletePromotion: Pick<DeletionResponse, 'result'> };
-
 export type GetPromotionListQueryVariables = Exact<{
   options?: Maybe<PromotionListOptions>;
 }>;
@@ -7623,6 +7623,17 @@ export type GetZoneQueryVariables = Exact<{
 
 export type GetZoneQuery = { zone?: Maybe<ZoneFragment> };
 
+export type GetActiveChannelWithZoneMembersQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type GetActiveChannelWithZoneMembersQuery = { activeChannel: (
+    Pick<Channel, 'id'>
+    & { defaultShippingZone?: Maybe<(
+      Pick<Zone, 'id'>
+      & { members: Array<Pick<Country, 'name'>> }
+    )> }
+  ) };
+
 export type CreateZoneMutationVariables = Exact<{
   input: CreateZoneInput;
 }>;
@@ -8989,6 +9000,19 @@ export namespace TransitionPaymentToState {
   export type PaymentStateTransitionErrorInlineFragment = (DiscriminateUnion<(NonNullable<TransitionPaymentToStateMutation['transitionPaymentToState']>), { __typename?: 'PaymentStateTransitionError' }>);
 }
 
+export namespace GetProductVariantList {
+  export type Variables = GetProductVariantListQueryVariables;
+  export type Query = GetProductVariantListQuery;
+  export type ProductVariants = (NonNullable<GetProductVariantListQuery['productVariants']>);
+  export type Items = NonNullable<(NonNullable<(NonNullable<GetProductVariantListQuery['productVariants']>)['items']>)[number]>;
+}
+
+export namespace DeletePromotion {
+  export type Variables = DeletePromotionMutationVariables;
+  export type Mutation = DeletePromotionMutation;
+  export type DeletePromotion = (NonNullable<DeletePromotionMutation['deletePromotion']>);
+}
+
 export namespace CancelJob {
   export type Variables = CancelJobMutationVariables;
   export type Mutation = CancelJobMutation;
@@ -9268,13 +9292,6 @@ export namespace GetProductVariant {
   export type ProductVariant = (NonNullable<GetProductVariantQuery['productVariant']>);
 }
 
-export namespace GetProductVariantList {
-  export type Variables = GetProductVariantListQueryVariables;
-  export type Query = GetProductVariantListQuery;
-  export type ProductVariants = (NonNullable<GetProductVariantListQuery['productVariants']>);
-  export type Items = NonNullable<(NonNullable<(NonNullable<GetProductVariantListQuery['productVariants']>)['items']>)[number]>;
-}
-
 export namespace GetProductWithVariantList {
   export type Variables = GetProductWithVariantListQueryVariables;
   export type Query = GetProductWithVariantListQuery;
@@ -9283,12 +9300,6 @@ export namespace GetProductWithVariantList {
   export type Items = NonNullable<(NonNullable<(NonNullable<(NonNullable<GetProductWithVariantListQuery['product']>)['variantList']>)['items']>)[number]>;
 }
 
-export namespace DeletePromotion {
-  export type Variables = DeletePromotionMutationVariables;
-  export type Mutation = DeletePromotionMutation;
-  export type DeletePromotion = (NonNullable<DeletePromotionMutation['deletePromotion']>);
-}
-
 export namespace GetPromotionList {
   export type Variables = GetPromotionListQueryVariables;
   export type Query = GetPromotionListQuery;
@@ -9582,6 +9593,14 @@ export namespace GetZone {
   export type Zone = (NonNullable<GetZoneQuery['zone']>);
 }
 
+export namespace GetActiveChannelWithZoneMembers {
+  export type Variables = GetActiveChannelWithZoneMembersQueryVariables;
+  export type Query = GetActiveChannelWithZoneMembersQuery;
+  export type ActiveChannel = (NonNullable<GetActiveChannelWithZoneMembersQuery['activeChannel']>);
+  export type DefaultShippingZone = (NonNullable<(NonNullable<GetActiveChannelWithZoneMembersQuery['activeChannel']>)['defaultShippingZone']>);
+  export type Members = NonNullable<(NonNullable<(NonNullable<(NonNullable<GetActiveChannelWithZoneMembersQuery['activeChannel']>)['defaultShippingZone']>)['members']>)[number]>;
+}
+
 export namespace CreateZone {
   export type Variables = CreateZoneMutationVariables;
   export type Mutation = CreateZoneMutation;

+ 23 - 0
packages/core/e2e/zone.e2e-spec.ts

@@ -11,6 +11,7 @@ import {
     CreateZone,
     DeleteZone,
     DeletionResult,
+    GetActiveChannelWithZoneMembersQuery,
     GetCountryList,
     GetZone,
     GetZones,
@@ -60,6 +61,14 @@ describe('Zone resolver', () => {
         expect(result.zone!.name).toBe('Oceania');
     });
 
+    it('zone.members field resolver', async () => {
+        const { activeChannel } = await adminClient.query<GetActiveChannelWithZoneMembersQuery>(
+            GET_ACTIVE_CHANNEL_WITH_ZONE_MEMBERS,
+        );
+
+        expect(activeChannel.defaultShippingZone?.members.length).toBe(2);
+    });
+
     it('updateZone', async () => {
         const result = await adminClient.query<UpdateZone.Mutation, UpdateZone.Variables>(UPDATE_ZONE, {
             input: {
@@ -218,6 +227,20 @@ export const GET_ZONE = gql`
     ${ZONE_FRAGMENT}
 `;
 
+export const GET_ACTIVE_CHANNEL_WITH_ZONE_MEMBERS = gql`
+    query GetActiveChannelWithZoneMembers {
+        activeChannel {
+            id
+            defaultShippingZone {
+                id
+                members {
+                    name
+                }
+            }
+        }
+    }
+`;
+
 export const CREATE_ZONE = gql`
     mutation CreateZone($input: CreateZoneInput!) {
         createZone(input: $input) {

+ 22 - 5
packages/core/src/api/api-internal-modules.ts

@@ -40,27 +40,43 @@ import { AdministratorEntityResolver } from './resolvers/entity/administrator-en
 import { AssetEntityResolver } from './resolvers/entity/asset-entity.resolver';
 import { CollectionEntityResolver } from './resolvers/entity/collection-entity.resolver';
 import { CountryEntityResolver } from './resolvers/entity/country-entity.resolver';
-import { CustomerAdminEntityResolver, CustomerEntityResolver, } from './resolvers/entity/customer-entity.resolver';
+import {
+    CustomerAdminEntityResolver,
+    CustomerEntityResolver,
+} from './resolvers/entity/customer-entity.resolver';
 import { CustomerGroupEntityResolver } from './resolvers/entity/customer-group-entity.resolver';
 import { FacetEntityResolver } from './resolvers/entity/facet-entity.resolver';
 import { FacetValueEntityResolver } from './resolvers/entity/facet-value-entity.resolver';
-import { FulfillmentAdminEntityResolver, FulfillmentEntityResolver, } from './resolvers/entity/fulfillment-entity.resolver';
+import {
+    FulfillmentAdminEntityResolver,
+    FulfillmentEntityResolver,
+} from './resolvers/entity/fulfillment-entity.resolver';
 import { JobEntityResolver } from './resolvers/entity/job-entity.resolver';
 import { OrderAdminEntityResolver, OrderEntityResolver } from './resolvers/entity/order-entity.resolver';
 import { OrderItemEntityResolver } from './resolvers/entity/order-item-entity.resolver';
 import { OrderLineEntityResolver } from './resolvers/entity/order-line-entity.resolver';
-import { PaymentAdminEntityResolver, PaymentEntityResolver, } from './resolvers/entity/payment-entity.resolver';
+import {
+    PaymentAdminEntityResolver,
+    PaymentEntityResolver,
+} from './resolvers/entity/payment-entity.resolver';
 import { PaymentMethodEntityResolver } from './resolvers/entity/payment-method-entity.resolver';
-import { ProductAdminEntityResolver, ProductEntityResolver, } from './resolvers/entity/product-entity.resolver';
+import {
+    ProductAdminEntityResolver,
+    ProductEntityResolver,
+} from './resolvers/entity/product-entity.resolver';
 import { ProductOptionEntityResolver } from './resolvers/entity/product-option-entity.resolver';
 import { ProductOptionGroupEntityResolver } from './resolvers/entity/product-option-group-entity.resolver';
-import { ProductVariantAdminEntityResolver, ProductVariantEntityResolver, } from './resolvers/entity/product-variant-entity.resolver';
+import {
+    ProductVariantAdminEntityResolver,
+    ProductVariantEntityResolver,
+} from './resolvers/entity/product-variant-entity.resolver';
 import { RefundEntityResolver } from './resolvers/entity/refund-entity.resolver';
 import { RoleEntityResolver } from './resolvers/entity/role-entity.resolver';
 import { ShippingLineEntityResolver } from './resolvers/entity/shipping-line-entity.resolver';
 import { ShippingMethodEntityResolver } from './resolvers/entity/shipping-method-entity.resolver';
 import { TaxRateEntityResolver } from './resolvers/entity/tax-rate-entity.resolver';
 import { UserEntityResolver } from './resolvers/entity/user-entity.resolver';
+import { ZoneEntityResolver } from './resolvers/entity/zone-entity.resolver';
 import { ShopAuthResolver } from './resolvers/shop/shop-auth.resolver';
 import { ShopCustomerResolver } from './resolvers/shop/shop-customer.resolver';
 import { ShopEnvironmentResolver } from './resolvers/shop/shop-environment.resolver';
@@ -125,6 +141,7 @@ export const entityResolvers = [
     UserEntityResolver,
     TaxRateEntityResolver,
     ShippingMethodEntityResolver,
+    ZoneEntityResolver,
 ];
 
 export const adminEntityResolvers = [

+ 20 - 0
packages/core/src/api/resolvers/entity/zone-entity.resolver.ts

@@ -0,0 +1,20 @@
+import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
+
+import { Country, Zone } from '../../../entity/index';
+import { ZoneService } from '../../../service/index';
+import { RequestContext } from '../../common/request-context';
+import { Ctx } from '../../decorators/request-context.decorator';
+
+@Resolver('Zone')
+export class ZoneEntityResolver {
+    constructor(private zoneService: ZoneService) {}
+
+    @ResolveField()
+    async members(@Ctx() ctx: RequestContext, @Parent() zone: Zone): Promise<Country[]> {
+        if (Array.isArray(zone.members)) {
+            return zone.members;
+        }
+        const zoneWithMembers = await this.zoneService.findOne(ctx, zone.id);
+        return zoneWithMembers?.members ?? [];
+    }
+}