Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add tracker compatibility for version 41 #63

Merged
merged 9 commits into from
Jan 14, 2025
30 changes: 30 additions & 0 deletions src/data/common/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { MetadataItem } from "$/domain/entities/MetadataItem";
import { Id } from "$/domain/entities/Ref";
import { TrackedEntitiesGetResponse } from "$/types/d2-api";
import { TrackerEventsResponse } from "@eyeseetea/d2-api/api/trackerEvents";

export function getProgramStageIndexById(programStageId: Id, metadata: MetadataItem): number {
const programStageIndex = metadata.programs.qualityIssues.programStages.findIndex(
Expand All @@ -8,3 +10,31 @@ export function getProgramStageIndexById(programStageId: Id, metadata: MetadataI
if (programStageIndex === -1) throw Error(`Cannot found programStage: ${programStageId}`);
return programStageIndex;
}

export function buildTrackerResponse(
response: TrackedEntitiesGetResponse & {
trackedEntities?: TrackedEntitiesGetResponse["instances"];
}
): TrackedEntitiesGetResponse {
if (!response.instances && response.trackedEntities) {
return { ...response, instances: response.trackedEntities };
} else if (!response.trackedEntities && response.instances) {
return response;
} else {
return response;
}
}

export function buildTrackerEventsResponse(
response: TrackerEventsResponse & {
events?: TrackerEventsResponse["instances"];
}
): TrackerEventsResponse {
if (!response.instances && response.events) {
return { ...response, instances: response.events };
} else if (!response.events && response.instances) {
return response;
} else {
return response;
}
}
13 changes: 9 additions & 4 deletions src/data/repositories/IssueD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ import { Maybe } from "$/utils/ts-utils";
import { IssueAction } from "$/domain/entities/IssueAction";
import { IssueStatus } from "$/domain/entities/IssueStatus";
import { getDefaultModules } from "$/data/common/D2Module";
import { getProgramStageIndexById } from "$/data/common/utils";
import {
buildTrackerEventsResponse,
buildTrackerResponse,
getProgramStageIndexById,
} from "$/data/common/utils";

export class IssueD2Repository implements IssueRepository {
d2DataElement: D2DataElement;
Expand Down Expand Up @@ -61,7 +65,7 @@ export class IssueD2Repository implements IssueRepository {
event: filters.id ? filters.id : undefined,
})
).flatMap(d2Response => {
const instances = d2Response.instances;
const instances = buildTrackerEventsResponse(d2Response).instances;
const orgUnitIds = this.getRelatedIdsFromDataValues(
instances,
this.getDataElementIdOrThrow("country")
Expand Down Expand Up @@ -100,7 +104,7 @@ export class IssueD2Repository implements IssueRepository {
event: id ? id : undefined,
})
).flatMap(d2Response => {
const d2Event = d2Response.instances[0];
const d2Event = buildTrackerEventsResponse(d2Response).instances[0];
if (!d2Event) return Future.error(new Error(`Cannot found event: ${id}`));

const orgUnitIds = this.getRelatedIdsFromDataValues(
Expand Down Expand Up @@ -146,7 +150,8 @@ export class IssueD2Repository implements IssueRepository {
trackedEntity: analysisId,
})
).flatMap(d2Response => {
const tei = d2Response.instances.find(tei => tei.trackedEntity === analysisId);
const instances = buildTrackerResponse(d2Response).instances;
const tei = instances.find(tei => tei.trackedEntity === analysisId);
if (!tei) return Future.error(new Error(`Cannot found TEI: ${tei}`));
const enrollment = _(tei.enrollments || []).first();
if (!enrollment)
Expand Down
11 changes: 5 additions & 6 deletions src/data/repositories/QualityAnalysisD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import { D2OrgUnit } from "$/data/common/D2Country";
import { getUid } from "$/utils/uid";
import { DATA_QUALITY_NAMESPACE } from "$/domain/entities/Settings";
import { getDefaultModules } from "$/data/common/D2Module";
import { getProgramStageIndexById } from "$/data/common/utils";
import { buildTrackerResponse, getProgramStageIndexById } from "$/data/common/utils";

export class QualityAnalysisD2Repository implements QualityAnalysisRepository {
d2DataElement: D2DataElement;
Expand Down Expand Up @@ -67,8 +67,8 @@ export class QualityAnalysisD2Repository implements QualityAnalysisRepository {
totalPages: true,
})
).flatMap(d2Response => {
const instances = d2Response.instances;
const teiIds = _(d2Response.instances)
const instances = buildTrackerResponse(d2Response).instances;
const teiIds = _(instances)
.map(instance => instance.trackedEntity)
.compact()
.value();
Expand Down Expand Up @@ -240,10 +240,9 @@ export class QualityAnalysisD2Repository implements QualityAnalysisRepository {
trackedEntity: qaIds.join(";"),
})
).flatMap(d2Response => {
const instances = buildTrackerResponse(d2Response).instances;
const qualityAnalysisToPost = qaIds.map(qaId => {
const existingTei = d2Response.instances.find(
d2Tei => d2Tei.trackedEntity === qaId
);
const existingTei = instances.find(d2Tei => d2Tei.trackedEntity === qaId);
const qAnalysis = qualityAnalysis.find(qai => qai.id === qaId);
if (!qAnalysis) {
throw Error(`Cannot find qualityAnalysis: ${qaId}`);
Expand Down
8 changes: 5 additions & 3 deletions src/domain/usecases/RunOutlierUseCase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export class RunOutlierUseCase {
analysis.startDate,
analysis.endDate,
analysis.countriesAnalysis,
dataElements.map(dataElement => dataElement.id)
dataElements.map(dataElement => dataElement.id),
analysis.module.id
).flatMap(outliers => {
return this.issueUseCase
.getTotalIssuesBySection(analysis, options.sectionId)
Expand Down Expand Up @@ -75,7 +76,8 @@ export class RunOutlierUseCase {
startDate: string,
endDate: string,
countryIds: Id[],
dataElements: Id[]
dataElements: Id[],
moduleId: Id
): FutureData<Outlier[]> {
const $requests = _(dataElements)
.chunk(100)
Expand All @@ -85,7 +87,7 @@ export class RunOutlierUseCase {
countryIds: countryIds,
endDate: endDate,
startDate: startDate,
moduleId: undefined,
moduleId: moduleId,
threshold: options.threshold,
dataElementIds: dataElementsIds,
});
Expand Down
Loading