Skip to content

Commit

Permalink
feat(fusager): hébergement desactivation et reactivation 663-837 (#744)
Browse files Browse the repository at this point in the history
## Tickets liés
Close #
tickets liés : 663 et 837

## Description
côté FUsagers : 
Sur liste hébergement
- Ajout du bouton désactiver un hébergement qui est actif dont on est le
siège social (ou personne physique)
- Ajout du bouton réactiver un hébergement qui est désactivé dont on est
le siège social (ou personne physique)
Idem sur la fiche hébergement avec les mêmes conditions.

### dont régressions potentielles à tester
Création d'un hébergement 
- Depuis une DS ou depuis la liste des hébergements

## Screenshot / liens loom 

## Check-list

 - [X] Ma branche est rebase sur main
- [X] Des tests ont été écrits pour tous les endpoints créés ou modifiés
 - [X] Refacto "à la volée" des parties sur lesquelles j'ai codée
 - [X] Plus de `console.log`
  • Loading branch information
iNeoO authored Feb 27, 2025
2 parents eb6d636 + a8fb1bc commit 2091d1d
Show file tree
Hide file tree
Showing 17 changed files with 529 additions and 40 deletions.
49 changes: 49 additions & 0 deletions packages/backend/src/controllers/hebergement/desactivate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const logger = require("../../utils/logger");
const AppError = require("../../utils/error");
const Hebergement = require("../../services/hebergement/Hebergement");
const HebergementHelper = require("../../helpers/hebergement");

const log = logger(module.filename);

module.exports = async function desactivate(req, res, next) {
const hebergementId = req.params.id;
const { decoded } = req;
const userId = decoded.id;

if (!hebergementId) {
log.w("missing or invalid parameter");

return next(
new AppError("Paramètre incorrect", {
statusCode: 400,
}),
);
}
// On recharge l'hébergement tel qu'il était avant désactivation pour pouvoir historiser et désactiver
const hebergement = await Hebergement.getById(hebergementId);
if (!hebergement) {
log.w("DONE with error");
return next(
new AppError("Hébergement non trouvée", {
statusCode: 404,
}),
);
}
try {
await Hebergement.update(
userId,
hebergementId,
hebergement,
HebergementHelper.statuts.DESACTIVE,
);

log.i("DONE");
return res.sendStatus(200);
} catch (error) {
if (error.cause === "archive") {
return next(new AppError(error));
}
log.w("DONE with error");
return next(error);
}
};
2 changes: 2 additions & 0 deletions packages/backend/src/controllers/hebergement/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ module.exports.postBrouillon = require("./post-brouillon");
module.exports.update = require("./update");
module.exports.updateBrouillon = require("./update-brouillon");
module.exports.activate = require("./activate");
module.exports.desactivate = require("./desactivate");
module.exports.reactivate = require("./reactivate");
47 changes: 47 additions & 0 deletions packages/backend/src/controllers/hebergement/reactivate
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const logger = require("../../utils/logger");
const AppError = require("../../utils/error");
const Hebergement = require("../../services/hebergement/Hebergement");
const HebergementHelper = require("../../helpers/hebergement");

const log = logger(module.filename);

module.exports = async function reactivate(req, res, next) {
const hebergementId = req.params.id;
const { decoded } = req;
const userId = decoded.id;

if (!hebergementId) {
log.w("missing or invalid parameter");

return next(
new AppError("Paramètre incorrect", {
statusCode: 400,
}),
);
}
const statut = await Hebergement.getStatut(hebergementId);
if (!statut) {
log.w("DONE with error");
return next(
new AppError("Hébergement non trouvée", {
statusCode: 404,
}),
);
}
try {
await Hebergement.updateStatut(
userId,
hebergementId,
HebergementHelper.statuts.ACTIF,
);

log.i("DONE");
return res.sendStatus(200);
} catch (error) {
if (error.cause === "archive") {
return next(new AppError(error));
}
log.w("DONE with error");
return next(error);
}
};
8 changes: 7 additions & 1 deletion packages/backend/src/controllers/hebergement/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const yup = require("yup");
const Hebergement = require("../../services/hebergement/Hebergement");
const logger = require("../../utils/logger");
const ValidationAppError = require("../../utils/validation-error");
const HebergementHelper = require("../../helpers/hebergement");
const HebergementSchema = require("../../schemas/hebergement");
const AppError = require("../../utils/error");

Expand Down Expand Up @@ -50,7 +51,12 @@ module.exports = async function post(req, res, next) {
}

try {
await Hebergement.update(userId, hebergementId, hebergement);
await Hebergement.update(
userId,
hebergementId,
hebergement,
HebergementHelper.statuts.ACTIF,
);
log.i("DONE");
return res.sendStatus(200);
} catch (error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const logger = require("../utils/logger");
const AppError = require("../utils/error");
const Organisme = require("../services/Organisme");

const log = logger(module.filename);

async function checkPermissionHebergementSiegeSocial(req, _res, next) {
const { id: userId } = req.decoded;
log.i("IN", { userId });
const isSiegeSocial = await Organisme.getIsUserIdSiegeSocial(userId);
if (!isSiegeSocial) {
return next(
new AppError("Utilisateur non autorisé à modifier cet hébergement", {
statusCode: 403,
}),
);
}
log.i("DONE");
next();
}

module.exports = checkPermissionHebergementSiegeSocial;
2 changes: 1 addition & 1 deletion packages/backend/src/middlewares/checkStatutHebergement.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ function checkStatutHebergement(statut) {

if (statut !== hebergementStatut) {
return next(
new AppError("Vous n'êtes pas autorisé à accéder à cet hébergement", {
new AppError("Vous n'êtes pas autorisé à modifier cet hébergement", {
statusCode: 403,
}),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const request = require("supertest");
const app = require("../../../app");
const Hebergement = require("../../../services/hebergement/Hebergement");
const checkJWT = require("../../../middlewares/checkJWT");
const checkPermissionHebergementSiegeSocial = require("../../../middlewares/checkPermissionHebergementSiegeSocial");

// Mock de la méthode Hebergement.update
jest.mock("../../../services/hebergement/Hebergement");
jest.mock("../../../middlewares/checkJWT");
jest.mock("../../../middlewares/checkPermissionHebergementSiegeSocial");
jest.mock(
"../../../middlewares/checkStatutHebergement",
() => () => (req, res, next) => {
next();
},
);
jest.mock("../../../schemas/hebergement");

describe("PUT /:id/desactivate", () => {
const user = {
id: 1,
};
beforeEach(() => {
jest.clearAllMocks();
checkJWT.mockImplementation((req, res, next) => {
req.decoded = { ...user };
next();
});
checkPermissionHebergementSiegeSocial.mockImplementation(
(req, res, next) => {
next();
},
);
});
it("should return 404", async () => {
Hebergement.update.mockResolvedValue();
const res = await request(app)
.put("/hebergement/1/desactivate")
.expect(404);
expect(res.statusCode).toBe(404);
expect(Hebergement.getById).toHaveBeenCalledWith("1");
});

it("should return 200", async () => {
Hebergement.getById.mockResolvedValue({ id: 1 });
Hebergement.update.mockResolvedValue();

const res = await request(app)
.put("/hebergement/1/desactivate")
.expect(200);
expect(res.statusCode).toBe(200);
expect(Hebergement.getById).toHaveBeenCalledWith("1");
expect(Hebergement.update).toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const request = require("supertest");
const app = require("../../../app");
const Hebergement = require("../../../services/hebergement/Hebergement");
const checkJWT = require("../../../middlewares/checkJWT");
const checkPermissionHebergementSiegeSocial = require("../../../middlewares/checkPermissionHebergementSiegeSocial");

// Mock de la méthode Hebergement.update
jest.mock("../../../services/hebergement/Hebergement");
jest.mock("../../../middlewares/checkJWT");
jest.mock("../../../middlewares/checkPermissionHebergementSiegeSocial");
jest.mock(
"../../../middlewares/checkStatutHebergement",
() => () => (req, res, next) => {
next();
},
);
jest.mock("../../../schemas/hebergement");

describe("PUT /:id/reactivate", () => {
const user = {
id: 1,
};
beforeEach(() => {
jest.clearAllMocks();
checkJWT.mockImplementation((req, res, next) => {
req.decoded = { ...user };
next();
});
checkPermissionHebergementSiegeSocial.mockImplementation(
(req, res, next) => {
next();
},
);
});

it("should return 404", async () => {
const res = await request(app).put("/hebergement/1/reactivate").expect(404);
expect(res.statusCode).toBe(404);
});

it("should return 200", async () => {
Hebergement.getStatut.mockResolvedValue({ id: 1 });
const res = await request(app).put("/hebergement/1/reactivate").expect(200);
expect(res.statusCode).toBe(200);
expect(Hebergement.getStatut).toHaveBeenCalled();
expect(Hebergement.updateStatut).toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const request = require("supertest");
const app = require("../../../app");
const Hebergement = require("../../../services/hebergement/Hebergement");
const HebergementHelpers = require("../../../helpers/hebergement");
const checkJWT = require("../../../middlewares/checkJWT");
const checkPermissionHebergement = require("../../../middlewares/checkPermissionHebergement");
const yup = require("yup");
Expand Down Expand Up @@ -62,6 +63,7 @@ describe("POST /:id", () => {
1, // userId
"123", // hebergementId
expect.objectContaining(body),
HebergementHelpers.statuts.ACTIF,
);
});

Expand Down
16 changes: 16 additions & 0 deletions packages/backend/src/routes/hebergement.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const router = express.Router();
const checkJWT = require("../middlewares/checkJWT");
const boCheckJWT = require("../middlewares/bo-check-JWT");
const checkPermissionHebergement = require("../middlewares/checkPermissionHebergement");
const checkPermissionHebergementSiegeSocial = require("../middlewares/checkPermissionHebergementSiegeSocial");
const checkStatutHebergement = require("../middlewares/checkStatutHebergement");
const getDepartements = require("../middlewares/getDepartements");
const hebergementController = require("../controllers/hebergement");
Expand Down Expand Up @@ -51,6 +52,21 @@ router.put(
checkStatutHebergement(HebergementHelper.statuts.BROUILLON),
hebergementController.activate,
);
router.put(
"/:id/desactivate",
checkJWT,
checkStatutHebergement(HebergementHelper.statuts.ACTIF),
checkPermissionHebergementSiegeSocial,
hebergementController.desactivate,
);
router.put(
"/:id/reactivate",
checkJWT,
checkStatutHebergement(HebergementHelper.statuts.DESACTIVE),
checkPermissionHebergementSiegeSocial,
hebergementController.reactivate,
);

router.post(
"/:id",
checkJWT,
Expand Down
28 changes: 28 additions & 0 deletions packages/backend/src/services/Organisme.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,27 @@ const query = {
FRONT.ORGANISMES
WHERE id = $1
`,
// TO DO : REFACTO ORGANISME : LECTURE DE LA TABLE PERSONNE_MORALE
/*`
SELECT uo.org_id
FROM
front.user_organisme uo
INNER JOIN front.organismes
LEFT JOIN front.personne_morale pm ON pm.organisme_id = uo.org_id
JOIN front.users u ON uo.use_id = u.id
WHERE u.id = $1
AND (pm.siege_social = 'true'
OR o.type_organisme = $${partOrganisme.PERSONNE_PHYSIQUE})
`*/
getIsUserIdSiegeSocial: `
SELECT uo.org_id
FROM
front.user_organisme uo
INNER JOIN front.organismes o ON o.id = uo.org_id
JOIN front.users u ON uo.use_id = u.id
WHERE u.id = $1
AND (o.personne_morale->>'siegeSocial' = 'true' OR o.type_organisme = '${partOrganisme.PERSONNE_PHYSIQUE}')
`,
getListe: () =>
`
WITH stat AS (
Expand Down Expand Up @@ -491,6 +512,13 @@ module.exports.create = async (type, parametre) => {
}
};

module.exports.getIsUserIdSiegeSocial = async (userId) => {
log.i("getIsUserIdSiegeSocial - IN", userId);
const { rowCount } = await pool.query(query.getIsUserIdSiegeSocial, [userId]);
log.i("getIsUserIdSiegeSocial - DONE");
return rowCount === 0 ? false : true;
};

module.exports.link = async (userId, organismeId) => {
log.i("link - IN");
const { rowCount } = await pool.query(query.link, [userId, organismeId]);
Expand Down
Loading

0 comments on commit 2091d1d

Please sign in to comment.