Browse Source

refactor: Address.country is now a reference to actual Country entity

Michael Bromley 7 years ago
parent
commit
4414f533df

+ 2 - 2
admin-ui/src/app/customer/components/address-card/address-card.component.html

@@ -24,9 +24,9 @@
                 <li *ngIf="address.city">{{ address.city }}</li>
                 <li *ngIf="address.province">{{ address.province }}</li>
                 <li *ngIf="address.postalCode">{{ address.postalCode }}</li>
-                <li *ngIf="address.countryCode">
+                <li *ngIf="address.country">
                     <clr-icon shape="world" size="12"></clr-icon>
-                    {{ getCountryName(address.countryCode) }}
+                    {{ address.country.name }}
                 </li>
                 <li *ngIf="address.phoneNumber">
                     <clr-icon shape="phone-handset" size="12"></clr-icon>

+ 3 - 1
admin-ui/src/app/customer/components/customer-detail/customer-detail.component.ts

@@ -248,7 +248,9 @@ export class CustomerDetailComponent extends BaseDetailComponent<GetCustomer.Cus
         if (entity.addresses) {
             const addressesArray = new FormArray([]);
             for (const address of entity.addresses) {
-                addressesArray.push(this.formBuilder.group(address));
+                addressesArray.push(
+                    this.formBuilder.group({ ...address, countryCode: address.country.code }),
+                );
                 if (address.defaultShippingAddress) {
                     this.defaultShippingAddressId = address.id;
                 }

+ 5 - 2
admin-ui/src/app/data/definitions/customer-definitions.ts

@@ -10,8 +10,11 @@ export const ADDRESS_FRAGMENT = gql`
         city
         province
         postalCode
-        country
-        countryCode
+        country {
+            id
+            code
+            name
+        }
         phoneNumber
         defaultShippingAddress
         defaultBillingAddress

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


+ 12 - 6
server/e2e/customer.e2e-spec.ts

@@ -98,8 +98,10 @@ describe('Customer resolver', () => {
                 city: 'city',
                 province: 'province',
                 postalCode: 'postalCode',
-                countryCode: 'GB',
-                country: 'United Kingdom of Great Britain and Northern Ireland',
+                country: {
+                    code: 'GB',
+                    name: 'United Kingdom of Great Britain and Northern Ireland',
+                },
                 phoneNumber: 'phoneNumber',
                 defaultShippingAddress: false,
                 defaultBillingAddress: false,
@@ -197,8 +199,10 @@ describe('Customer resolver', () => {
                 city: '',
                 province: '',
                 postalCode: '',
-                countryCode: 'GB',
-                country: 'United Kingdom of Great Britain and Northern Ireland',
+                country: {
+                    code: 'GB',
+                    name: 'United Kingdom of Great Britain and Northern Ireland',
+                },
                 phoneNumber: '',
                 defaultShippingAddress: true,
                 defaultBillingAddress: true,
@@ -303,8 +307,10 @@ const CREATE_ADDRESS = gql`
             city
             province
             postalCode
-            country
-            countryCode
+            country {
+                code
+                name
+            }
             phoneNumber
             defaultShippingAddress
             defaultBillingAddress

+ 6 - 3
server/src/api/resolvers/customer.resolver.ts

@@ -60,7 +60,7 @@ export class CustomerResolver {
     async addresses(@Ctx() ctx: RequestContext, @Parent() customer: Customer): Promise<Address[]> {
         this.checkOwnerPermissions(ctx, customer);
         const customerId = this.idCodecService.decode(customer.id);
-        return this.customerService.findAddressesByCustomerId(customerId);
+        return this.customerService.findAddressesByCustomerId(ctx, customerId);
     }
 
     @ResolveProperty()
@@ -102,9 +102,12 @@ export class CustomerResolver {
 
     @Mutation()
     @Allow(Permission.UpdateCustomer)
-    async updateCustomerAddress(@Args() args: UpdateCustomerAddressMutationArgs): Promise<Address> {
+    async updateCustomerAddress(
+        @Ctx() ctx: RequestContext,
+        @Args() args: UpdateCustomerAddressMutationArgs,
+    ): Promise<Address> {
         const { input } = args;
-        return this.customerService.updateAddress(input);
+        return this.customerService.updateAddress(ctx, input);
     }
 
     @Mutation()

+ 3 - 3
server/src/entity/address/address.entity.ts

@@ -2,6 +2,7 @@ import { Column, Entity, ManyToOne } from 'typeorm';
 
 import { DeepPartial, HasCustomFields } from '../../../../shared/shared-types';
 import { VendureEntity } from '../base/base.entity';
+import { Country } from '../country/country.entity';
 import { CustomAddressFields } from '../custom-entity-fields';
 import { Customer } from '../customer/customer.entity';
 
@@ -31,9 +32,8 @@ export class Address extends VendureEntity implements HasCustomFields {
 
     @Column({ default: '' }) postalCode: string;
 
-    @Column() country: string;
-
-    @Column() countryCode: string;
+    @ManyToOne(type => Country)
+    country: Country;
 
     @Column({ default: '' })
     phoneNumber: string;

+ 1 - 2
server/src/entity/address/address.graphql

@@ -9,8 +9,7 @@ type Address implements Node {
     city: String
     province: String
     postalCode: String
-    country: String!
-    countryCode: String!
+    country: Country!
     phoneNumber: String
     defaultShippingAddress: Boolean
     defaultBillingAddress: Boolean

+ 17 - 5
server/src/service/services/customer.service.ts

@@ -23,6 +23,7 @@ import { AccountRegistrationEvent } from '../../event-bus/events/account-registr
 import { ListQueryBuilder } from '../helpers/list-query-builder/list-query-builder';
 import { getEntityOrThrow } from '../helpers/utils/get-entity-or-throw';
 import { patchEntity } from '../helpers/utils/patch-entity';
+import { translateDeep } from '../helpers/utils/translate-entity';
 
 import { CountryService } from './country.service';
 import { UserService } from './user.service';
@@ -57,12 +58,20 @@ export class CustomerService {
         });
     }
 
-    findAddressesByCustomerId(customerId: ID): Promise<Address[]> {
+    findAddressesByCustomerId(ctx: RequestContext, customerId: ID): Promise<Address[]> {
         return this.connection
             .getRepository(Address)
             .createQueryBuilder('address')
+            .leftJoinAndSelect('address.country', 'country')
+            .leftJoinAndSelect('country.translations', 'countryTranslation')
             .where('address.customerId = :id', { id: customerId })
-            .getMany();
+            .getMany()
+            .then(addresses => {
+                addresses.forEach(address => {
+                    address.country = translateDeep(address.country, ctx.languageCode);
+                });
+                return addresses;
+            });
     }
 
     async create(input: CreateCustomerInput, password?: string): Promise<Customer> {
@@ -174,7 +183,7 @@ export class CustomerService {
         const country = await this.countryService.findOneByCode(ctx, input.countryCode);
         const address = new Address({
             ...input,
-            country: country.name,
+            country,
         });
         const createdAddress = await this.connection.manager.getRepository(Address).save(address);
         customer.addresses.push(createdAddress);
@@ -183,8 +192,11 @@ export class CustomerService {
         return createdAddress;
     }
 
-    async updateAddress(input: UpdateAddressInput): Promise<Address> {
-        const address = await getEntityOrThrow(this.connection, Address, input.id);
+    async updateAddress(ctx: RequestContext, input: UpdateAddressInput): Promise<Address> {
+        const address = await getEntityOrThrow(this.connection, Address, input.id, {
+            relations: ['country'],
+        });
+        address.country = translateDeep(address.country, ctx.languageCode);
         const updatedAddress = patchEntity(address, input);
         await this.connection.getRepository(Address).save(updatedAddress);
         await this.enforceSingleDefaultAddress(input.id, input);

+ 26 - 8
shared/generated-types.ts

@@ -238,8 +238,7 @@ export interface Address extends Node {
     city?: string | null;
     province?: string | null;
     postalCode?: string | null;
-    country: string;
-    countryCode: string;
+    country: Country;
     phoneNumber?: string | null;
     defaultShippingAddress?: boolean | null;
     defaultBillingAddress?: boolean | null;
@@ -681,6 +680,7 @@ export interface Mutation {
     updateChannel: Channel;
     createCountry: Country;
     updateCountry: Country;
+    deleteCountry: DeletionResponse;
     createCustomerGroup: CustomerGroup;
     updateCustomerGroup: CustomerGroup;
     addCustomersToGroup: CustomerGroup;
@@ -1658,6 +1658,9 @@ export interface CreateCountryMutationArgs {
 export interface UpdateCountryMutationArgs {
     input: UpdateCountryInput;
 }
+export interface DeleteCountryMutationArgs {
+    id: string;
+}
 export interface CreateCustomerGroupMutationArgs {
     input: CreateCustomerGroupInput;
 }
@@ -3084,8 +3087,7 @@ export namespace AddressResolvers {
         city?: CityResolver<string | null, any, Context>;
         province?: ProvinceResolver<string | null, any, Context>;
         postalCode?: PostalCodeResolver<string | null, any, Context>;
-        country?: CountryResolver<string, any, Context>;
-        countryCode?: CountryCodeResolver<string, any, Context>;
+        country?: CountryResolver<Country, any, Context>;
         phoneNumber?: PhoneNumberResolver<string | null, any, Context>;
         defaultShippingAddress?: DefaultShippingAddressResolver<boolean | null, any, Context>;
         defaultBillingAddress?: DefaultBillingAddressResolver<boolean | null, any, Context>;
@@ -3122,8 +3124,7 @@ export namespace AddressResolvers {
         Parent,
         Context
     >;
-    export type CountryResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
-    export type CountryCodeResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type CountryResolver<R = Country, Parent = any, Context = any> = Resolver<R, Parent, Context>;
     export type PhoneNumberResolver<R = string | null, Parent = any, Context = any> = Resolver<
         R,
         Parent,
@@ -4423,6 +4424,7 @@ export namespace MutationResolvers {
         updateChannel?: UpdateChannelResolver<Channel, any, Context>;
         createCountry?: CreateCountryResolver<Country, any, Context>;
         updateCountry?: UpdateCountryResolver<Country, any, Context>;
+        deleteCountry?: DeleteCountryResolver<DeletionResponse, any, Context>;
         createCustomerGroup?: CreateCustomerGroupResolver<CustomerGroup, any, Context>;
         updateCustomerGroup?: UpdateCustomerGroupResolver<CustomerGroup, any, Context>;
         addCustomersToGroup?: AddCustomersToGroupResolver<CustomerGroup, any, Context>;
@@ -4609,6 +4611,16 @@ export namespace MutationResolvers {
         input: UpdateCountryInput;
     }
 
+    export type DeleteCountryResolver<R = DeletionResponse, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context,
+        DeleteCountryArgs
+    >;
+    export interface DeleteCountryArgs {
+        id: string;
+    }
+
     export type CreateCustomerGroupResolver<R = CustomerGroup, Parent = any, Context = any> = Resolver<
         R,
         Parent,
@@ -6757,12 +6769,18 @@ export namespace Address {
         city?: string | null;
         province?: string | null;
         postalCode?: string | null;
-        country: string;
-        countryCode: string;
+        country: Country;
         phoneNumber?: string | null;
         defaultShippingAddress?: boolean | null;
         defaultBillingAddress?: boolean | null;
     };
+
+    export type Country = {
+        __typename?: 'Country';
+        id: string;
+        code: string;
+        name: string;
+    };
 }
 
 export namespace Customer {

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