diff --git a/.eslintrc b/.eslintrc index 1052dbe..dc4621b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,8 +1,7 @@ { "extends": [ "next/core-web-vitals", - "plugin:@typescript-eslint/strict-type-checked", - "plugin:@typescript-eslint/stylistic-type-checked", + "plugin:@typescript-eslint/all", "plugin:react/all", "plugin:import/recommended", "plugin:import/typescript", @@ -29,6 +28,7 @@ "parser": "@typescript-eslint/parser", "plugins": ["sort-keys-fix", "unused-imports"], "rules": { + "array-bracket-newline": "error", "array-bracket-spacing": "error", "array-element-newline": ["error", "consistent"], @@ -102,7 +102,29 @@ "react/jsx-no-literals": "off", "react/react-in-jsx-scope": "off", "sort-keys-fix/sort-keys-fix": "error", + "@typescript-eslint/array-type": ["error", { "default": "generic", "readonly": "generic" }], "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/consistent-type-imports": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/max-params": "off", + "@typescript-eslint/no-magic-numbers": "off", + "@typescript-eslint/no-shadow": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/prefer-destructuring": "off", + "@typescript-eslint/prefer-readonly-parameter-types": ["off", { + "allow": [ + "FormEvent", + "HTMLFormElement", + "HTMLInputElement", + "SubmitEvent", + "SyntheticEvent", + "ReactElement", + "ChartDataset", + "ClientSafeProvider", + "inventaireModel" + ] + }], "unused-imports/no-unused-imports": "error" } } diff --git a/prisma/db.ts b/prisma/db.ts index 8ef68c1..41b0d55 100644 --- a/prisma/db.ts +++ b/prisma/db.ts @@ -32,7 +32,7 @@ const prismaClientSingleton = (): PrismaClient + const prismaGlobal: ReturnType | undefined } // @ts-expect-error diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c8030a2..9666e8f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -7,91 +7,71 @@ datasource db { url = env("DATABASE_URL") } -model en_donnees_entrees { +model inventaireModel { id Int @id - date_creation DateTime - date_lot DateTime - date_update DateTime - nom_organisation String - nom_lot String - statut_traitement String + dateCreation DateTime @map("date_creation") + dateInventaire DateTime @map("date_lot") + dateMiseAJour DateTime @map("date_update") + nomEtablissement String @map("nom_organisation") + nomInventaire String @map("nom_lot") + statut String @map("statut_traitement") + + @@map("en_donnees_entrees") } -model en_equipement_physique { +model modeleModel { id Int @id - date_creation DateTime - date_update DateTime - date_lot DateTime - nom_lot String - nom_organisation String - nom_source_donnee String? - conso_elec_annuelle Float? - date_achat DateTime - date_retrait DateTime - duree_vie_defaut Float? - go_telecharge Float? - modele String - nb_coeur String? - nb_jour_utilise_an Float - nom_court_datacenter String? - nom_entite String? - nom_equipement_physique String? - pays_utilisation String? + dateInventaire DateTime @map("date_lot") + nomInventaire String @map("nom_lot") + nomEtablissement String @map("nom_organisation") + dateAchat DateTime @map("date_achat") + nom String @map("modele") quantite Float - serveur Boolean - statut String? type String - utilisateur String? - mode_utilisation String? - taux_utilisation Float - statut_traitement String - stockage_total_virtuel Float? - ref_equipement_par_defaut String? - ref_equipement_retenu String? + tauxUtilisation Float @map("taux_utilisation") + + @@map("en_equipement_physique") } -model ind_indicateur_impact_equipement_physique { - date_calcul DateTime - date_lot DateTime - nom_lot String @unique - etapeacv String +model indicateurImpactEquipementModel { + dateInventaire DateTime @map("date_lot") + nomInventaire String @unique @map("nom_lot") + etapeAcv String @map("etapeacv") critere String - source String? - statut_indicateur String - trace String - version_calcul String - conso_elec_moyenne Float? - impact_unitaire Float - quantite Int - statut_equipement_physique String? - type_equipement String - unite String - nom_entite String? - nom_organisation String - nom_source_donnee String? - nom_equipement String? - date_lot_discriminator DateTime - nom_organisation_discriminator String - nom_entite_discriminator String - nom_source_donnee_discriminator String + statutIndicateur String @map("statut_indicateur") + impactUnitaire Float @map("impact_unitaire") + typeEquipement String @map("type_equipement") + nomEtablissement String @map("nom_organisation") + + @@map("ind_indicateur_impact_equipement_physique") } -model ref_correspondance_type_equipement { - ref_correspondance_ref_eqp ref_correspondance_ref_eqp @relation(fields: [equipement_id], references: [ref_equipement_cible]) - equipement_id String @id +model correspondanceTypeEquipementModeleModel { + relationModeles referentielModeleModel @relation(fields: [modeleId], references: [id]) + + modeleId String @id @map("equipement_id") + + relationTypesEquipement referentielTypeEquipementModel @relation(fields: [typeEquipementId], references: [type]) - ref_type_equipement ref_type_equipement @relation(fields: [type_equipement_id], references: [type]) - type_equipement_id String + typeEquipementId String @map("type_equipement_id") + + @@map("ref_correspondance_type_equipement") } -model ref_correspondance_ref_eqp { - modele_equipement_source String @unique - ref_equipement_cible String @id - equipements ref_correspondance_type_equipement[] +model referentielModeleModel { + nom String @unique @map("modele_equipement_source") + id String @id @map("ref_equipement_cible") + + typesEquipement correspondanceTypeEquipementModeleModel[] + + @@map("ref_correspondance_ref_eqp") } -model ref_type_equipement { +model referentielTypeEquipementModel { type String @unique - duree_vie_defaut Float - modeles ref_correspondance_type_equipement[] + dureeDeVie Float @map("duree_vie_defaut") + + modeles correspondanceTypeEquipementModeleModel[] + + @@map("ref_type_equipement") } diff --git a/src/app/(connecte)/indicateurs-cles/page.tsx b/src/app/(connecte)/indicateurs-cles/page.tsx index 66e5815..2b45e13 100644 --- a/src/app/(connecte)/indicateurs-cles/page.tsx +++ b/src/app/(connecte)/indicateurs-cles/page.tsx @@ -1,4 +1,4 @@ -import { ind_indicateur_impact_equipement_physique } from '@prisma/client' +import { indicateurImpactEquipementModel } from '@prisma/client' import { Metadata } from 'next' import { notFound } from 'next/navigation' import { ReactElement } from 'react' @@ -6,9 +6,9 @@ import { ReactElement } from 'react' import { getProfileAtih } from '../../../authentification' import Breadcrumb from '../../../components/commun/Breadcrumb' import IndicateursCles from '../../../components/IndicateursCles/IndicateursCles' -import { Criteres, EtapesAcv, IndicateursSommesViewModel, IndicateursViewModel } from '../../../components/viewModel' -import { EquipementPhysiqueModel, recupererLesReferentielsEquipementsRepository } from '../../../repository/equipementsRepository' -import { IndicateursSommesModel, recupererIndicateursEquipementsPhysiquesRepository, recupererIndicateursEquipementsPhysiquesSommesRepository } from '../../../repository/indicateursRepository' +import { Criteres, EtapesAcv, IndicateurImpactEquipementSommeViewModel, IndicateursImpactsEquipementsViewModel } from '../../../components/viewModel' +import { IndicateurImpactEquipementSommeModel, recupererLesIndicateursImpactsEquipementsRepository, recupererLesIndicateursImpactsEquipementsSommesRepository } from '../../../repository/indicateursRepository' +import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository' const title = 'Indicateurs clés' export const metadata: Metadata = { @@ -33,40 +33,51 @@ export default async function Page({ searchParams }: PageProps): Promise ) } -function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_impact_equipement_physique[]): IndicateursViewModel { +function transformerLesIndicateursImpactsEquipementsModelEnViewModel( + indicateursImpactsEquipementsModel: Array +): IndicateursImpactsEquipementsViewModel { let radiationIonisantes = 0 let epuisementDesRessources = 0 let emissionsDeParticulesFines = 0 @@ -78,29 +89,29 @@ function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_i let finDeVie = 0 const kilometresEquivalent1TonneCO2 = 5181 - for (const indicateur of indicateursModel) { - const critere = indicateur.critere as Criteres - const etapeacv = indicateur.etapeacv as EtapesAcv + for (const indicateurImpactEquipementModel of indicateursImpactsEquipementsModel) { + const critere = indicateurImpactEquipementModel.critere as Criteres + const etapeacv = indicateurImpactEquipementModel.etapeAcv as EtapesAcv if (critere === Criteres.radiationIonisantes) { - radiationIonisantes += indicateur.impact_unitaire + radiationIonisantes += indicateurImpactEquipementModel.impactUnitaire } else if (critere === Criteres.epuisementDesRessources) { - epuisementDesRessources += indicateur.impact_unitaire + epuisementDesRessources += indicateurImpactEquipementModel.impactUnitaire } else if (critere === Criteres.emissionsDeParticulesFines) { - emissionsDeParticulesFines += indicateur.impact_unitaire + emissionsDeParticulesFines += indicateurImpactEquipementModel.impactUnitaire } else if (critere === Criteres.acidification) { - acidification += indicateur.impact_unitaire + acidification += indicateurImpactEquipementModel.impactUnitaire } else { - empreinteCarbone += indicateur.impact_unitaire / 1000 + empreinteCarbone += indicateurImpactEquipementModel.impactUnitaire / 1000 if (etapeacv === EtapesAcv.fabrication) { - fabrication += indicateur.impact_unitaire / 1000 + fabrication += indicateurImpactEquipementModel.impactUnitaire / 1000 } else if (etapeacv === EtapesAcv.distribution) { - distribution += indicateur.impact_unitaire / 1000 + distribution += indicateurImpactEquipementModel.impactUnitaire / 1000 } else if (etapeacv === EtapesAcv.utilisation) { - utilisation += indicateur.impact_unitaire / 1000 + utilisation += indicateurImpactEquipementModel.impactUnitaire / 1000 } else { - finDeVie += indicateur.impact_unitaire / 1000 + finDeVie += indicateurImpactEquipementModel.impactUnitaire / 1000 } } } @@ -119,31 +130,31 @@ function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_i } } -function transformIndicateursSommesModelToViewModel( - indicateursSommesModel: IndicateursSommesModel[], - referentielsEquipementsViewModel: string[] -): IndicateursSommesViewModel[] { - return indicateursSommesModel - .map((indicateurSomme): IndicateursSommesViewModel => { +function transformerLesIndicateursImpactsEquipementsSommesModelEnViewModel( + indicateursImpactsEquipementsSommesModel: Array, + referentielsEquipementsViewModel: Array +): Array { + return indicateursImpactsEquipementsSommesModel + .map((indicateurImpactEquipementSommeModel): IndicateurImpactEquipementSommeViewModel => { return { - etapeAcv: indicateurSomme.etapeacv as `${EtapesAcv}`, - impact: indicateurSomme._sum.impact_unitaire, - typeEquipement: indicateurSomme.type_equipement, + etapeAcv: indicateurImpactEquipementSommeModel.etapeAcv as `${EtapesAcv}`, + impact: indicateurImpactEquipementSommeModel._sum.impactUnitaire, + typeEquipement: indicateurImpactEquipementSommeModel.typeEquipement, } }) .sort(sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel)) } -function tranformReferentielsEquipementsToViewModel(referentielsEquipementsModel: EquipementPhysiqueModel[]): string[] { - return referentielsEquipementsModel.map((referentielEquipementModel): string => referentielEquipementModel.type) +function tranformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel: Array): Array { + return referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): string => referentielTypeEquipementModel.type) } function deuxChiffresApresLaVirgule(chiffre: number): string { return Number(chiffre.toFixed(2)).toLocaleString() } -function sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel: string[]) { - return (a: IndicateursSommesViewModel, b: IndicateursSommesViewModel) => { +function sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel: Array) { + return (a: IndicateurImpactEquipementSommeViewModel, b: IndicateurImpactEquipementSommeViewModel) => { let etapeAcvA = '0' let etapeAcvB = '0' diff --git a/src/app/(connecte)/inventaire/page.tsx b/src/app/(connecte)/inventaire/page.tsx index 195635c..78bd649 100644 --- a/src/app/(connecte)/inventaire/page.tsx +++ b/src/app/(connecte)/inventaire/page.tsx @@ -1,4 +1,4 @@ -import { en_equipement_physique } from '@prisma/client' +import { modeleModel } from '@prisma/client' import { Metadata } from 'next' import { notFound } from 'next/navigation' import { ReactElement } from 'react' @@ -7,8 +7,9 @@ import { getProfileAtih } from '../../../authentification' import Breadcrumb from '../../../components/commun/Breadcrumb' import Inventaire from '../../../components/Inventaire/Inventaire' import { ModeleReducer } from '../../../components/Inventaire/useEquipement' -import { EquipementsAvecSesModelesViewModel, StatutsInventaire } from '../../../components/viewModel' -import { EquipementPhysiqueModel, recupererLesEquipementsEnregistresRepository, recupererLesReferentielsEquipementsRepository } from '../../../repository/equipementsRepository' +import { EquipementAvecSesModelesViewModel, StatutsInventaire } from '../../../components/viewModel' +import { recupererLesModelesRepository } from '../../../repository/modelesRepository' +import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository' const title = 'Renseigner les équipements' export const metadata: Metadata = { @@ -34,14 +35,14 @@ export default async function Page({ searchParams }: PageProps): Promise @@ -49,43 +50,43 @@ export default async function Page({ searchParams }: PageProps): Promise ) } -function transformTypesEquipementModelToViewModel( - equipementsReferentielsModel: EquipementPhysiqueModel[], - equipementsEnregistresModel: en_equipement_physique[] -): EquipementsAvecSesModelesViewModel[] { - return equipementsReferentielsModel.map((equipementReferentielModel): EquipementsAvecSesModelesViewModel => { +function transformerLesReferentielsTypesEquipementsModelEnViewModel( + referentielsTypesEquipementsModel: Array, + modelesModel: Array +): Array { + return referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): EquipementAvecSesModelesViewModel => { return { - modeles: equipementReferentielModel.modeles + modeles: referentielTypeEquipementModel.modeles .map((modele): ModeleReducer => { let quantite = 0 - let dureeDeVie = equipementReferentielModel.duree_vie_defaut + let dureeDeVie = referentielTypeEquipementModel.dureeDeVie let heureUtilisation = 24 - const equipementsModelFiltre = equipementsEnregistresModel - .filter((equipementEnregistreModel): boolean => equipementEnregistreModel.modele === modele.ref_correspondance_ref_eqp.modele_equipement_source) + const equipementsModelFiltre = modelesModel + .filter((modeleModel): boolean => modeleModel.nom === modele.relationModeles.nom) if (equipementsModelFiltre.length > 0) { quantite = equipementsModelFiltre[0].quantite - dureeDeVie = new Date().getFullYear() - equipementsModelFiltre[0].date_achat.getFullYear() - heureUtilisation = Math.round(equipementsModelFiltre[0].taux_utilisation * 24) + dureeDeVie = new Date().getFullYear() - equipementsModelFiltre[0].dateAchat.getFullYear() + heureUtilisation = Math.round(equipementsModelFiltre[0].tauxUtilisation * 24) } return { dureeDeVie, heureUtilisation, id: crypto.randomUUID(), - nomModele: modele.ref_correspondance_ref_eqp.modele_equipement_source, + nomModele: modele.relationModeles.nom, quantite, } }), - type: equipementReferentielModel.type, + type: referentielTypeEquipementModel.type, } }) } diff --git a/src/app/(connecte)/liste-equipements/page.tsx b/src/app/(connecte)/liste-equipements/page.tsx index efee029..69ba105 100644 --- a/src/app/(connecte)/liste-equipements/page.tsx +++ b/src/app/(connecte)/liste-equipements/page.tsx @@ -1,4 +1,4 @@ -import { en_equipement_physique, ref_type_equipement } from '@prisma/client' +import { modeleModel } from '@prisma/client' import { Metadata } from 'next' import { notFound } from 'next/navigation' import { ReactElement } from 'react' @@ -7,7 +7,8 @@ import { getProfileAtih } from '../../../authentification' import Breadcrumb from '../../../components/commun/Breadcrumb' import ListeEquipements from '../../../components/ListeEquipements/ListeEquipements' import { EquipementsViewModel } from '../../../components/viewModel' -import { EquipementPhysiqueModel, recupererLesEquipementsEnregistresRepository, recupererLesReferentielsEquipementsRepository } from '../../../repository/equipementsRepository' +import { recupererLesModelesRepository } from '../../../repository/modelesRepository' +import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository' const title = 'Liste d’équipements' export const metadata: Metadata = { @@ -32,17 +33,17 @@ export default async function Page({ searchParams }: PageProps): Promise @@ -57,25 +58,25 @@ export default async function Page({ searchParams }: PageProps): Promise, + modelesModel: Array ): EquipementsViewModel { - const types = {} + const types: EquipementsViewModel = {} + + for (const modeleModel of modelesModel.sort(trierParTypeEquipementEtEtapeAcv(referentielsTypesEquipementsModel))) { + const ancienModeleModel = types[modeleModel.type] ?? [] - for (const equipementModel of equipementsModel.sort(sortByTypeEquipementAndEtapeAcv(referentielsEquipementsModel))) { // @ts-expect-error - types[equipementModel.type] = [ - // @ts-expect-error - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - ...types[equipementModel.type] || [], + types[modeleModel.type] = [ + ...ancienModeleModel, { - dateInventaire: equipementModel.date_lot, - modele: equipementModel.modele, - nomEtablissement: equipementModel.nom_organisation, - nomInventaire: equipementModel.nom_lot, - quantite: equipementModel.quantite, - type: equipementModel.type, + dateInventaire: modeleModel.dateInventaire, + modele: modeleModel.nom, + nomEtablissement: modeleModel.nomEtablissement, + nomInventaire: modeleModel.nomInventaire, + quantite: modeleModel.quantite, + type: modeleModel.type, }, ] } @@ -83,17 +84,17 @@ function transformEquipementModelToViewModel( return types } -function sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel: ref_type_equipement[]) { - return (a: en_equipement_physique, b: en_equipement_physique) => { +function trierParTypeEquipementEtEtapeAcv(referentielsTypesEquipementsModel: Array) { + return (a: modeleModel, b: modeleModel) => { let etapeAcvA = 0 let etapeAcvB = 0 - for (let poids = 0; poids < referentielsEquipementsViewModel.length; poids++) { - if (a.type === referentielsEquipementsViewModel[poids].type) { + for (let poids = 0; poids < referentielsTypesEquipementsModel.length; poids++) { + if (a.type === referentielsTypesEquipementsModel[poids].type) { etapeAcvA = poids } - if (b.type === referentielsEquipementsViewModel[poids].type) { + if (b.type === referentielsTypesEquipementsModel[poids].type) { etapeAcvB = poids } } diff --git a/src/app/(connecte)/page.tsx b/src/app/(connecte)/page.tsx index 88935f1..ece7227 100644 --- a/src/app/(connecte)/page.tsx +++ b/src/app/(connecte)/page.tsx @@ -1,11 +1,11 @@ -import { en_donnees_entrees } from '@prisma/client' +import { inventaireModel } from '@prisma/client' import { Metadata } from 'next' import { ReactElement } from 'react' import { getProfileAtih } from '../../authentification' import InventairesLayout from '../../components/Inventaires/InventairesLayout' import { InventaireViewModel, StatutsInventaire } from '../../components/viewModel' -import { recupererInventairesRepository } from '../../repository/inventairesRepository' +import { recupererLesInventairesRepository } from '../../repository/inventairesRepository' export const metadata: Metadata = { title: 'Accueil', @@ -14,9 +14,9 @@ export const metadata: Metadata = { export default async function Page(): Promise { const profile = await getProfileAtih() - const inventairesModel = await recupererInventairesRepository(profile.nomEtablissement, profile.isAdmin) + const inventairesModel = await recupererLesInventairesRepository(profile.nomEtablissement, profile.isAdmin) - const inventairesViewModel = transformInventairesModelToViewModel(inventairesModel) + const inventairesViewModel = transformerLesInventairesModelEnViewModel(inventairesModel) return ( { ) } -function transformInventairesModelToViewModel(inventairesModel: en_donnees_entrees[]): InventaireViewModel[] { +function transformerLesInventairesModelEnViewModel(inventairesModel: Array): Array { return inventairesModel.map((inventaireModel): InventaireViewModel => { - const statut = StatutsInventaire[inventaireModel.statut_traitement as keyof typeof StatutsInventaire] + const statut = StatutsInventaire[inventaireModel.statut as keyof typeof StatutsInventaire] const path = statut === StatutsInventaire.EN_ATTENTE ? '/inventaire' : '/indicateurs-cles' const statusParam = statut === StatutsInventaire.EN_ATTENTE ? `&statut=${StatutsInventaire.EN_ATTENTE}` : '' return { className: statut.toLowerCase().replace(' ', '_'), - dateInventaire: inventaireModel.date_lot.toLocaleDateString('fr-FR'), + dateInventaire: inventaireModel.dateInventaire.toLocaleDateString('fr-FR'), id: inventaireModel.id, - link: `${path}?nomEtablissement=${inventaireModel.nom_organisation}&nomInventaire=${inventaireModel.nom_lot}${statusParam}`, - nomEtablissement: inventaireModel.nom_organisation, - nomInventaire: inventaireModel.nom_lot, + link: `${path}?nomEtablissement=${encodeURI(inventaireModel.nomEtablissement)}&nomInventaire=${encodeURI(inventaireModel.nomInventaire)}${statusParam}`, + nomEtablissement: inventaireModel.nomEtablissement, + nomInventaire: inventaireModel.nomInventaire, statut, } }) diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx index 40c5247..445a2a0 100644 --- a/src/app/global-error.tsx +++ b/src/app/global-error.tsx @@ -3,7 +3,7 @@ import { ReactElement } from 'react' type ErrorProps = Readonly<{ - error: Error + error: Readonly }> export default function GlobalError({ error }: ErrorProps): ReactElement { diff --git a/src/authentification.ts b/src/authentification.ts index 426651a..d5a0ec8 100644 --- a/src/authentification.ts +++ b/src/authentification.ts @@ -5,6 +5,11 @@ import nextAuth, { NextAuthOptions, Session, getServerSession } from 'next-auth' import { JWT } from 'next-auth/jwt' import { OAuthConfig } from 'next-auth/providers' +type Profile = Readonly<{ + profile_atih: string + sub: string +}> + const authOptions = { callbacks: { jwt({ token, profile }): JWT { @@ -35,14 +40,14 @@ const authOptions = { id: 'pasrel', idToken: true, name: 'Pasrel', - profile(profile) { + profile(profile: Profile) { return { id: profile.sub, } }, type: 'oauth', wellKnown: 'https://connect-pasrel.atih.sante.fr/cas/oidc/.well-known', - } satisfies OAuthConfig<{ sub: string, profile_atih: string }>, + } satisfies OAuthConfig, ], theme: { brandColor: '#1d71b8', @@ -51,7 +56,6 @@ const authOptions = { }, } satisfies NextAuthOptions -// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment export const handler = nextAuth(authOptions) export type ProfileAtih = Readonly<{ @@ -103,7 +107,7 @@ export async function getProfileAtih(): Promise { return profile } -export async function isConnected() { +export async function isConnected(): Promise { const session = await getServerSession(authOptions) if (session) { diff --git a/src/components/Connexion/Connexion.tsx b/src/components/Connexion/Connexion.tsx index 9be9034..c770bb4 100644 --- a/src/components/Connexion/Connexion.tsx +++ b/src/components/Connexion/Connexion.tsx @@ -5,7 +5,7 @@ import { ClientSafeProvider, LiteralUnion, signIn } from 'next-auth/react' import { ReactElement } from 'react' type LoginProps = Readonly<{ - providers: Record, ClientSafeProvider> | null + providers: Readonly, ClientSafeProvider> | null> }> export default function Connexion({ providers }: LoginProps): ReactElement { @@ -16,7 +16,7 @@ export default function Connexion({ providers }: LoginProps): ReactElement {