diff --git a/backend/core/src/listings/dto/listing.dto.ts b/backend/core/src/listings/dto/listing.dto.ts index b307b7c28d..6161091906 100644 --- a/backend/core/src/listings/dto/listing.dto.ts +++ b/backend/core/src/listings/dto/listing.dto.ts @@ -35,6 +35,7 @@ import { ApplicationMethodDto } from "../../application-methods/dto/application- import { ListingReviewOrder } from "../types/listing-review-order-enum" import { ListingEventType } from "../types/listing-event-type-enum" import { ListingEventCreateDto, ListingEventDto, ListingEventUpdateDto } from "./listing-event.dto" +import { UnitsSummaryDto } from "../../units-summary/dto/units-summary.dto" export class ListingDto extends OmitType(Listing, [ "applicationAddress", @@ -52,6 +53,7 @@ export class ListingDto extends OmitType(Listing, [ "property", "reservedCommunityType", "result", + "unitsSummary", ] as const) { @Expose() @IsDefined({ groups: [ValidationsGroupsEnum.default] }) @@ -320,6 +322,13 @@ export class ListingDto extends OmitType(Listing, [ ) yearBuilt?: number | null + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) + @Type(() => UnitsSummaryDto) + unitsSummary?: UnitsSummaryDto[] | null + + // TO BE DEPRECATED @Expose() @IsDefined({ groups: [ValidationsGroupsEnum.default] }) @ValidateNested({ groups: [ValidationsGroupsEnum.default] }) diff --git a/backend/core/src/listings/entities/listing.entity.ts b/backend/core/src/listings/entities/listing.entity.ts index 0232c61cb6..31d61f6178 100644 --- a/backend/core/src/listings/entities/listing.entity.ts +++ b/backend/core/src/listings/entities/listing.entity.ts @@ -42,6 +42,7 @@ import { ListingApplicationAddressType } from "../types/listing-application-addr import { ListingEvent } from "./listing-event.entity" import { Address } from "../../shared/entities/address.entity" import { ApplicationMethod } from "../../application-methods/entities/application-method.entity" +import { UnitsSummary } from "../../units-summary/entities/units-summary.entity" @Entity({ name: "listings" }) class Listing extends BaseEntity { @@ -457,6 +458,16 @@ class Listing extends BaseEntity { @IsOptional({ groups: [ValidationsGroupsEnum.default] }) @IsNumber({}, { groups: [ValidationsGroupsEnum.default] }) waitlistOpenSpots?: number | null + + @OneToMany(() => UnitsSummary, (summary) => summary.listing, { + eager: true, + nullable: true, + cascade: true, + }) + @Expose() + @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) + @Type(() => UnitsSummary) + unitsSummary?: UnitsSummary[] | null } export { Listing as default, Listing } diff --git a/backend/core/src/listings/listings.service.ts b/backend/core/src/listings/listings.service.ts index ad43a85495..7a7942f837 100644 --- a/backend/core/src/listings/listings.service.ts +++ b/backend/core/src/listings/listings.service.ts @@ -56,6 +56,7 @@ export class ListingsService { .createQueryBuilder("listings") .select("listings.id", "listings_id") .leftJoin("listings.property", "property") + .leftJoin("listings.units_summary", "units_summary") .groupBy("listings.id") .orderBy({ "listings.id": "DESC" }) diff --git a/backend/core/src/migration/1628714025901-listings-units-summary.ts b/backend/core/src/migration/1628714025901-listings-units-summary.ts new file mode 100644 index 0000000000..a9b98f4365 --- /dev/null +++ b/backend/core/src/migration/1628714025901-listings-units-summary.ts @@ -0,0 +1,20 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class listingsUnitsSummary1628714025901 implements MigrationInterface { + name = 'listingsUnitsSummary1628714025901' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "units_summary" DROP CONSTRAINT "FK_a2b6519fc3d102d4611a0e2b879"`); + await queryRunner.query(`ALTER TABLE "units_summary" RENAME COLUMN "property_id" TO "listing_id"`); + await queryRunner.query(`ALTER TABLE "units_summary" RENAME CONSTRAINT "PK_dd5b004243c1536a412e425a9ec" TO "PK_0ea6bb34382cb45f6b3280f50f2"`); + await queryRunner.query(`ALTER TABLE "units_summary" ADD CONSTRAINT "FK_4edda29192dbc0c6a18e15437a0" FOREIGN KEY ("listing_id") REFERENCES "listings"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "units_summary" DROP CONSTRAINT "FK_4edda29192dbc0c6a18e15437a0"`); + await queryRunner.query(`ALTER TABLE "units_summary" RENAME CONSTRAINT "PK_0ea6bb34382cb45f6b3280f50f2" TO "PK_dd5b004243c1536a412e425a9ec"`); + await queryRunner.query(`ALTER TABLE "units_summary" RENAME COLUMN "listing_id" TO "property_id"`); + await queryRunner.query(`ALTER TABLE "units_summary" ADD CONSTRAINT "FK_a2b6519fc3d102d4611a0e2b879" FOREIGN KEY ("property_id") REFERENCES "property"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + +} diff --git a/backend/core/src/units-summary/entities/units-summary.entity.ts b/backend/core/src/units-summary/entities/units-summary.entity.ts index 32060bc343..9a17ac20dd 100644 --- a/backend/core/src/units-summary/entities/units-summary.entity.ts +++ b/backend/core/src/units-summary/entities/units-summary.entity.ts @@ -1,10 +1,10 @@ import { Column, Entity, ManyToOne, PrimaryColumn } from "typeorm" import { IsNumber, IsNumberString, IsOptional, IsString, ValidateNested } from "class-validator" import { Expose, Type } from "class-transformer" -import { Property } from "../../property/entities/property.entity" import { ValidationsGroupsEnum } from "../../shared/types/validations-groups-enum" import { UnitType } from "../../unit-types/entities/unit-type.entity" import { UnitAccessibilityPriorityType } from "../../unit-accessbility-priority-types/entities/unit-accessibility-priority-type.entity" +import { Listing } from "../..//listings/entities/listing.entity" @Entity({ name: "units_summary" }) class UnitsSummary { @@ -15,8 +15,8 @@ class UnitsSummary { @Type(() => UnitType) unitType: UnitType - @ManyToOne(() => Property, { primary: true, eager: true }) - property: Property + @ManyToOne(() => Listing, (listing) => listing.unitsSummary, { primary: true }) + listing: Listing @PrimaryColumn() @Expose()