Untitled

 avatar
unknown
plain_text
2 months ago
6.5 kB
7
Indexable
import { Injectable } from '@nestjs/common';
import { ZgApiLogger } from '@ziwig/nest-core';
import {
  Error,
  PaginationOptions,
  PaginationResult,
  UseCase,
} from '@ziwig/types';
import { IDomain } from 'apps/my-api/src/domains/_business/domain/domain.model';
import { DomainService } from 'apps/my-api/src/domains/_business/domain/domain.service';
import { IDomainConfigTrait } from 'apps/my-api/src/domains/_business/domain-config-trait/domain-config-trait.model';
import { SearchDomainRequestDTO } from '../../../domains/_use-cases/get-domains/request.dto';

@Injectable()
export class GetWorklistConfigUseCase
  implements
    UseCase<
      SearchDomainRequestDTO & PaginationOptions,
      Promise<
        | {
            name: string;
            type?: string;
            wording_en: string;
            wording_fr: string;
            group: string;
          }[]
        | Error
      >
    >
{
  constructor(
    private readonly domainService: DomainService,
    private readonly logger: ZgApiLogger,
  ) {
    this.logger.context = GetWorklistConfigUseCase.name;
  }

  async run(data: SearchDomainRequestDTO & PaginationOptions): Promise<
    | {
        group: string;
        name: string;
        type?: string;
        wording_en: string;
        wording_fr: string;
      }[]
    | Error
  > {
    const logCtx = this.run.name;
    this.logger.info(`Get worklist config initiated`, logCtx);
    this.logger.info(`Getting domains`, logCtx);

    if (data?.oid === 'clinique')
      return [
        {
          group: 'centers',
          name: 'sector',
          wording_en: 'Sector',
          wording_fr: 'Filière',
        },
        {
          group: 'centers',
          name: 'id',
          wording_en: 'Id',
          wording_fr: 'Id',
        },
        {
          group: 'centers',
          name: 'id_unite',
          wording_en: 'Center Id',
          wording_fr: 'Id Centre',
        },
        {
          group: 'centers',
          name: 'name',
          wording_en: 'Center Name',
          wording_fr: 'Nom du centre',
        },
        {
          group: 'centers',
          name: 'level',
          wording_en: 'Level',
          wording_fr: 'Niveau',
        },
        {
          group: 'centers',
          name: 'phone',
          wording_en: 'Phone Number',
          wording_fr: 'Numéro de téléphone',
        },
        {
          group: 'centers',
          name: 'email',
          wording_en: 'Email',
          wording_fr: 'Email',
        },
        {
          group: 'centers',
          name: 'status',
          type: 'icon',
          wording_en: 'Status',
          wording_fr: 'Etat',
        },
      ];

    const result = await this.domainService.getDomains(data);
    const value = result.getValue() as PaginationResult<IDomain> | IDomain[];
    if (result?.isFailure) {
      throw result?.getValue() as Error;
    } else {
      let domains: IDomain[] = [];

      if (data?.oid == 'identities vigilance' || data?.oid == 'identities')
        domains = value as IDomain[];
      else domains = (value as PaginationResult<IDomain>).data;
      let worklistConfigTraits = [];
      for (const domain of domains) {
        worklistConfigTraits = [
          ...worklistConfigTraits,
          ...(domain?.config?.traits?.map((element: IDomainConfigTrait) => {
            if (
              worklistConfigTraits?.some((conf) => element.trait.id == conf?.id)
            )
              return undefined;
            return {
              group: element.type,
              name: element.trait.label?.label,
              wording_en: (
                element.trait.label?.translations['en-US'] || ''
              )?.toLowerCase(),
              wording_fr: (
                element.trait.label?.translations['fr-FR'] || ''
              )?.toLowerCase(),
              id: element.trait.id,
            };
          }) || []),
        ];
      }

      return [
        ...worklistConfigTraits,
        {
          group: 'indicators',
          name: 'indicator',
          wording_en: 'indicator',
          wording_fr: 'indicateur',
        },
        {
          group: 'score',
          name: 'score',
          wording_en: 'score',
          wording_fr: 'score',
        },
        {
          group: 'version',
          name: 'version',
          wording_en: 'version',
          wording_fr: 'version',
        },
        {
          group: 'IPP',
          name: 'IPP',
          wording_en: 'IPP',
          wording_fr: 'IPP',
        },
        {
          name: 'state',
          group: 'State',
          type: 'icon',
          wording_en: 'state',
          wording_fr: 'état',
        },
        {
          name: 'dossier',
          group: 'Dossier',
          type: 'icon',
          wording_en: 'folder',
          wording_fr: 'dossier',
        },
        {
          group: 'care-circle',
          name: 'name',
          wording_en: 'name',
          wording_fr: 'nom',
        },
        {
          group: 'care-circle',
          wording: 'Profession/Spécialité',
          name: 'properties.profession.label',
          wording_en: 'profession',
          wording_fr: 'profession',
        },
        {
          group: 'care-circle',
          name: 'phone',
          wording_en: 'phone',
          wording_fr: 'numéro de téléphone',
        },
        {
          group: 'care-circle',
          name: 'email',
          wording_en: 'email',
          wording_fr: 'email',
        },
        {
          group: 'care-circle',
          name: 'role',
          type: 'dropDown',
          wording_en: 'role',
          wording_fr: 'rôle',
        },
        {
          group: 'care-circle',
          name: 'indicators',
          type: 'icon',
          wording_en: 'indicator',
          wording_fr: 'indicateur',
        },
        {
          group: 'pseudonym',
          name: 'pseudonym',
          wording_en: 'pseudonym',
          wording_fr: 'pseudonyme',
        },
      ]
        ?.filter((element) => element)
        ?.map(({ group, name, type, wording_fr, wording_en }) => ({
          group,
          name,
          wording_en,
          wording_fr,
          type,
        }));
    }
  }
}
Editor is loading...
Leave a Comment