Skip to content

Commit

Permalink
Merge pull request #3503 from incubateur-ademe/backend-domain-archite…
Browse files Browse the repository at this point in the history
…cture

Refacto de la partie indicateurs du backend pour éviter les duplicats dans le package api.
  • Loading branch information
farnoux authored Jan 6, 2025
2 parents 2c08c6c + 38475cb commit aede168
Show file tree
Hide file tree
Showing 97 changed files with 811 additions and 913 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { Referentiel } from '@/api/referentiel/domain/enum.schema';
import { referentielToName } from '@/app/app/labels';
import AccueilCard from '@/app/app/pages/collectivite/EtatDesLieux/Accueil/EtatDesLieux/AccueilCard';
import { makeCollectiviteTousLesIndicateursUrl } from '@/app/app/paths';
import { useFonctionTracker } from '@/app/core-logic/hooks/useFonctionTracker';
import { ReferentielId } from '@/domain/referentiels';
import { Button } from '@/ui';
import { useIndicateurSummary } from '../data/useIndicateurSummary';
import { useOpenDataIndicateursCount } from '../data/useOpenDataIndicateurs';

type IndicateursCardProps = {
collectiviteId: number;
referentielId: Referentiel;
referentielId: ReferentielId;
};

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Referentiel } from '@/api/referentiel/domain/enum.schema';
import { supabaseClient } from '@/app/core-logic/api/supabase';
import { useCollectiviteId } from '@/app/core-logic/hooks/params';
import { ReferentielId } from '@/domain/referentiels';
import { useQuery } from 'react-query';

