Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: refactor check ds #570

Draft
wants to merge 1 commit into
base: preprod
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 66 additions & 59 deletions packages/backend/src/middlewares/checkPermissionBODeclarationSejour.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,53 @@ const pool = require("../utils/pgpool").getPool();

const log = logger(module.filename);

async function checkPermissionDeclarationSejour(req, res, next) {
export default function (req, res, next) {
try {
checkPermissionDeclarationSejour(req, res)
next()
} catch (error) {
log.w(error)
next(error)
}
}

export default async function checkPermissionDeclarationSejour(req, _res) {
const { declarationId } = req.params;
const { departements } = req;
const { territoireCode } = req.decoded;
log.i("IN");

if (!declarationId || !departements) {
return next(
new AppError(
"Vous n'êtes pas autorisé à accéder à cette déclaration de séjour",
{
statusCode: 403,
},
),
if (!declarationId || !departements) {
throwHttpForbiddenError(
"Vous n'êtes pas autorisé à accéder à cette déclaration de séjour",
);
}

// Requête SQL simplifiée, ne récupérant que les informations brutes nécessaires
const sejour = getSejour(declarationId)
const { hebergement, personne_morale, region_obtention } = sejour;

// Traitement des données JSON pour vérifier les départements
const hebergements = hebergement?.hebergements || [];
const departementsHebergements = hebergements.map(
(h) => h.coordonnees?.adresse?.departement,
);

const hasValidDepartement = departements.some((dep) =>
departementsHebergements.includes(dep.value),
);

if (hasValidDepartement) {
return;
}

if (checkOrganismeAndAgrement({personne_morale, region_obtention, territoireCode})) {
return
}

throwHttpForbiddenError("Vous n'êtes pas autorisé à accéder à cette déclaration de séjour")
}

async function getSejour(declarationId) {
const query = `
SELECT ds.id, ds.hebergement, o.personne_morale, agr.region_obtention
FROM front.demande_sejour ds
Expand All @@ -34,42 +63,16 @@ async function checkPermissionDeclarationSejour(req, res, next) {
try {
const { rows } = await pool.query(query, [declarationId]);
if (!rows || rows.length === 0) {
return next(
new AppError(
"Vous n'êtes pas autorisé à accéder à cette déclaration de séjour",
{
statusCode: 403,
},
),
);
throwHttpForbiddenError("Vous n'êtes pas autorisé à accéder à cette déclaration de séjour")
}
// Récupération des données brutes
sejour = rows[0];
return rows[0];
} catch (err) {
log.w(err);
return next(
new AppError("La recheche du séjour et de l'organisateur ont échoué", {
cause: err,
}),
);
}

const { hebergement, personne_morale, region_obtention } = sejour;

// Traitement des données JSON pour vérifier les départements
const hebergements = hebergement?.hebergements || [];
const departementsHebergements = hebergements.map(
(h) => h.coordonnees?.adresse?.departement,
);

const hasValidDepartement = departements.some((dep) =>
departementsHebergements.includes(dep.value),
);

if (hasValidDepartement) {
return next();
throwHttpForbiddenError("La recheche du séjour et de l'organisateur ont échoué")
}
}

async function checkOrganismeAndAgrement({personne_morale, region_obtention, territoireCode}) {
try {
// Vérification supplémentaire sur les organismes et leur agrément
if (!personne_morale?.porteurAgrement) {
Expand All @@ -88,35 +91,39 @@ async function checkPermissionDeclarationSejour(req, res, next) {
(agr) => agr.region_obtention === territoireCode,
);
if (hasAgrement) {
return next();
return true;
}
} else {
// Vérification sur la région d'obtention (Organisme porteur de l'agrément)
if (region_obtention === territoireCode) {
return next();
return true;
}
}
} catch (err) {
log.w(err);
return next(
new AppError(
throwHttpInternalError(
"La recheche de l'agrément de l'organisateur principal a échoué",
{
cause: err,
},
),
err
);
}

// Si aucune des conditions n'est remplie, accès refusé
return next(
new AppError(
"Vous n'êtes pas autorisé à accéder à cette déclaration de séjour",
{
statusCode: 403,
},
),
return false
}

async function throwHttpForbiddenError(message) {
throw new AppError(
message,
{
statusCode: 403,
},
);
}

module.exports = checkPermissionDeclarationSejour;
async function throwHttpInternalError(message, err) {
throw new AppError(
message,
{
statusCode: 500,
cause: err
},
);
}
Loading