From da49cd442019926f6fe60c9a4a23cb3add325a53 Mon Sep 17 00:00:00 2001 From: Alejandro Guzman Date: Fri, 24 Jul 2026 11:32:38 -0500 Subject: [PATCH] 5758 - Rename DescriptionIdentifier to CommentableDescriptionKey --- src/meta/assessment/descriptionValue/index.ts | 7 ++---- src/meta/cycleData/links/descriptionLink.ts | 3 ++- .../controller/cycleData/links/update.ts | 14 +++++------ .../dataValidation/validateDescriptions.ts | 6 ++--- .../enqueueDescriptionLinksValidation.ts | 4 ++-- .../utils/buildCountryLinks.ts | 14 +++++------ .../visitDescriptionLinks/props.ts | 4 ++-- .../utils/buildDescriptionLinks.ts | 23 ++++++++----------- .../visitDescriptionLinks/worker.ts | 8 +++---- 9 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/meta/assessment/descriptionValue/index.ts b/src/meta/assessment/descriptionValue/index.ts index f3516f8517..166d5150ff 100644 --- a/src/meta/assessment/descriptionValue/index.ts +++ b/src/meta/assessment/descriptionValue/index.ts @@ -21,16 +21,13 @@ export interface CommentableDescriptionValue { export interface CommentableDescription { id: number countryIso: CountryIso - sectionName: string + sectionName: SectionName sectionUuid?: UUID name: CommentableDescriptionName value: CommentableDescriptionValue } -export type DescriptionIdentifier = { - name: CommentableDescriptionName - sectionName: SectionName -} +export type CommentableDescriptionKey = Pick export type DescriptionValues = Record export type DescriptionSectionValues = Record diff --git a/src/meta/cycleData/links/descriptionLink.ts b/src/meta/cycleData/links/descriptionLink.ts index 01648fc421..744f51c506 100644 --- a/src/meta/cycleData/links/descriptionLink.ts +++ b/src/meta/cycleData/links/descriptionLink.ts @@ -1,4 +1,5 @@ import { CommentableDescriptionName } from 'meta/assessment/descriptionValue' +import { SectionName } from 'meta/assessment/section' import { LinkLocationBase } from 'meta/cycleData/links/linkLocationBase' export const DescriptionLinkLocationPath = { @@ -10,7 +11,7 @@ export type DescriptionLinkLocation = LinkLocationBase & { colName: string descriptionName: CommentableDescriptionName path: Array - sectionName: string + sectionName: SectionName uuid?: string } diff --git a/src/server/controller/cycleData/links/update.ts b/src/server/controller/cycleData/links/update.ts index 784b33606d..6670732d1c 100644 --- a/src/server/controller/cycleData/links/update.ts +++ b/src/server/controller/cycleData/links/update.ts @@ -2,7 +2,7 @@ import { CountryIso } from 'meta/area/countryIso' import { ActivityLogMessage } from 'meta/assessment/activityLog' import { Assessment } from 'meta/assessment/assessment' import { Cycle } from 'meta/assessment/cycle' -import { DescriptionIdentifier } from 'meta/assessment/descriptionValue' +import { CommentableDescriptionKey } from 'meta/assessment/descriptionValue' import { Link } from 'meta/cycleData/links/link' import { Links } from 'meta/cycleData/links/links' import { NDPLinkTarget } from 'meta/cycleData/links/nationalDataPointLink' @@ -44,13 +44,11 @@ export const update = async (props: Props): Promise => { const descriptionLocations = updatedLink.locations.filter(Links.isDescriptionLocation) if (!Objects.isEmpty(descriptionLocations)) { const { countryIso } = updatedLink - const descriptionIdentifiers = descriptionLocations.map( - ({ descriptionName, sectionName }) => ({ - name: descriptionName, - sectionName, - }) - ) - await LinksService.enqueueDescriptionLinksValidation({ assessment, countryIso, cycle, descriptionIdentifiers }) + const descriptionKeys = descriptionLocations.map(({ descriptionName, sectionName }) => ({ + name: descriptionName, + sectionName, + })) + await LinksService.enqueueDescriptionLinksValidation({ assessment, countryIso, cycle, descriptionKeys }) } // If the link has national data point locations, we trigger the flow that updates the ndp validation cache. diff --git a/src/server/service/dataValidation/validateDescriptions.ts b/src/server/service/dataValidation/validateDescriptions.ts index 7e79a20951..06856d8633 100644 --- a/src/server/service/dataValidation/validateDescriptions.ts +++ b/src/server/service/dataValidation/validateDescriptions.ts @@ -1,7 +1,7 @@ import { Country } from 'meta/area/country' import { Assessment } from 'meta/assessment/assessment' import { Cycle } from 'meta/assessment/cycle' -import { CommentableDescription, DescriptionIdentifier } from 'meta/assessment/descriptionValue' +import { CommentableDescription, CommentableDescriptionKey } from 'meta/assessment/descriptionValue' import { LinksService } from 'server/service/links' @@ -22,7 +22,7 @@ export const validateDescriptions = async (props: Props): Promise => { // Validate data source fields first (not in parallel) to avoid cache race conditions. await validateDataSources({ assessment, country, cycle, descriptions, notifyClients }) - const descriptionIdentifiers = descriptions.map(({ name, sectionName }) => ({ + const descriptionKeys = descriptions.map(({ name, sectionName }) => ({ name, sectionName, })) @@ -31,7 +31,7 @@ export const validateDescriptions = async (props: Props): Promise => { assessment, countryIso, cycle, - descriptionIdentifiers, + descriptionKeys, notifyClients, }) } diff --git a/src/server/service/links/enqueueDescriptionLinksValidation.ts b/src/server/service/links/enqueueDescriptionLinksValidation.ts index 37d41d2cfc..da67ba2f51 100644 --- a/src/server/service/links/enqueueDescriptionLinksValidation.ts +++ b/src/server/service/links/enqueueDescriptionLinksValidation.ts @@ -5,9 +5,9 @@ import { enqueueVerifyLinksJob } from 'server/worker/tasks/verifyLinks/utils/enq import { VerifyDescriptionLinksJobProps } from 'server/worker/tasks/verifyLinks/visitDescriptionLinks/props' export const enqueueDescriptionLinksValidation = async (props: VerifyDescriptionLinksJobProps): Promise => { - const { descriptionIdentifiers } = props + const { descriptionKeys } = props - if (Objects.isEmpty(descriptionIdentifiers)) return + if (Objects.isEmpty(descriptionKeys)) return await enqueueVerifyLinksJob(VerifyLinksJobName.verifyDescriptionLinks, props) } diff --git a/src/server/worker/tasks/verifyLinks/visitCycleLinks/utils/buildCountryLinks.ts b/src/server/worker/tasks/verifyLinks/visitCycleLinks/utils/buildCountryLinks.ts index 6e5d4a939b..917a67dbd1 100644 --- a/src/server/worker/tasks/verifyLinks/visitCycleLinks/utils/buildCountryLinks.ts +++ b/src/server/worker/tasks/verifyLinks/visitCycleLinks/utils/buildCountryLinks.ts @@ -3,9 +3,9 @@ import { Assessment } from 'meta/assessment/assessment' import { Cycle } from 'meta/assessment/cycle' import { CommentableDescription, + CommentableDescriptionKey, CommentableDescriptionName, DescriptionCountryValues, - DescriptionIdentifier, } from 'meta/assessment/descriptionValue' import { OriginalDataPoint } from 'meta/assessment/originalDataPoint' import { SectionNames } from 'meta/assessment/section' @@ -31,19 +31,19 @@ export type CountryLinks = { nationalDataPointTargets: Array } -type GetDescriptionIdentifiersProps = { +type GetDescriptionKeysProps = { countryIso: CountryIso descriptionValues: DescriptionCountryValues } -const _getDescriptionIdentifiers = (props: GetDescriptionIdentifiersProps): Array => { +const _getDescriptionKeys = (props: GetDescriptionKeysProps): Array => { const { countryIso, descriptionValues } = props - return Object.entries(descriptionValues[countryIso] ?? {}).flatMap( + return Object.entries(descriptionValues[countryIso] ?? {}).flatMap( ([sectionName, sectionValues]) => { // NDP data sources are stored as descriptions, but their links belong to the NDP flow. if (sectionName === SectionNames.nationalDataPoint) return [] - return Object.keys(sectionValues).map((name) => ({ + return Object.keys(sectionValues).map((name) => ({ name: name as CommentableDescriptionName, sectionName, })) @@ -54,12 +54,12 @@ const _getDescriptionIdentifiers = (props: GetDescriptionIdentifiersProps): Arra export const buildCountryLinks = (props: Props): CountryLinks => { const { assessment, countryIso, cycle, descriptionValues, nationalDataPoints } = props - const descriptionIdentifiers = _getDescriptionIdentifiers({ countryIso, descriptionValues }) + const descriptionKeys = _getDescriptionKeys({ countryIso, descriptionValues }) const { descriptions, linksToVisit: descriptionLinksToVisit } = buildDescriptionLinks({ assessment, countryIso, cycle, - descriptionIdentifiers, + descriptionKeys, descriptionValues, }) diff --git a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/props.ts b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/props.ts index 9871cefe70..73043dbb89 100644 --- a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/props.ts +++ b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/props.ts @@ -3,7 +3,7 @@ import { Job } from 'bullmq' import { CountryIso } from 'meta/area/countryIso' import { Assessment } from 'meta/assessment/assessment' import { Cycle } from 'meta/assessment/cycle' -import { DescriptionIdentifier } from 'meta/assessment/descriptionValue' +import { CommentableDescriptionKey } from 'meta/assessment/descriptionValue' import { VerifyLinksJobName } from 'server/worker/tasks/verifyLinks/jobNames' @@ -11,7 +11,7 @@ export type VerifyDescriptionLinksJobProps = { assessment: Assessment countryIso: CountryIso cycle: Cycle - descriptionIdentifiers: Array + descriptionKeys: Array notifyClients?: boolean } diff --git a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/utils/buildDescriptionLinks.ts b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/utils/buildDescriptionLinks.ts index 596ea3edc8..3ea4db789b 100644 --- a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/utils/buildDescriptionLinks.ts +++ b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/utils/buildDescriptionLinks.ts @@ -3,8 +3,8 @@ import { Assessment } from 'meta/assessment/assessment' import { Cycle } from 'meta/assessment/cycle' import { CommentableDescription, + CommentableDescriptionKey, DescriptionCountryValues, - DescriptionIdentifier, } from 'meta/assessment/descriptionValue' import { DescriptionLinkLocationPath } from 'meta/cycleData/links/descriptionLink' import { LinkToVisit } from 'meta/cycleData/links/link' @@ -16,7 +16,7 @@ type Props = { assessment: Assessment countryIso: CountryIso cycle: Cycle - descriptionIdentifiers: Array + descriptionKeys: Array descriptionValues: DescriptionCountryValues } @@ -26,18 +26,15 @@ type Returned = { } export const buildDescriptionLinks = (props: Props): Returned => { - const { assessment, countryIso, cycle, descriptionIdentifiers, descriptionValues } = props + const { assessment, countryIso, cycle, descriptionKeys, descriptionValues } = props - const descriptions = descriptionIdentifiers.reduce>>( - (acc, descriptionIdentifier) => { - const { name, sectionName } = descriptionIdentifier - const value = descriptionValues[countryIso]?.[sectionName]?.[name] - if (Objects.isEmpty(value)) return acc - acc.push({ countryIso, name, sectionName, value }) - return acc - }, - [] - ) + const descriptions = descriptionKeys.reduce>>((acc, descriptionKey) => { + const { name, sectionName } = descriptionKey + const value = descriptionValues[countryIso]?.[sectionName]?.[name] + if (Objects.isEmpty(value)) return acc + acc.push({ countryIso, name, sectionName, value }) + return acc + }, []) const linksToVisit = descriptions.flatMap((description) => { const { name: descriptionName, sectionName, value } = description diff --git a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/worker.ts b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/worker.ts index e6ca246066..b097f430ef 100644 --- a/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/worker.ts +++ b/src/server/worker/tasks/verifyLinks/visitDescriptionLinks/worker.ts @@ -20,25 +20,25 @@ export default async (job: VerifyDescriptionLinksJob): Promise => { const logKey = _getLogKey(job) try { - const { assessment, countryIso, cycle, descriptionIdentifiers, notifyClients = true } = job.data + const { assessment, countryIso, cycle, descriptionKeys, notifyClients = true } = job.data const commonProps = { assessment, countryIso, cycle } const time = new Date().getTime() Logger.info(`${logKey} started.`) - const sectionNames = Array.from(new Set(descriptionIdentifiers.map(({ sectionName }) => sectionName))) + const sectionNames = Array.from(new Set(descriptionKeys.map(({ sectionName }) => sectionName))) const descriptionValues = await DescriptionRepository.getValues({ assessment, countryISOs: [countryIso], cycle, - names: descriptionIdentifiers.map(({ name }) => name), + names: descriptionKeys.map(({ name }) => name), sectionNames, }) const { descriptions, linksToVisit } = buildDescriptionLinks({ ...commonProps, - descriptionIdentifiers, + descriptionKeys, descriptionValues, })