From b8d7e288c3c7c8fb72ec9b4e9fbf1a75a5d42dee Mon Sep 17 00:00:00 2001 From: Marcin Jedras Date: Tue, 13 Jul 2021 00:17:00 +0200 Subject: [PATCH] Fix flagged query + changelog --- CHANGELOG.md | 1 + .../src/applications/applications.service.ts | 31 ++++++++++++------- .../entities/application.entity.ts | 1 + 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d003a2cf0..fc7b32ac9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. The format - Fixed: - optional fields not being marked as optional in frontend client (missing '?' indicator) ([#1470](https://github.com/bloom-housing/bloom/pull/1470)) + - add duplicates to CSV export ([#1352](https://github.com/bloom-housing/bloom/issues/1352)) - Changed: - User module has been removed and incorporated into Auth module diff --git a/backend/core/src/applications/applications.service.ts b/backend/core/src/applications/applications.service.ts index 28c4a78058..9d91ff1d2c 100644 --- a/backend/core/src/applications/applications.service.ts +++ b/backend/core/src/applications/applications.service.ts @@ -45,28 +45,35 @@ export class ApplicationsService { public async listWithFlagged(params: PaginatedApplicationListQueryParams) { const qb = this._getQb(params) - const result = await qb + const result = await qb.getMany() + + // Get flagged applications + const flaggedQuery = await this.repository + .createQueryBuilder("applications") .leftJoin( "application_flagged_set_applications_applications", "application_flagged_set_applications_applications", - "application_flagged_set_applications_applications.applications_id = application.id" - ) - .groupBy( - "application.id, applicant.id, applicant_address.id, applicant_workAddress.id, alternateAddress.id, mailingAddress.id, alternateContact.id, alternateContact_mailingAddress.id, accessibility.id, demographics.id, householdMembers.id, householdMembers_address.id, householdMembers_workAddress.id, application_flagged_set_applications_applications.application_flagged_set_id, application_flagged_set_applications_applications.applications_id" + "application_flagged_set_applications_applications.applications_id = applications.id" ) - .addSelect( - "count(application_flagged_set_applications_applications.applications_id) > 0 as flagged" + .andWhere("applications.listing_id = :lid", { lid: params.listingId }) + .select( + "applications.id, count(application_flagged_set_applications_applications.applications_id) > 0 as flagged" ) + .groupBy("applications.id") .getRawAndEntities() - let index = 0 + + // Reorganize flagged to object to make it faster to map + const flagged = flaggedQuery.raw.reduce((obj, application) => { + return { ...obj, [application.id]: application.flagged } + }, {}) await Promise.all( - result.entities.map(async (application) => { - application.flagged = result.raw[index].flagged + result.map(async (application) => { + // Because TypeOrm can't map extra flagged field we need to map it manually + application.flagged = flagged[application.id] await this.authorizeUserAction(this.req.user, application, authzActions.read) - index += 1 }) ) - return result.entities + return result } async listPaginated( diff --git a/backend/core/src/applications/entities/application.entity.ts b/backend/core/src/applications/entities/application.entity.ts index 6a64f928cd..dad9d9a40b 100644 --- a/backend/core/src/applications/entities/application.entity.ts +++ b/backend/core/src/applications/entities/application.entity.ts @@ -243,6 +243,7 @@ export class Application extends AbstractEntity { @IsBoolean({ groups: [ValidationsGroupsEnum.default] }) markedAsDuplicate: boolean + // This is a 'virtual field' needed for CSV export @Expose() @IsBoolean({ groups: [ValidationsGroupsEnum.default] }) @IsOptional({ groups: [ValidationsGroupsEnum.partners] })