Skip to content

Commit

Permalink
Gestion des droits admin
Browse files Browse the repository at this point in the history
  • Loading branch information
NerOcrO committed Apr 30, 2024
1 parent f325def commit 0fcc318
Show file tree
Hide file tree
Showing 20 changed files with 114 additions and 70 deletions.
5 changes: 5 additions & 0 deletions src/app/(connecte)/creer-un-inventaire/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { ReactElement } from 'react'

import { getProfileAtih } from '../../../authentification'
Expand All @@ -13,6 +14,10 @@ export const metadata: Metadata = {
export default async function Page(): Promise<ReactElement> {
const profile = await getProfileAtih()

if (profile.isAdmin) {
notFound()
}

return (
<>
<Breadcrumb label={title} />
Expand Down
13 changes: 9 additions & 4 deletions src/app/(connecte)/indicateurs-cles/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,29 @@ export const metadata: Metadata = {

type PageProps = Readonly<{
searchParams: Readonly<{
nomEtablissement?: string
nomInventaire?: string
}>
}>

export default async function Page({ searchParams }: PageProps): Promise<ReactElement> {
if (searchParams.nomInventaire === undefined) {
if (searchParams.nomEtablissement === undefined || searchParams.nomInventaire === undefined) {
notFound()
}

const profile = await getProfileAtih()

const indicateursModel = await recupererIndicateursEquipementsPhysiquesRepository(profile.nomEtablissement, searchParams.nomInventaire)
if (!profile.isAdmin && profile.nomEtablissement !== searchParams.nomEtablissement) {
notFound()
}

const indicateursModel = await recupererIndicateursEquipementsPhysiquesRepository(searchParams.nomEtablissement, searchParams.nomInventaire)

if (indicateursModel.length === 0) {
notFound()
}

const indicateursSommesModel = await recupererIndicateursEquipementsPhysiquesSommesRepository(profile.nomEtablissement, searchParams.nomInventaire)
const indicateursSommesModel = await recupererIndicateursEquipementsPhysiquesSommesRepository(searchParams.nomEtablissement, searchParams.nomInventaire)

const referentielsEquipementsModel = await recupererLesReferentielsEquipementsRepository()

Expand All @@ -53,7 +58,7 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl
dateInventaire={dateInventaire}
indicateursSommesViewModel={indicateursSommesViewModel}
indicateursViewModel={indicateursViewModel}
nomEtablissement={profile.nomEtablissement}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
referentielsEquipementsViewModel={referentielsEquipementsViewModel}
/>
Expand Down
13 changes: 9 additions & 4 deletions src/app/(connecte)/inventaire/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,26 @@ export const metadata: Metadata = {

type PageProps = Readonly<{
searchParams: Readonly<{
nomEtablissement?: string
nomInventaire?: string
statut?: string
}>
}>

export default async function Page({ searchParams }: PageProps): Promise<ReactElement> {
if (searchParams.nomInventaire === undefined) {
if (searchParams.nomEtablissement === undefined || searchParams.nomInventaire === undefined) {
notFound()
}

const profile = await getProfileAtih()

const equipementsReferentielsModel = await recupererLesReferentielsEquipementsRepository()
if (!profile.isAdmin && profile.nomEtablissement !== searchParams.nomEtablissement) {
notFound()
}

const equipementsEnregistresModel = await recupererLesEquipementsEnregistresRepository(profile.nomEtablissement, searchParams.nomInventaire)
const equipementsEnregistresModel = await recupererLesEquipementsEnregistresRepository(searchParams.nomEtablissement, searchParams.nomInventaire)

const equipementsReferentielsModel = await recupererLesReferentielsEquipementsRepository()

const equipementsAvecSesModelesViewModel = transformTypesEquipementModelToViewModel(equipementsReferentielsModel, equipementsEnregistresModel)

Expand All @@ -44,7 +49,7 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl
<Inventaire
dateInventaire={dateInventaire.toLocaleDateString('fr-FR')}
equipementsAvecSesModelesViewModel={equipementsAvecSesModelesViewModel}
nomEtablissement={profile.nomEtablissement}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
statut={statut}
/>
Expand Down
11 changes: 8 additions & 3 deletions src/app/(connecte)/liste-equipements/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,23 @@ export const metadata: Metadata = {

type PageProps = Readonly<{
searchParams: Readonly<{
nomEtablissement?: string
nomInventaire?: string
}>
}>

export default async function Page({ searchParams }: PageProps): Promise<ReactElement> {
if (searchParams.nomInventaire === undefined) {
if (searchParams.nomEtablissement === undefined || searchParams.nomInventaire === undefined) {
notFound()
}

const profile = await getProfileAtih()

const equipementsEnregistresModel = await recupererLesEquipementsEnregistresRepository(profile.nomEtablissement, searchParams.nomInventaire)
if (!profile.isAdmin && profile.nomEtablissement !== searchParams.nomEtablissement) {
notFound()
}

const equipementsEnregistresModel = await recupererLesEquipementsEnregistresRepository(searchParams.nomEtablissement, searchParams.nomInventaire)

if (equipementsEnregistresModel.length === 0) {
notFound()
Expand All @@ -45,7 +50,7 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl
<ListeEquipements
dateInventaire={dateInventaire}
equipementsViewModel={equipementsViewModel}
nomEtablissement={profile.nomEtablissement}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
/>
</>
Expand Down
9 changes: 6 additions & 3 deletions src/app/(connecte)/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ export const metadata: Metadata = {
export default async function Page(): Promise<ReactElement> {
const profile = await getProfileAtih()

const inventairesModel = await recupererInventairesRepository(profile.nomEtablissement)
const inventairesModel = await recupererInventairesRepository(profile.nomEtablissement, profile.isAdmin)

const inventairesViewModel = transformInventairesModelToViewModel(inventairesModel)

return (
<InventairesLayout inventairesViewModel={inventairesViewModel} />
<InventairesLayout
inventairesViewModel={inventairesViewModel}
isAdmin={profile.isAdmin}
/>
)
}

Expand All @@ -33,7 +36,7 @@ function transformInventairesModelToViewModel(inventairesModel: en_donnees_entre
className: statut.toLowerCase().replace(' ', '_'),
dateInventaire: inventaireModel.date_lot.toLocaleDateString('fr-FR'),
id: inventaireModel.id,
link: `${path}?nomInventaire=${inventaireModel.nom_lot}${statusParam}`,
link: `${path}?nomEtablissement=${inventaireModel.nom_organisation}&nomInventaire=${inventaireModel.nom_lot}${statusParam}`,
nomEtablissement: inventaireModel.nom_organisation,
nomInventaire: inventaireModel.nom_lot,
statut,
Expand Down
5 changes: 5 additions & 0 deletions src/authentification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,20 @@ const authOptions = {
export const handler = nextAuth(authOptions)

export type ProfileAtih = Readonly<{
isAdmin: boolean
nomEtablissement: string
}>

export async function getProfileAtih(): Promise<ProfileAtih> {
const niveauAdmin = 'NATIONAL'
const session = await getServerSession(authOptions)

if (!session) {
redirect('connexion')
}

let profile: ProfileAtih = {
isAdmin: false,
nomEtablissement: '',
}

Expand All @@ -89,6 +92,8 @@ export async function getProfileAtih(): Promise<ProfileAtih> {
}

profile = {
// @ts-expect-error
isAdmin: session.user.profile_atih.profils[profil].niveau === niveauAdmin,
// @ts-expect-error
nomEtablissement: session.user.profile_atih.profils[profil].entite.libelle + '$$' + finess,
}
Expand Down
6 changes: 5 additions & 1 deletion src/components/IndicateursCles/IndicateursCles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@ export default function IndicateursCles({
nomEtablissement={nomEtablissement}
nomInventaire={nomInventaire}
/>
<Onglets isSelected />
<Onglets
isSelected
nomEtablissement={nomEtablissement}
nomInventaire={nomInventaire}
/>
<div className="border rounded-sm top-left-radius-0 p-5 bg-white">
<div className="row mb-4">
<section className="col-md-4 mr-1">
Expand Down
2 changes: 1 addition & 1 deletion src/components/Inventaire/Inventaire.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export default function Inventaire({
nomInventaire,
statut,
}: InventaireProps): ReactElement {
const { enregistrerUnInventaire, isInventaireEnregistre, quantiteGlobale, setQuantiteGlobale } = useInventaire(nomInventaire)
const { enregistrerUnInventaire, isInventaireEnregistre, quantiteGlobale, setQuantiteGlobale } = useInventaire(nomEtablissement, nomInventaire)

const actions = (): ReactElement => (
<Actions
Expand Down
13 changes: 4 additions & 9 deletions src/components/Inventaire/action.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
'use server'

import { getProfileAtih } from '../../authentification'
import { EquipementPhysique, creerUnInventaireRepository, enregistrerUnInventaireNonCalculeRepository } from '../../repository/equipementsRepository'

export async function enregistrerUnInventaireNonCalculeAction(nomInventaire: string, modeles: EquipementPhysique[]) {
const profile = await getProfileAtih()

await enregistrerUnInventaireNonCalculeRepository(profile.nomEtablissement, nomInventaire, modeles)
export async function enregistrerUnInventaireNonCalculeAction(nomEtablissement: string, nomInventaire: string, modeles: EquipementPhysique[]) {
await enregistrerUnInventaireNonCalculeRepository(nomEtablissement, nomInventaire, modeles)
}

export async function creerUnInventaireAction(nomInventaire: string, modeles: EquipementPhysique[]) {
const profile = await getProfileAtih()

await creerUnInventaireRepository(profile.nomEtablissement, nomInventaire, modeles)
export async function creerUnInventaireAction(nomEtablissement: string, nomInventaire: string, modeles: EquipementPhysique[]) {
await creerUnInventaireRepository(nomEtablissement, nomInventaire, modeles)
}
7 changes: 4 additions & 3 deletions src/components/Inventaire/useInventaire.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import { SyntheticEvent, useEffect, useState } from 'react'
import { creerUnInventaireAction, enregistrerUnInventaireNonCalculeAction } from './action'
import { modelesSelectionnes } from './modele'

export function useInventaire(nomInventaire: string) {
export function useInventaire(nomEtablissement: string, nomInventaire: string) {
const router = useRouter()
const [quantiteGlobale, setQuantiteGlobale] = useState<number>(0)
const [isInventaireEnregistre, setIsInventaireEnregistre] = useState<boolean>(false)

const enregistrerUnInventaireNonCalcule = async () => {
await enregistrerUnInventaireNonCalculeAction(nomInventaire, modelesSelectionnes())
await enregistrerUnInventaireNonCalculeAction(nomEtablissement, nomInventaire, modelesSelectionnes())

setIsInventaireEnregistre(true)
setTimeout(() => {
Expand All @@ -21,9 +21,10 @@ export function useInventaire(nomInventaire: string) {

const lancerLeCalcul = async () => {
setQuantiteGlobale(0)
await creerUnInventaireAction(nomInventaire, modelesSelectionnes())
await creerUnInventaireAction(nomEtablissement, nomInventaire, modelesSelectionnes())

const url = new URL('/indicateurs-cles', document.location.href)
url.searchParams.append('nomEtablissement', nomEtablissement)
url.searchParams.append('nomInventaire', nomInventaire)
router.push(url.toString())
router.refresh()
Expand Down
1 change: 1 addition & 0 deletions src/components/Inventaires/ActionSupprimer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default function ActionSupprimer({ inventaireViewModel }: InventairesProp
<SupprimerUnInventaire
fermerLaModale={fermerLaModale}
isOpen={isOpen}
nomEtablissement={inventaireViewModel.nomEtablissement}
nomInventaire={inventaireViewModel.nomInventaire}
/>
</td>
Expand Down
25 changes: 15 additions & 10 deletions src/components/Inventaires/InventairesLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import { InventaireViewModel } from '../viewModel'

type InventairesLayoutProps = Readonly<{
inventairesViewModel: InventaireViewModel[]
isAdmin: boolean
}>

export default function InventairesLayout({ inventairesViewModel }: InventairesLayoutProps): ReactElement {
export default function InventairesLayout({ inventairesViewModel, isAdmin }: InventairesLayoutProps): ReactElement {
return (
<>
<div className="d-flex justify-content-between">
Expand All @@ -23,21 +24,25 @@ export default function InventairesLayout({ inventairesViewModel }: InventairesL
Retrouvez vos inventaires et consultez leur empreinte environnementale.
</div>
</div>
<div>
<Link
className="btn btn--plain btn--primary"
href="creer-un-inventaire"
>
Créer un inventaire
</Link>
</div>
{
!isAdmin && (
<div>
<Link
className="btn btn--plain btn--primary"
href="creer-un-inventaire"
>
Créer un inventaire
</Link>
</div>
)
}
</div>
<hr />
{
inventairesViewModel.length > 0 ? (
<Inventaires inventairesViewModel={inventairesViewModel} />
) : (
<InventairesVide />
<InventairesVide isAdmin={isAdmin} />
)
}
</>
Expand Down
26 changes: 17 additions & 9 deletions src/components/Inventaires/InventairesVide.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import Link from 'next/link'
import { ReactElement } from 'react'

export default function InventairesVide(): ReactElement {
type InventairesVideProps = Readonly<{
isAdmin: boolean
}>

export default function InventairesVide({ isAdmin }: InventairesVideProps): ReactElement {
return (
<div className="row justify-content-center">
<div className="col-md-5 text-center">
Expand Down Expand Up @@ -79,14 +83,18 @@ export default function InventairesVide(): ReactElement {
fill="#D20050"
/>
</svg>
<div>
<Link
className="btn btn--plain btn--primary"
href="creer-un-inventaire"
>
Créer un inventaire
</Link>
</div>
{
!isAdmin && (
<div>
<Link
className="btn btn--plain btn--primary"
href="creer-un-inventaire"
>
Créer un inventaire
</Link>
</div>
)
}
</div>
</div>
)
Expand Down
10 changes: 6 additions & 4 deletions src/components/ListeEquipements/ListeEquipements.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,20 @@ type ListeEquipementsProps = Readonly<{
}>

export default function ListeEquipements({ dateInventaire, equipementsViewModel, nomEtablissement, nomInventaire }: ListeEquipementsProps): ReactElement {
const equipements = Object.keys(equipementsViewModel)

return (
<>
<Actions
dateInventaire={dateInventaire}
nomEtablissement={nomEtablissement}
nomInventaire={nomInventaire}
/>
<Onglets isSelected={false} />
<Onglets
isSelected={false}
nomEtablissement={nomEtablissement}
nomInventaire={nomInventaire}
/>
{
equipements.map((equipement): ReactElement => {
Object.keys(equipementsViewModel).map((equipement): ReactElement => {
const quantite = equipementsViewModel[equipement].reduce((quantiteAccumulee, modele): number => quantiteAccumulee + modele.quantite, 0)

return (
Expand Down
3 changes: 2 additions & 1 deletion src/components/commun/Actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,14 @@ export default function Actions({ dateInventaire, nomEtablissement, nomInventair
</button>
<Link
className={`btn btn--plain btn--primary ${styles.middle}`}
href={`/inventaire?nomInventaire=${nomInventaire}&statut=${StatutsInventaire.TRAITE}`}
href={`/inventaire?nomEtablissement=${nomEtablissement}&nomInventaire=${nomInventaire}&statut=${StatutsInventaire.TRAITE}`}
>
Modifier l’inventaire
</Link>
<SupprimerUnInventaire
fermerLaModale={fermerLaModale}
isOpen={isOpen}
nomEtablissement={nomEtablissement}
nomInventaire={nomInventaire}
/>
</div>
Expand Down
Loading

0 comments on commit 0fcc318

Please sign in to comment.