Skip to content
Merged
8 changes: 7 additions & 1 deletion .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ fileignoreconfig:
checksum: ab7a0f54777521ceb0cf4f2f253cc6f804e24ad7e27015eb9d66961366510a12
- filename: packages/backend/src/__tests__/usagers/authentification.test.ts
checksum: c15d2aeea878e0da568caa3a14d4dc58287fad8ee1cd6d026626c38870e8bc47
- filename: packages/backend/src/admin/agrements/agrements.service.ts
checksum: 8f4c20086189fa2e89ff078120488bd868a0370b6f6cbd737b93def3b82c4c15
- filename: packages/backend/src/config.js
checksum: 5e974a98e40b4f10974b9e57127b8b71e4abef208494d69218b17b3721453ada
- filename: packages/backend/src/controllers/__tests__/bo-user/accept-cgu.test.js
Expand Down Expand Up @@ -185,6 +187,8 @@ fileignoreconfig:
checksum: 2ba032561adc4ef237463114e8761fb3f7a754e062f0d192f7b38d31f80763b7
- filename: packages/frontend-bo/src/assets/Download.svg
checksum: 2845f88f98040035bf7e9434a9bd5fe5cb8d0dd28fd1d765dd9c6a0b440e49f7
- filename: packages/frontend-bo/src/components/agrements/liste.vue
checksum: 6b798d2ae581064a525ebcd10b7a4ba940a2cfad2c920c2ec186e2e93674a8c3
- filename: packages/frontend-bo/src/components/connexion/email/validateToken.client.vue
checksum: 595435cdea445525554cb0d703a53cf277127a3c0ad39c02502f865cb9fc5dd0
- filename: packages/frontend-bo/src/components/demandes-sejour/DefaultTable.vue
Expand Down Expand Up @@ -309,14 +313,16 @@ fileignoreconfig:
checksum: 0c60a5a9f3321ab3c36025bdeb35663395586d5bca3d21984fdbe5997b46c6eb
- filename: packages/migrations/src/scripts/reset-s3.js
checksum: 7b52636c4c49bf85a592f649f8fbf653e0203b390f4f9d220fe3ae4da06422a7
- filename: packages/shared-bridge/src/dto/paginationQueryDto.ts
checksum: 171d7cf0f68b404e3b648fcb9d7b3e36891da049bad2ede67007d0c03661145a
- filename: packages/shared-bridge/src/constantes/file.ts
checksum: dded09b86eeb4c664e493ff12b023d20914b18ac5c9a98ac7e60235daec3927d
- filename: packages/shared-bridge/src/utils/request.ts
checksum: c29fc1527b710e177395fabd040b7e3cdd44b429b21d504ba6f192faf1cd861a
- filename: packages/shared-ui/src/components/DsfrMultiselectV2.vue
checksum: 1de96bc77280e61537e5c573a8116d32a8d2793eb073f89080cc66f8a389ce73
- filename: packages/shared-ui/src/components/Table/DsfrDataTableV2.vue
checksum: 0333a8dd3d87ab118f5896b079f89423f9e465208c68bebed045a83350ce24d6
checksum: 3a7b2bfad20888628a8300ef771cdf322d0ccbf3e9043eb7995b78877045d765
- filename: packages/shared-ui/src/components/Toaster.vue
checksum: 83bcf77f5b7763c7f6bc272366174a0780fec328462c6ca4bc29ef144e2c37de
- filename: packages/shared-ui/src/composables/useToaster.ts
Expand Down
93 changes: 93 additions & 0 deletions packages/backend/src/__tests__/admin/agrements.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import request from "supertest";

import app from "../../app";
import { buildAgrementFixture } from "../helper/fixtures/agrementsFixture";
import { createAgrement } from "../helper/fixtures/agrementsHelper";
import { createOrganisme } from "../helper/fixtures/organismeHelper";
import {
createAdminUser,
createUsagersUser,
} from "../helper/fixtures/userHelper";
import {
createTestContainer,
removeTestContainer,
} from "../helper/testContainer";

let authUser = { id: 1, role: "admin" };
let authUser2 = { id: 2, role: "admin" };
let authUserBo = { territoireCode: "IDF" };

jest.mock("../../middlewares/common/checkJWT", () => {
return async (req, res, next) => {
req.decoded = authUserBo;
next();
};
});

beforeAll(async () => await createTestContainer());
afterAll(async () => await removeTestContainer());