const fetchIndicateurSummary = async (
collectivite_id: number,
referentiel: Referentiel
referentiel: ReferentielId
) => {
const { error, data } = await supabaseClient
.from('indicateur_summary')
Expand All @@ -20,7 +20,7 @@ const fetchIndicateurSummary = async (
/**
* Récupère le summary des indicateurs d'un référentiel pour une collectivité donnée
*/
export const useIndicateurSummary = (referentiel: Referentiel) => {
export const useIndicateurSummary = (referentiel: ReferentielId) => {
const collectiviteId = useCollectiviteId();

return useQuery(['indicateur_summary', collectiviteId, referentiel], () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Indicateurs } from '@/api';
import { Valeur } from '@/api/indicateurs/domain';
import { Tooltip } from '@/ui';

/**
Expand All @@ -9,7 +9,8 @@ export const DataSourceTooltip = ({
metadonnee,
children,
}: {
metadonnee: Indicateurs.domain.SourceMetadonnee;
metadonnee: NonNullable<Valeur['source']>;
// metadonnee: ReturnType<typeof transformeValeurs>['metadonnee'];
children: JSX.Element;
}) => {
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,7 @@ export type SourceType = 'resultat' | 'objectif';
/** Item dans une liste d'indicateurs (avant que le détail pour la vignette ne soit chargé) */
export type TIndicateurListItem = Indicateurs.domain.IndicateurListItem;

/** Item détaillé pour la vignette graphique dans une liste d'indicateurs */
export type TIndicateurChartInfo = Indicateurs.domain.IndicateurChartInfo;

export type IndicateurInsert = Indicateurs.domain.IndicateurDefinitionInsert;

export type TIndicateurPredefiniEnfant = TIndicateurPredefini & {
parent: string;
};

export type TIndicateurPredefini =
Indicateurs.domain.IndicateurDefinitionPredefini;

export type TIndicateurPersonnalise =
Indicateurs.domain.IndicateurDefinitionPersonalise;

export type TIndicateurDefinition = Indicateurs.domain.IndicateurDefinition;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { COLLECTIVITE_ID_ROUTE_PARAM } from '@/backend/collectivites/shared/models/collectivite-api.constants';
import { ReferentielType } from '@/domain/referentiels';
import { ReferentielId } from '@/domain/referentiels';
import { Injectable, Logger } from '@nestjs/common';
import {
and,
Expand Down Expand Up @@ -38,7 +38,7 @@ export default class DocumentService {

async getActionPreuves(
collectiviteId: number,
referentielId: ReferentielType,
referentielId: ReferentielId,
modifiedBeforeDate?: string
) {
const preuves = (
Expand Down Expand Up @@ -73,7 +73,7 @@ export default class DocumentService {

async getPreuvesReglementaires(
collectiviteId: number,
referentielId: ReferentielType,
referentielId: ReferentielId,
modifiedBeforeDate?: string
): Promise<PreuveDto[]> {
const conditions: (SQLWrapper | SQL)[] = [
Expand Down Expand Up @@ -125,7 +125,7 @@ export default class DocumentService {

async getPreuvesComplementaires(
collectiviteId: number,
referentielId: ReferentielType,
referentielId: ReferentielId,
modifiedBeforeDate?: string
): Promise<PreuveDto[]> {
const conditions: (SQLWrapper | SQL)[] = [
Expand Down
4 changes: 2 additions & 2 deletions backend/src/collectivites/shared/models/membre.table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
import { authUsersTable } from '../../../auth/models/auth-users.table';
import { referentielEnum } from '../../../referentiels/models/referentiel.enum';
import { referentielIdPgEnum } from '../../../referentiels/models/referentiel.enum';
import { createdAt, modifiedAt } from '../../../utils/column.utils';
import { collectiviteTable } from './collectivite.table';
import { membreFonctionEnum } from './membre-fonction.enum';
Expand All @@ -24,7 +24,7 @@ export const membreTable = pgTable(
.notNull(),
fonction: membreFonctionEnum('fonction'),
detailsFonction: text('details_fonction'),
champIntervention: referentielEnum('champ_intervention').array(),
champIntervention: referentielIdPgEnum('champ_intervention').array(),
estReferent: boolean('est_referent'),
createdAt,
modifiedAt,
Expand Down
105 changes: 0 additions & 105 deletions backend/src/indicateurs/controllers/indicateurs.controller.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { inferProcedureInput } from '@trpc/server';
import { getTestRouter } from '../../../test/app-utils';
import { getAuthUser } from '../../../test/auth-utils';
import { AuthenticatedUser } from '../../auth/models/auth.models';
import { AppRouter, TrpcRouter } from '../../utils/trpc/trpc.router';
import { AuthenticatedUser } from './../../auth/models/auth.models';
import {
GetFilteredIndicateurRequestQueryOptionType,
GetFilteredIndicateursRequestOptionType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import { categorieTagTable } from '../../collectivites/shared/models/categorie-t
import { groupementCollectiviteTable } from '../../collectivites/shared/models/groupement-collectivite.table';
import { ficheActionTable } from '../../plans/fiches/shared/models/fiche-action.table';
import { DatabaseService } from '../../utils/database/database.service';
import { indicateurActionTable } from '../models/indicateur-action.table';
import { indicateurCategorieTagTable } from '../models/indicateur-categorie-tag.table';
import { indicateurCollectiviteTable } from '../models/indicateur-collectivite.table';
import { indicateurDefinitionTable } from '../models/indicateur-definition.table';
import { indicateurGroupeTable } from '../models/indicateur-groupe.table';
import { indicateurPiloteTable } from '../models/indicateur-pilote.table';
import { indicateurServiceTagTable } from '../models/indicateur-service-tag.table';
import { indicateurThematiqueTable } from '../models/indicateur-thematique.table';
import { indicateurValeurTable } from '../models/indicateur-valeur.table';
import { indicateurActionTable } from '../shared/models/indicateur-action.table';
import { indicateurCategorieTagTable } from '../shared/models/indicateur-categorie-tag.table';
import { indicateurCollectiviteTable } from '../shared/models/indicateur-collectivite.table';
import { indicateurDefinitionTable } from '../shared/models/indicateur-definition.table';
import { indicateurGroupeTable } from '../shared/models/indicateur-groupe.table';
import { indicateurPiloteTable } from '../shared/models/indicateur-pilote.table';
import { indicateurServiceTagTable } from '../shared/models/indicateur-service-tag.table';
import { indicateurThematiqueTable } from '../shared/models/indicateur-thematique.table';
import { indicateurValeurTable } from '../shared/models/indicateur-valeur.table';
import {
GetFilteredIndicateurRequestQueryOptionType,
GetFilteredIndicateursRequestOptionType,
Expand Down
112 changes: 112 additions & 0 deletions backend/src/indicateurs/definitions/list-definitions.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import { Injectable, Logger } from '@nestjs/common';
import {
aliasedTable,
and,
eq,
getTableColumns,
inArray,
isNull,
or,
sql,
} from 'drizzle-orm';
import { objectToCamel } from 'ts-case-convert';
import { groupementCollectiviteTable } from '../../collectivites/shared/models/groupement-collectivite.table';
import { groupementTable } from '../../collectivites/shared/models/groupement.table';
import { DatabaseService } from '../../utils/database/database.service';
import {
IndicateurDefinition,
IndicateurDefinitionAvecEnfantsType,
indicateurDefinitionTable,
} from '../shared/models/indicateur-definition.table';
import { indicateurGroupeTable } from '../shared/models/indicateur-groupe.table';

@Injectable()
export default class ListDefinitionsService {
private readonly logger = new Logger(ListDefinitionsService.name);

constructor(private readonly databaseService: DatabaseService) {}

async getReferentielIndicateurDefinitions(identifiantsReferentiel: string[]) {
this.logger.log(
`Récupération des définitions des indicateurs ${identifiantsReferentiel.join(
','
)}`
);
const definitions = await this.databaseService.db
.select()
.from(indicateurDefinitionTable)
.where(
inArray(
indicateurDefinitionTable.identifiantReferentiel,
identifiantsReferentiel
)
);
this.logger.log(`${definitions.length} définitions trouvées`);
return definitions;
}

/**
* Charge la définition des indicateurs à partir de leur id
* ainsi que les définitions des indicateurs "enfant" associés.
*/
async getIndicateurDefinitions(
collectiviteId: number,
indicateurIds: number[]
): Promise<IndicateurDefinitionAvecEnfantsType[]> {
this.logger.log(
`Charge la définition des indicateurs ${indicateurIds.join(',')}`
);

const definitionEnfantsTable = aliasedTable(
indicateurDefinitionTable,
'enfants'
);

const definitions = await this.databaseService.db
.select({
...getTableColumns(indicateurDefinitionTable),
enfants: sql`json_agg(${definitionEnfantsTable})`,
})
.from(indicateurDefinitionTable)
.leftJoin(
indicateurGroupeTable,
eq(indicateurGroupeTable.parent, indicateurDefinitionTable.id)
)
.leftJoin(
definitionEnfantsTable,
eq(definitionEnfantsTable.id, indicateurGroupeTable.enfant)
)
.leftJoin(
groupementTable,
eq(groupementTable.id, definitionEnfantsTable.groupementId)
)
.leftJoin(
groupementCollectiviteTable,
eq(groupementCollectiviteTable.groupementId, groupementTable.id)
)
.where(
and(
inArray(indicateurDefinitionTable.id, indicateurIds),
or(
isNull(definitionEnfantsTable.groupementId),
eq(groupementCollectiviteTable.collectiviteId, collectiviteId)
)
)
)
.groupBy(indicateurDefinitionTable.id);

this.logger.log(`${definitions.length} définitions trouvées`);

return definitions.map(
(def: IndicateurDefinition & { enfants: unknown[] }) => {
const enfants = def.enfants?.filter(Boolean);
return {
...def,
enfants: enfants?.length
? (objectToCamel(enfants) as IndicateurDefinition[])
: null,
};
}
);
}
}
Loading

0 comments on commit aede168

Please sign in to comment.