Skip to content

Commit 69e3ee7

Browse files
committed
feat(core): gestion des fichiers hébergés sur Docs de La suite numérique
1 parent 0fb3a31 commit 69e3ee7

5 files changed

Lines changed: 36 additions & 2 deletions

File tree

app/js/core/chatbot/helpers/fetch.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ export async function fetchContent(url) {
77
if (!response.ok) {
88
throw new Error(`Erreur lors de la récupération du fichier : ${url}`);
99
}
10+
if (url.includes("docs.numerique.gouv.fr/")) {
11+
// Cas particulier des fichiers hébergés sur Docs de La Suite numérique
12+
// Le contenu est un JSON qu'il faut traiter pour en extraire le Markdown
13+
const content = await response.json().then((data) => {
14+
const markdownContent = `${data.content}`.replaceAll("***", "---");
15+
return markdownContent;
16+
});
17+
return content;
18+
}
1019
return response.text();
1120
}
1221

app/js/utils/urls.mjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ function handleURLfromFramapad(url) {
4949
return url.replace(/\?.*/, "") + "/export/txt";
5050
}
5151

52+
// gestion des fichiers hébergés sur Docs de La Suite numérique
53+
function isDocsSuiteNumeriqueURL(url) {
54+
return url.includes("docs.numerique.gouv.fr/");
55+
}
56+
function handleURLfromDocsSuiteNumerique(url) {
57+
const documentIdMatch = url.match(/docs\/([a-z0-9-]+)\//);
58+
if (documentIdMatch) {
59+
const documentId = documentIdMatch[1];
60+
return `https://docs.numerique.gouv.fr/api/v1.0/documents/${documentId}/content/?content_format=markdown`;
61+
} else return "";
62+
}
63+
5264
function handleKnownHosts(url, shouldAddCorsProxy) {
5365
if (url.includes(".forge")) {
5466
shouldAddCorsProxy = false;
@@ -61,6 +73,9 @@ function handleKnownHosts(url, shouldAddCorsProxy) {
6173
} else if (isFramapadURL(url)) {
6274
shouldAddCorsProxy = false;
6375
url = handleURLfromFramapad(url);
76+
} else if (isDocsSuiteNumeriqueURL(url)) {
77+
shouldAddCorsProxy = false;
78+
url = handleURLfromDocsSuiteNumerique(url);
6479
}
6580
return { url, shouldAddCorsProxy };
6681
}

app/script.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/script.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/unit/utils/urls.spec.mjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,16 @@ describe("handleURL", () => {
191191
);
192192
});
193193

194+
it("handles files from Docs / La suite numérique and returns the API URL to fetch the markdown content", () => {
195+
const url =
196+
"https://docs.numerique.gouv.fr/docs/7066cdaa-16b4-4bd8-a06b-e1de20ae402d/";
197+
const options = {};
198+
const result = handleURL(url, options);
199+
expect(result).toBe(
200+
"https://docs.numerique.gouv.fr/api/v1.0/documents/7066cdaa-16b4-4bd8-a06b-e1de20ae402d/content/?content_format=markdown",
201+
);
202+
});
203+
194204
it("does not add CORS proxy for URLs from the .forge domain", () => {
195205
const url = "https://group.forge.apps.education.fr/repo/file.md";
196206
const options = {};

0 commit comments

Comments
 (0)