afterEach(() => {
jest.clearAllMocks();
});

describe("GET /agrements/list/", () => {
it("devrait retourner une liste d'agréments avec succès", async () => {
authUser = await createUsagersUser();
const organismeId1 = await createOrganisme({ userId: authUser.id });
const agrementData = await buildAgrementFixture({
organismeId: organismeId1,
});
const agrementId1 = await createAgrement({
agrement: agrementData,
organismeId: organismeId1,
});
authUser2 = await createUsagersUser();
const organismeId2 = await createOrganisme({ userId: authUser2.id });
const agrementData2 = await buildAgrementFixture({
organismeId: organismeId2,
});
const agrementId2 = await createAgrement({
agrement: agrementData2,
organismeId: organismeId2,
});
authUserBo = await createAdminUser({ territoireCode: "IDF" });
const response = await request(app).get(`/admin/agrements/list/`);

expect(response.status).toBe(200);
expect(response.body.agrements).toBeDefined();
expect(response.body.agrements.length).toBe(2);
expect(response.body.agrements[0].id).toEqual(agrementId1);
expect(response.body.agrements[1].id).toEqual(agrementId2);
});

it("devrait retourner un seul agréments filtré avec succès", async () => {
authUser = await createUsagersUser();
const organismeId1 = await createOrganisme({ userId: authUser.id });
const agrementData = await buildAgrementFixture({
organismeId: organismeId1,
});
await createAgrement({
agrement: agrementData,
organismeId: organismeId1,
});
authUser2 = await createUsagersUser();
const organismeId2 = await createOrganisme({ userId: authUser2.id });
const agrementData2 = await buildAgrementFixture({
organismeId: organismeId2,
});
await createAgrement({
agrement: agrementData2,
organismeId: organismeId2,
});
authUserBo = await createAdminUser({ territoireCode: "IDF" });
const response = await request(app).get(
`/admin/agrements/list?limit=1&offset=0&search={"numero":"${agrementData.numero}"}`,
);

expect(response.status).toBe(200);
expect(response.body.agrements).toBeDefined();
expect(response.body.agrements.length).toBe(1);
expect(response.body.agrements[0].numero).toEqual(agrementData.numero);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export async function buildAgrementFixture({
dateVerifCompleture: new Date("2024-12-05"),
immatriculation: "123-AB-456",
motivations: "Motivation de test",
numero: "AGR-2024-0001",
organismeId,
protocoleEvacUrg: "Procédure OK",
protocoleInfoFamille: "Information envoyée",
Expand Down
18 changes: 12 additions & 6 deletions packages/backend/src/__tests__/helper/fixtures/userHelper.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
import { UsersRepository as AdminUsersRepository } from "../../../repositories/admin/Users";
import { UsersRepository as UsagerUsersRepository } from "../../../repositories/usagers/Users";
import { create as createBoUserService } from "../../../services/BoUser";
import {
create as createBoUserService,
readOneByMail as readOneByMailBoUserService,
} from "../../../services/BoUser";
import { registerByEmail as createFrontUserService } from "../../../services/User";

export const createAdminUser = async (user = {}) => {
const timestamp = Date.now();
const fixture = {
email: "user1@example.com",
email: `userbo${timestamp}@example.com`,
nom: "Nom1",
prenom: "Prenom1",
roles: ["eig", "DemandeSejour_Lecture", "DemandeSejour_Ecriture"],
roles: ["DemandeSejour_Lecture", "DemandeSejour_Ecriture"],
territoireCode: "FRA",
...user,
};
return await createBoUserService(fixture);
await createBoUserService(fixture);
const result = await readOneByMailBoUserService(fixture.email);
return result;
};

export const createUsagersUser = async (user = {}) => {
Expand All @@ -21,7 +27,7 @@ export const createUsagersUser = async (user = {}) => {
email: `frontuser${timestamp}@example.com`,
nom: "FrontNom",
prenom: "FrontPrenom",
siret: `123456789012${timestamp.toString().slice(-2)}`,
siret: `${timestamp.toString().slice(-2)}123456789012`,
telephone: "0102030405",
terCode: "FRA",
...user,
Expand Down Expand Up @@ -57,5 +63,5 @@ export const createAdminUserValide = async (user = {}) => {
...user,
};
const result = await AdminUsersRepository.create({ user: fixture });
return result.user;
return result;
};
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ describe("POST /authentication/email/register", () => {
.post("/authentication/email/register")
.send(payload);

console.log("Response body:", response.body);
expect(response.status).toBe(400);
expect(response.body.name).toBe("SiretNotFound");
});
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/__tests__/usagers/territoire.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ describe("GET /territoire/getByAgrementRegionUser", () => {
const territoireId = await createTerritoire({
territoireCode: "IDF",
});
console.log("Territoire ID simulé :", territoireId);
const response = await request(app).get(
`/territoire/get-by-agrement-region-user`,
);
Expand Down
29 changes: 29 additions & 0 deletions packages/backend/src/admin/agrements/agrements.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import type { AgrementAdminRoutes } from "@vao/shared-bridge";
import type { NextFunction } from "express";

import type { RouteRequest, RouteResponse } from "../../types/request";
import logger from "../../utils/logger";
import { AgrementService } from "./agrements.service";

const log = logger(module.filename);

export const AgrementController = {
async getList(
req: RouteRequest<AgrementAdminRoutes["GetList"]>,
res: RouteResponse<AgrementAdminRoutes["GetList"]>,
next: NextFunction,
) {
log.i("IN");
const regionCode = String(req.decoded?.territoireCode);
try {
const { count, result } = await AgrementService.getListAgrements({
queryParams: req.validatedQuery!,
regionCode,
});
res.json({ agrements: result, count });
} catch (error) {
log.w("DONE with error");
next(error);
}
},
};
73 changes: 73 additions & 0 deletions packages/backend/src/admin/agrements/agrements.repository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { AgrementDto } from "@vao/shared-bridge";
import { PaginationQueryDto } from "@vao/shared-bridge/src/dto/paginationQueryDto";

import { processQuery } from "../../helpers/queryParams";
import { AgrementEntity } from "../../shared/agrements/agrements.entity";
import { AgrementsMapper } from "../../shared/agrements/agrements.mapper";
import Logger from "../../utils/logger";
import { getPool } from "../../utils/pgpool";

const log = Logger(module.filename);
// ------------------------------------------------------------
// 🏗️ Repository Admin
// ------------------------------------------------------------
export const AgrementsRepository = {
/**
* Récupère une liste d'agréments par région d'obtention
*/
async getByRegionObtention({
regionCode,
criterias,
queryParams,
}: {
regionCode: string;
criterias: Array<Record<string, any>>;
queryParams: PaginationQueryDto & {
name?: string;
numero?: string;
siret?: string;
statut?: string;
};
}): Promise<{ count: number; result: AgrementDto[] }> {
log.i("getByRegionObtention - IN");
const query = () => `
SELECT
agr.*,
pm.siret,
pm.raison_sociale,
pp.prenom,
pp.nom_usage,
pp.siret
FROM front.agrements agr
INNER JOIN front.organismes o ON o.id = agr.organisme_id
LEFT JOIN front.personne_morale pm ON pm.organisme_id = o.id AND pm.current = true
LEFT JOIN front.personne_physique pp ON pp.organisme_id = o.id AND pp.current = true
WHERE agr.region_obtention = $1
`;

const paginatedQuery = processQuery(
query,
[regionCode],
criterias ?? {},
queryParams,
);
const response = await Promise.all([
getPool().query(paginatedQuery.query, paginatedQuery.params),
getPool().query(
paginatedQuery.countQuery,
paginatedQuery.countQueryParams,
),
]);
const agrements = [];
for (const row of response[0].rows) {
const agrement = AgrementsMapper.toModel(row as AgrementEntity);
agrements.push(agrement);
}
log.i("getByRegionObtention - DONE");

return {
count: parseInt(response[1].rows[0].total, 10),
result: agrements,
};
},
};
19 changes: 19 additions & 0 deletions packages/backend/src/admin/agrements/agrements.route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { AgrementAdminRoutesSchema } from "@vao/shared-bridge";
import express from "express";

import boCheckJWT from "../../middlewares/bo-check-JWT";
import checkPermissionBOAgrement from "../../middlewares/checkPermissionBOAgrement";
import { requestValidatorMiddleware } from "../../middlewares/requestValidatorMiddleware";
import { AgrementController } from "./agrements.controller";

const router = express.Router();

router.get(
"/list/",
boCheckJWT,
requestValidatorMiddleware(AgrementAdminRoutesSchema["GetList"]),
checkPermissionBOAgrement,
AgrementController.getList,
);

export default router;
Loading
Loading