private consolidateStaleData()

in pathology/viewer/src/services/orchestrator.service.ts [241:369]


  private consolidateStaleData(
    request: UpdatePathologyCohortRequest,
    cohort: PathologyCohort,
    latestCohort: PathologyCohort,
  ): PathologyCohort {
    latestCohort = JSON.parse(JSON.stringify(latestCohort)) as PathologyCohort;
    if (!request.pathologyCohort || !latestCohort.cohortMetadata) {
      return latestCohort;
    }

    switch (request.updateMask) {
      case 'displayName':
        latestCohort.cohortMetadata.displayName =
          request.pathologyCohort?.cohortMetadata?.displayName;
        break;
      case 'description':
        latestCohort.cohortMetadata.description =
          request.pathologyCohort?.cohortMetadata?.description;
        break;
      case 'cohortMetadata':
        latestCohort.cohortMetadata = {
          ...request.pathologyCohort.cohortMetadata,
          ...{ updateTime: latestCohort?.cohortMetadata?.updateTime } as
          PathologyCohortMetadata,
        };
        break;
      case 'slides':
        let addedSlides: PathologySlide[] = [];
        let removedSlides: PathologySlide[] = [];
        const originalSlidesDicomUri = new Set<string>(
          (cohort?.slides ?? []).map((slide) => slide.dicomUri!));
        const updatedSlidesDicomUri =
          new Set<string>((request.pathologyCohort.slides ??
            []).map((slide) => slide.dicomUri!));

        removedSlides = (cohort?.slides ?? []).filter((slide) => {
          return slide.dicomUri ? !updatedSlidesDicomUri.has(slide.dicomUri) :
            false;
        });
        addedSlides = (request.pathologyCohort.slides ?? []).filter((slide) => {
          return slide.dicomUri ? !originalSlidesDicomUri.has(slide.dicomUri) :
            false;
        });

        if (addedSlides.length) {
          latestCohort.slides =
            [...(latestCohort.slides ?? []), ...addedSlides];
        }
        if (removedSlides.length) {
          const removedSlidesDicomUri =
            new Set(removedSlides.map((slide) => slide.dicomUri!));
          latestCohort.slides = (latestCohort.slides ?? []).filter((slide) => {
            return slide.dicomUri ? !removedSlidesDicomUri.has(slide.dicomUri) :
              false;
          });
        }
        break;
      case 'userAccess':
        const updatedUsersByEmail =
          new Map((request.pathologyCohort.userAccess ?? []).map((user) => {
            return [user.userEmail, user];
          }));
        const originalUsersByEmail =
          new Map((cohort?.userAccess ?? []).map((user) => {
            return [user.userEmail, user];
          }));

        let addedUsersByEmail = new Map<string, PathologyUserAccess>();
        let removedUsersByEmail = new Map<string, PathologyUserAccess>();
        addedUsersByEmail =
          new Map((request.pathologyCohort.userAccess ?? [])
            .filter((user) => {
              const originalUser =
                originalUsersByEmail.get(user.userEmail);
              if (!originalUser) return true;

              return !(
                originalUser.userEmail === user.userEmail &&
                originalUser.accessRole === user.accessRole);
            })
            .map((user) => {
              return [user.userEmail ?? '', user];
            }));

        removedUsersByEmail =
          new Map((cohort?.userAccess ?? [])
            .filter((user) => {
              const updatedUser =
                updatedUsersByEmail.get(user.userEmail);
              if (!updatedUser) return true;

              return !(
                updatedUser.userEmail === user.userEmail &&
                updatedUser.accessRole === user.accessRole);
            })
            .map((user) => {
              return [user.userEmail ?? '', user];
            }));

        if (addedUsersByEmail.size) {
          if (latestCohort.userAccess) {
            for (let index = 0; index < (latestCohort.userAccess ?? []).length;
              index++) {
              const user = latestCohort.userAccess[index];
              if (user.userEmail && addedUsersByEmail.has(user.userEmail)) {
                latestCohort.userAccess[index] =
                  addedUsersByEmail.get(user.userEmail)!;
                addedUsersByEmail.delete(user.userEmail);
              }
            }
          }
          latestCohort.userAccess = [
            ...(latestCohort.userAccess ?? []),
            ...addedUsersByEmail.values(),
          ];
        }
        if (removedUsersByEmail.size) {
          latestCohort.userAccess = (latestCohort.userAccess ??
            []).filter((user) => {
              return user.userEmail ? removedUsersByEmail.has(user.userEmail) :
                false;
            });
        }
        break;
      default:
    }

    return latestCohort;
  }