Skip to content

Commit 7fcbaf8

Browse files
committed
feat(api):backend logic for getting certifications attached to a registry manager
1 parent 0dd3dc7 commit 7fcbaf8

File tree

4 files changed

+133
-1
lines changed

4 files changed

+133
-1
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import { $Enums, Prisma } from "@prisma/client";
2+
3+
import { prismaClient } from "../../../prisma/client";
4+
import { processPaginationInfo } from "../../shared/list/pagination";
5+
import { Certification, CertificationStatusV2 } from "../referential.types";
6+
7+
export const searchCertificationsV2ForRegistryManager = async ({
8+
userKeycloakId,
9+
offset,
10+
limit,
11+
searchText,
12+
status,
13+
visible,
14+
}: {
15+
userKeycloakId: string;
16+
offset?: number;
17+
limit?: number;
18+
searchText?: string;
19+
status?: CertificationStatusV2;
20+
visible?: boolean;
21+
}): Promise<PaginatedListResult<Certification>> => {
22+
const realLimit = limit || 10;
23+
const realOffset = offset || 0;
24+
25+
const localAccount = await prismaClient.account.findFirst({
26+
where: {
27+
keycloakId: userKeycloakId,
28+
},
29+
});
30+
31+
if (!localAccount) {
32+
throw new Error(
33+
"Le compte du responsable de référentiel n'a pas pu être trouvé.",
34+
);
35+
}
36+
37+
const registryManager =
38+
await prismaClient.certificationRegistryManager.findFirst({
39+
where: {
40+
accountId: localAccount?.id,
41+
},
42+
});
43+
44+
if (!registryManager) {
45+
throw new Error(
46+
"Aucun responsable de référentiel n'existe avec cet identifiant",
47+
);
48+
}
49+
50+
let whereClause: Prisma.CertificationWhereInput = {
51+
certificationAuthorityStructureId:
52+
registryManager?.certificationAuthorityStructureId,
53+
};
54+
55+
if (searchText) {
56+
whereClause = {
57+
...whereClause,
58+
OR: [
59+
{ label: { contains: searchText, mode: "insensitive" } },
60+
{ rncpId: { contains: searchText, mode: "insensitive" } },
61+
{
62+
certificationAuthorityStructure: {
63+
label: {
64+
contains: searchText,
65+
mode: "insensitive",
66+
},
67+
},
68+
},
69+
{
70+
rncpTypeDiplome: { contains: searchText, mode: "insensitive" },
71+
},
72+
],
73+
};
74+
}
75+
76+
if (status) {
77+
whereClause = {
78+
...whereClause,
79+
statusV2: status as $Enums.CertificationStatusV2,
80+
};
81+
}
82+
83+
if (typeof visible == "boolean") {
84+
whereClause = {
85+
...whereClause,
86+
visible,
87+
};
88+
}
89+
90+
const certifications = await prismaClient.certification.findMany({
91+
where: whereClause,
92+
orderBy: [{ label: "asc" }],
93+
take: limit,
94+
skip: offset,
95+
});
96+
97+
const count = await prismaClient.certification.count({
98+
where: whereClause,
99+
});
100+
101+
return {
102+
rows: certifications.map((c) => ({ ...c, codeRncp: c.rncpId })),
103+
info: processPaginationInfo({
104+
totalRows: count,
105+
limit: realLimit,
106+
offset: realOffset,
107+
}),
108+
};
109+
};

packages/reva-api/modules/referential/referential.graphql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ type Query {
262262
status: CertificationStatusV2
263263
visible: Boolean
264264
): CertificationPage!
265+
searchCertificationsV2ForRegistryManager(
266+
offset: Int
267+
limit: Int
268+
searchText: String
269+
status: CertificationStatusV2
270+
visible: Boolean
271+
): CertificationPage!
265272
getCertification(certificationId: ID!): Certification!
266273
getRegions: [Region!]!
267274
getDepartments: [Department!]!

packages/reva-api/modules/referential/referential.resolvers.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import { createCertificationCompetenceBloc } from "./features/createCertificatio
4949
import { updateCertificationStructureAndCertificationAuthorities } from "./features/updateCertificationStructureAndCertificationAuthorities";
5050
import { sendCertificationToRegistryManager } from "./features/sendCertificationToRegistryManager";
5151
import { resetCompetenceBlocsByCertificationId } from "./features/resetCompetenceBlocsByCertificationId";
52+
import { searchCertificationsV2ForRegistryManager } from "./features/searchCertificationsV2ForRegistryManager";
5253

5354
const unsafeReferentialResolvers = {
5455
Certification: {
@@ -122,6 +123,19 @@ const unsafeReferentialResolvers = {
122123
status: payload.status,
123124
visible: payload.visible,
124125
}),
126+
searchCertificationsV2ForRegistryManager: (
127+
_: any,
128+
payload: any,
129+
context: GraphqlContext,
130+
) =>
131+
searchCertificationsV2ForRegistryManager({
132+
userKeycloakId: context.auth.userInfo?.sub || "",
133+
offset: payload.offset,
134+
limit: payload.limit,
135+
searchText: payload.searchText,
136+
status: payload.status,
137+
visible: payload.visible,
138+
}),
125139
getCertification: (
126140
_: unknown,
127141
{ certificationId }: { certificationId: string },

packages/reva-api/modules/referential/referential.security.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ export const referentialResolversSecurityMap = {
1414
"Mutation.*": defaultSecurity,
1515

1616
"Query.searchCertificationsForAdmin": [hasRole(["admin"])],
17-
17+
"Query.searchCertificationsV2ForRegistryManager": [
18+
hasRole(["admin", "manage_certification_registry"]),
19+
],
1820
"Mutation.referential_updateCertification": [hasRole(["admin"])],
1921
"Mutation.referential_replaceCertification": [hasRole(["admin"])],
2022
"Mutation.referential_updateCompetenceBlocsByCertificationId": [

0 commit comments

Comments
 (0)