Skip to content

Commit

Permalink
Fix optional embedded for manufacturer (#1750)
Browse files Browse the repository at this point in the history
Embedded fields can only be optional if all nested fields also are
optional. In case of manufacturer only streetNumber is optional.
  • Loading branch information
Ben-Ho authored Feb 26, 2024
1 parent 16913ff commit e860f28
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 14 deletions.
8 changes: 4 additions & 4 deletions demo/api/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -436,13 +436,13 @@ type AddressAsEmbeddable {
streetNumber: Float
zip: Float!
country: String!
alternativeAddress: AlternativeAddressAsEmbeddable
alternativeAddress: AlternativeAddressAsEmbeddable!
}

type Manufacturer {
id: ID!
address: Address
addressAsEmbeddable: AddressAsEmbeddable
addressAsEmbeddable: AddressAsEmbeddable!
updatedAt: DateTime!
}

Expand Down Expand Up @@ -655,7 +655,7 @@ input AddressAsEmbeddableInput {
streetNumber: Float
zip: Float!
country: String!
alternativeAddress: AlternativeAddressAsEmbeddableInput
alternativeAddress: AlternativeAddressAsEmbeddableInput!
}

input ProductDiscountsInput {
Expand Down Expand Up @@ -1329,7 +1329,7 @@ input ProductTagUpdateInput {

input ManufacturerInput {
address: AddressInput
addressAsEmbeddable: AddressAsEmbeddableInput
addressAsEmbeddable: AddressAsEmbeddableInput!
}

input ManufacturerUpdateInput {
Expand Down
20 changes: 20 additions & 0 deletions demo/api/src/db/migrations/Migration20240223151902.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Migration } from '@mikro-orm/migrations';

export class Migration20240223151902 extends Migration {

async up(): Promise<void> {
this.addSql('delete from "Manufacturer";');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_street" type varchar(255) using ("addressAsEmbeddable_street"::varchar(255));');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_street" set not null;');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_zip" type int using ("addressAsEmbeddable_zip"::int);');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_zip" set not null;');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_country" type varchar(255) using ("addressAsEmbeddable_country"::varchar(255));');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_country" set not null;');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_street" type varchar(255) using ("addressAsEmbeddable_alternativeAddress_street"::varchar(255));');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_street" set not null;');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_zip" type int using ("addressAsEmbeddable_alternativeAddress_zip"::int);');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_zip" set not null;');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_country" type varchar(255) using ("addressAsEmbeddable_alternativeAddress_country"::varchar(255));');
this.addSql('alter table "Manufacturer" alter column "addressAsEmbeddable_alternativeAddress_country" set not null;');
}
}
12 changes: 6 additions & 6 deletions demo/api/src/products/entities/manufacturer.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ export class AlternativeAddressAsEmbeddable {
@ObjectType()
@InputType("AddressAsEmbeddableInput")
export class AddressAsEmbeddable extends AlternativeAddressAsEmbeddable {
@Embedded(() => AlternativeAddressAsEmbeddable, { nullable: true })
@Field(() => AlternativeAddressAsEmbeddable, { nullable: true })
@Embedded(() => AlternativeAddressAsEmbeddable)
@Field(() => AlternativeAddressAsEmbeddable)
@IsObject()
alternativeAddress?: AlternativeAddressAsEmbeddable = undefined;
alternativeAddress: AlternativeAddressAsEmbeddable;
}

@Entity()
Expand All @@ -88,9 +88,9 @@ export class Manufacturer extends BaseEntity<Manufacturer, "id"> {
@Field(() => Address, { nullable: true })
address?: Address = undefined;

@Embedded(() => AddressAsEmbeddable, { nullable: true })
@Field(() => AddressAsEmbeddable, { nullable: true })
addressAsEmbeddable?: AddressAsEmbeddable = undefined;
@Embedded(() => AddressAsEmbeddable) // Embedded can only be optional if all contained properties are optional
@Field(() => AddressAsEmbeddable)
addressAsEmbeddable: AddressAsEmbeddable;

@Property({ onUpdate: () => new Date() })
@Field()
Expand Down
8 changes: 4 additions & 4 deletions demo/api/src/products/generated/dto/manufacturer.input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { IsNullable, PartialType } from "@comet/cms-api";
import { Field, InputType } from "@nestjs/graphql";
import { Type } from "class-transformer";
import { ValidateNested } from "class-validator";
import { IsNotEmpty, ValidateNested } from "class-validator";

import { Address, AddressAsEmbeddable } from "../../entities/manufacturer.entity";

Expand All @@ -15,11 +15,11 @@ export class ManufacturerInput {
@Field(() => Address, { nullable: true })
address?: Address;

@IsNullable()
@IsNotEmpty()
@ValidateNested()
@Type(() => AddressAsEmbeddable)
@Field(() => AddressAsEmbeddable, { nullable: true })
addressAsEmbeddable?: AddressAsEmbeddable;
@Field(() => AddressAsEmbeddable)
addressAsEmbeddable: AddressAsEmbeddable;
}

@InputType()
Expand Down

0 comments on commit e860f28

Please sign in to comment.