From 1e5bc6ccba9053246e4767aa6c2da46ff776203e Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Sat, 29 Nov 2025 12:20:14 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20D=C3=A9but=20de=20suppression=20de=20do?= =?UTF-8?q?cuseal=20c=C3=B4t=C3=A9=20Front=20[#N3WTS-17]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Front-End/next.config.mjs | 5 - Front-End/package-lock.json | 11 -- Front-End/package.json | 1 - Front-End/src/app/[locale]/admin/page.js | 20 --- .../src/app/[locale]/admin/structure/page.js | 3 +- .../subscriptions/createSubscription/page.js | 136 +++++++++--------- .../subscriptions/editSubscription/page.js | 3 +- .../[locale]/parents/editSubscription/page.js | 3 +- .../app/actions/registerFileGroupAction.js | 65 +-------- Front-End/src/components/ProfileSelector.js | 6 +- .../Structure/Files/FileUploadDocuSeal.js | 96 +++---------- .../Structure/Files/FilesGroupsManagement.js | 114 +++++---------- Front-End/src/context/EstablishmentContext.js | 16 --- .../src/pages/api/docuseal/cloneTemplate.js | 41 ------ .../api/docuseal/downloadTemplate/[slug].js | 35 ----- .../src/pages/api/docuseal/generateToken.js | 34 ----- .../src/pages/api/docuseal/removeTemplate.js | 34 ----- Front-End/src/utils/Url.js | 12 -- docker-compose.yml | 6 +- 19 files changed, 129 insertions(+), 512 deletions(-) delete mode 100644 Front-End/src/pages/api/docuseal/cloneTemplate.js delete mode 100644 Front-End/src/pages/api/docuseal/downloadTemplate/[slug].js delete mode 100644 Front-End/src/pages/api/docuseal/generateToken.js delete mode 100644 Front-End/src/pages/api/docuseal/removeTemplate.js diff --git a/Front-End/next.config.mjs b/Front-End/next.config.mjs index 01cf87a..993dada 100644 --- a/Front-End/next.config.mjs +++ b/Front-End/next.config.mjs @@ -42,14 +42,9 @@ const nextConfig = { NEXT_PUBLIC_USE_FAKE_DATA: process.env.NEXT_PUBLIC_USE_FAKE_DATA || 'false', AUTH_SECRET: process.env.AUTH_SECRET || 'false', NEXTAUTH_URL: process.env.NEXTAUTH_URL || 'http://localhost:3000', - DOCUSEAL_API_KEY: process.env.DOCUSEAL_API_KEY, }, async rewrites() { return [ - { - source: '/api/documents/:path*', - destination: 'https://api.docuseal.com/v1/documents/:path*', - }, { source: '/api/auth/:path*', destination: '/api/auth/:path*', // Exclure les routes NextAuth des réécritures de proxy diff --git a/Front-End/package-lock.json b/Front-End/package-lock.json index 07c265e..585b3db 100644 --- a/Front-End/package-lock.json +++ b/Front-End/package-lock.json @@ -8,7 +8,6 @@ "name": "n3wt-school-front-end", "version": "0.0.3", "dependencies": { - "@docuseal/react": "^1.0.56", "@radix-ui/react-dialog": "^1.1.2", "@tailwindcss/forms": "^0.5.9", "date-fns": "^4.1.0", @@ -537,11 +536,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@docuseal/react": { - "version": "1.0.66", - "resolved": "https://registry.npmjs.org/@docuseal/react/-/react-1.0.66.tgz", - "integrity": "sha512-rYG58gv8Uw1cTtjbHdgWgWBWpLMbIwDVsS3kN27w4sz/eDJilZieePUDS4eLKJ8keBN05BSjxD/iWQpaTBKZLg==" - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -11269,11 +11263,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@docuseal/react": { - "version": "1.0.66", - "resolved": "https://registry.npmjs.org/@docuseal/react/-/react-1.0.66.tgz", - "integrity": "sha512-rYG58gv8Uw1cTtjbHdgWgWBWpLMbIwDVsS3kN27w4sz/eDJilZieePUDS4eLKJ8keBN05BSjxD/iWQpaTBKZLg==" - }, "@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", diff --git a/Front-End/package.json b/Front-End/package.json index cc0a551..335df53 100644 --- a/Front-End/package.json +++ b/Front-End/package.json @@ -14,7 +14,6 @@ "test:coverage": "jest --coverage" }, "dependencies": { - "@docuseal/react": "^1.0.56", "@radix-ui/react-dialog": "^1.1.2", "@tailwindcss/forms": "^0.5.9", "date-fns": "^4.1.0", diff --git a/Front-End/src/app/[locale]/admin/page.js b/Front-End/src/app/[locale]/admin/page.js index 5b26f91..787f3d2 100644 --- a/Front-End/src/app/[locale]/admin/page.js +++ b/Front-End/src/app/[locale]/admin/page.js @@ -36,7 +36,6 @@ export default function DashboardPage() { const { selectedEstablishmentId, selectedEstablishmentTotalCapacity, - apiDocuseal, } = useEstablishment(); const [statusDistribution, setStatusDistribution] = useState([ @@ -165,25 +164,6 @@ export default function DashboardPage() { return (
-
- - {apiDocuseal ? ( - - ) : ( - - )} - {apiDocuseal - ? 'Clé API Docuseal renseignée' - : 'Clé API Docuseal manquante'} - -
- {/* Statistiques principales */}
{ if (selectedEstablishmentId) { @@ -353,7 +353,6 @@ export default function Page() {
), diff --git a/Front-End/src/app/[locale]/admin/subscriptions/createSubscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/createSubscription/page.js index d978e34..0276232 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/createSubscription/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/createSubscription/page.js @@ -35,7 +35,6 @@ import { fetchRegistrationFileGroups, fetchRegistrationSchoolFileMasters, fetchRegistrationParentFileMasters, - cloneTemplate, createRegistrationSchoolFileTemplate, createRegistrationParentFileTemplate, } from '@/app/actions/registerFileGroupAction'; @@ -96,7 +95,7 @@ export default function CreateSubscriptionPage() { const { getNiveauLabel } = useClasses(); const formDataRef = useRef(formData); - const { selectedEstablishmentId, apiDocuseal } = useEstablishment(); + const { selectedEstablishmentId } = useEstablishment(); const csrfToken = useCsrfToken(); const router = useRouter(); @@ -530,56 +529,57 @@ export default function CreateSubscriptionPage() { const parentMasters = parentFileMasters.filter((file) => file.groups.includes(selectedFileGroup) ); + createRegistrationSchoolFileTemplate( + cloneData, + csrfToken + ) + .then((response) => + logger.debug('Template enregistré avec succès:', response) + ) + .catch((error) => { + setIsLoading(false); + logger.error( + "Erreur lors de l'enregistrement du template:", + error + ); + showNotification( + "Erreur lors de la création du dossier d'inscription", + 'error', + 'Erreur', + 'ERR_ADM_SUB_03' + ); + }); - const clonePromises = masters.map((templateMaster) => - cloneTemplate( - templateMaster.id, - formDataRef.current.guardianEmail, - templateMaster.is_required, - selectedEstablishmentId, - apiDocuseal + const clonePromises = masters.map((templateMaster) => { + const cloneData = { + name: `${templateMaster.name}_${formDataRef.current.studentFirstName}_${formDataRef.current.studentLastName}`, + slug: clonedDocument.slug, + id: clonedDocument.id, + master: templateMaster.id, + registration_form: data.student.id, + }; + + return createRegistrationSchoolFileTemplate( + cloneData, + csrfToken ) - .then((clonedDocument) => { - const cloneData = { - name: `${templateMaster.name}_${formDataRef.current.studentFirstName}_${formDataRef.current.studentLastName}`, - slug: clonedDocument.slug, - id: clonedDocument.id, - master: templateMaster.id, - registration_form: data.student.id, - }; - - return createRegistrationSchoolFileTemplate( - cloneData, - csrfToken - ) - .then((response) => - logger.debug('Template enregistré avec succès:', response) - ) - .catch((error) => { - setIsLoading(false); - logger.error( - "Erreur lors de l'enregistrement du template:", - error - ); - showNotification( - "Erreur lors de la création du dossier d'inscription", - 'error', - 'Erreur', - 'ERR_ADM_SUB_03' - ); - }); - }) - .catch((error) => { - setIsLoading(false); - logger.error('Error during cloning or sending:', error); - showNotification( - "Erreur lors de la création du dossier d'inscription", - 'error', - 'Erreur', - 'ERR_ADM_SUB_05' - ); - }) - ); + .then((response) => + logger.debug('Template enregistré avec succès:', response) + ) + .catch((error) => { + setIsLoading(false); + logger.error( + "Erreur lors de l'enregistrement du template:", + error + ); + showNotification( + "Erreur lors de la création du dossier d'inscription", + 'error', + 'Erreur', + 'ERR_ADM_SUB_03' + ); + }); + }); // Clonage des parentFileTemplates const parentClonePromises = parentMasters.map((parentMaster) => { @@ -592,25 +592,25 @@ export default function CreateSubscriptionPage() { parentTemplateData, csrfToken ) - .then((response) => - logger.debug( - 'Parent template enregistré avec succès:', - response - ) + .then((response) => + logger.debug( + 'Parent template enregistré avec succès:', + response ) - .catch((error) => { - setIsLoading(false); - logger.error( - "Erreur lors de l'enregistrement du parent template:", - error - ); - showNotification( - "Erreur lors de la création du dossier d'inscription", - 'error', - 'Erreur', - 'ERR_ADM_SUB_02' - ); - }); + ) + .catch((error) => { + setIsLoading(false); + logger.error( + "Erreur lors de l'enregistrement du parent template:", + error + ); + showNotification( + "Erreur lors de la création du dossier d'inscription", + 'error', + 'Erreur', + 'ERR_ADM_SUB_02' + ); + }); }); // Attendre que tous les clones soient créés diff --git a/Front-End/src/app/[locale]/admin/subscriptions/editSubscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/editSubscription/page.js index 92aab2c..eeee5cd 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/editSubscription/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/editSubscription/page.js @@ -19,7 +19,7 @@ export default function Page() { const [formErrors, setFormErrors] = useState({}); const csrfToken = useCsrfToken(); - const { selectedEstablishmentId, apiDocuseal } = useEstablishment(); + const { selectedEstablishmentId } = useEstablishment(); const [isLoading, setIsLoading] = useState(false); const handleSubmit = (data) => { @@ -59,7 +59,6 @@ export default function Page() { studentId={studentId} csrfToken={csrfToken} selectedEstablishmentId={selectedEstablishmentId} - apiDocuseal = {apiDocuseal} onSubmit={handleSubmit} cancelUrl={FE_ADMIN_SUBSCRIPTIONS_URL} errors={formErrors} diff --git a/Front-End/src/app/[locale]/parents/editSubscription/page.js b/Front-End/src/app/[locale]/parents/editSubscription/page.js index 8b8ffcd..74c9b5e 100644 --- a/Front-End/src/app/[locale]/parents/editSubscription/page.js +++ b/Front-End/src/app/[locale]/parents/editSubscription/page.js @@ -17,7 +17,7 @@ export default function Page() { const enable = searchParams.get('enabled') === 'true'; const router = useRouter(); const csrfToken = useCsrfToken(); - const { selectedEstablishmentId, apiDocuseal } = useEstablishment(); + const { selectedEstablishmentId } = useEstablishment(); const [isLoading, setIsLoading] = useState(false); const handleSubmit = (data) => { @@ -53,7 +53,6 @@ export default function Page() { studentId={studentId} csrfToken={csrfToken} selectedEstablishmentId={selectedEstablishmentId} - apiDocuseal = {apiDocuseal} onSubmit={handleSubmit} cancelUrl={FE_PARENTS_HOME_URL} enable={enable} diff --git a/Front-End/src/app/actions/registerFileGroupAction.js b/Front-End/src/app/actions/registerFileGroupAction.js index 4783c74..1750254 100644 --- a/Front-End/src/app/actions/registerFileGroupAction.js +++ b/Front-End/src/app/actions/registerFileGroupAction.js @@ -3,11 +3,7 @@ import { BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL, BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_MASTERS_URL, BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL, - BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_TEMPLATES_URL, - FE_API_DOCUSEAL_CLONE_URL, - FE_API_DOCUSEAL_DOWNLOAD_URL, - FE_API_DOCUSEAL_GENERATE_TOKEN, - FE_API_DOCUSEAL_DELETE_URL + BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_TEMPLATES_URL } from '@/utils/Url'; import { errorHandler, requestResponseHandler } from './actionsHandlers'; @@ -327,62 +323,3 @@ export const deleteRegistrationParentFileTemplate = (id, csrfToken) => { } ); }; - -// API requests -export const removeTemplate = (templateId, selectedEstablishmentId, apiDocuseal) => { - return fetch(`${FE_API_DOCUSEAL_DELETE_URL}`, { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - templateId, - establishment_id :selectedEstablishmentId, - apiDocuseal - }), - }) - .then(requestResponseHandler) - .catch(errorHandler); -}; - -export const cloneTemplate = (templateId, email, is_required, selectedEstablishmentId, apiDocuseal) => { - return fetch(`${FE_API_DOCUSEAL_CLONE_URL}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - templateId, - email, - is_required, - establishment_id :selectedEstablishmentId, - apiDocuseal - }), - }) - .then(requestResponseHandler) - .catch(errorHandler); -}; - -export const downloadTemplate = (slug, selectedEstablishmentId, apiDocuseal) => { - const url = `${FE_API_DOCUSEAL_DOWNLOAD_URL}/${slug}?establishment_id=${selectedEstablishmentId}&apiDocuseal=${apiDocuseal}`; - return fetch(url, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }) - .then(requestResponseHandler) - .catch(errorHandler); -}; - -export const generateToken = (email, id = null, selectedEstablishmentId, apiDocuseal) => { - return fetch(`${FE_API_DOCUSEAL_GENERATE_TOKEN}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ user_email: email, id, establishment_id :selectedEstablishmentId, apiDocuseal }), - }) - .then(requestResponseHandler) - .catch(errorHandler); -}; diff --git a/Front-End/src/components/ProfileSelector.js b/Front-End/src/components/ProfileSelector.js index 25fde35..a3d9520 100644 --- a/Front-End/src/components/ProfileSelector.js +++ b/Front-End/src/components/ProfileSelector.js @@ -24,8 +24,7 @@ const ProfileSelector = ({ onRoleChange, className = '' }) => { setSelectedEstablishmentEvaluationFrequency, setSelectedEstablishmentTotalCapacity, selectedEstablishmentLogo, - setSelectedEstablishmentLogo, - setApiDocuseal + setSelectedEstablishmentLogo } = useEstablishment(); const { isConnected, connectionStatus } = useChatConnection(); const [dropdownOpen, setDropdownOpen] = useState(false); @@ -41,8 +40,6 @@ const ProfileSelector = ({ onRoleChange, className = '' }) => { user.roles[roleId].establishment__total_capacity; const establishmentLogo = user.roles[roleId].establishment__logo; - const establishmentApiDocuseal = - user.roles[roleId].establishment__api_docuseal; setProfileRole(role); setSelectedEstablishmentId(establishmentId); setSelectedEstablishmentEvaluationFrequency( @@ -50,7 +47,6 @@ const ProfileSelector = ({ onRoleChange, className = '' }) => { ); setSelectedEstablishmentTotalCapacity(establishmentTotalCapacity); setSelectedEstablishmentLogo(establishmentLogo); - setApiDocuseal(establishmentApiDocuseal); setSelectedRoleId(roleId); if (onRoleChange) { onRoleChange(roleId); diff --git a/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js b/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js index a3173ea..7bed94d 100644 --- a/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js +++ b/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js @@ -2,10 +2,7 @@ import React, { useState, useEffect } from 'react'; import { fetchRegistrationFileGroups, createRegistrationSchoolFileTemplate, - cloneTemplate, - generateToken, } from '@/app/actions/registerFileGroupAction'; -import { DocusealBuilder } from '@docuseal/react'; import logger from '@/utils/logger'; import MultiSelect from '@/components/Form/MultiSelect'; // Import du composant MultiSelect import { useCsrfToken } from '@/context/CsrfContext'; @@ -19,7 +16,6 @@ export default function FileUploadDocuSeal({ onSuccess, }) { const [groups, setGroups] = useState([]); - const [token, setToken] = useState(null); const [templateMaster, setTemplateMaster] = useState(null); const [uploadedFileName, setUploadedFileName] = useState(''); const [selectedGroups, setSelectedGroups] = useState([]); @@ -30,7 +26,7 @@ export default function FileUploadDocuSeal({ const csrfToken = useCsrfToken(); - const { selectedEstablishmentId, user, apiDocuseal } = useEstablishment(); + const { selectedEstablishmentId, user } = useEstablishment(); useEffect(() => { fetchRegistrationFileGroups(selectedEstablishmentId).then((data) => @@ -47,15 +43,6 @@ export default function FileUploadDocuSeal({ if (!user && !user?.email) { return; } - const id = fileToEdit ? fileToEdit.id : null; - - generateToken(user?.email, id, selectedEstablishmentId, apiDocuseal) - .then((data) => { - setToken(data.token); - }) - .catch((error) => - logger.error('Erreur lors de la génération du token:', error) - ); }, [fileToEdit]); const handleGroupChange = (selectedGroups) => { @@ -121,41 +108,25 @@ export default function FileUploadDocuSeal({ guardianDetails.forEach((guardian, index) => { logger.debug('creation du clone avec required : ', is_required); - cloneTemplate( - templateMaster?.id, - guardian.email, - is_required, - selectedEstablishmentId, - apiDocuseal - ) - .then((clonedDocument) => { - // Sauvegarde des schoolFileTemplates clonés dans la base de données - const data = { - name: `${uploadedFileName}_${guardian.first_name}_${guardian.last_name}`, - slug: clonedDocument.slug, - id: clonedDocument.id, - master: templateMaster?.id, - registration_form: guardian.registration_form, - }; - logger.debug('creation : ', data); - createRegistrationSchoolFileTemplate(data, csrfToken) - .then((response) => { - logger.debug('Template enregistré avec succès:', response); - onSuccess(); - }) - .catch((error) => { - logger.error( - "Erreur lors de l'enregistrement du template:", - error - ); - }); - - // Logique pour envoyer chaque template au submitter - logger.debug('Sending template to:', guardian.email); - }) - .catch((error) => { - logger.error('Error during cloning or sending:', error); - }); + const data = { + name: `${uploadedFileName}_${guardian.first_name}_${guardian.last_name}`, + slug: clonedDocument.slug, + id: clonedDocument.id, + master: templateMaster?.id, + registration_form: guardian.registration_form, + }; + logger.debug('creation : ', data); + createRegistrationSchoolFileTemplate(data, csrfToken) + .then((response) => { + logger.debug('Template enregistré avec succès:', response); + onSuccess(); + }) + .catch((error) => { + logger.error( + "Erreur lors de l'enregistrement du template:", + error + ); + }); }); } }; @@ -212,32 +183,7 @@ export default function FileUploadDocuSeal({ {/* Zone de configuration des documents */}
- {token && ( -
- {/* Description de l'étape */} -

- Étape 2 - Sélectionnez un document -

- - -
- )} +
)} diff --git a/Front-End/src/components/Structure/Files/FilesGroupsManagement.js b/Front-End/src/components/Structure/Files/FilesGroupsManagement.js index 499d564..7f851c3 100644 --- a/Front-End/src/components/Structure/Files/FilesGroupsManagement.js +++ b/Front-End/src/components/Structure/Files/FilesGroupsManagement.js @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import { Download, Edit3, Trash2, FolderPlus, Signature, AlertTriangle } from 'lucide-react'; import Modal from '@/components/Modal'; import Table from '@/components/Table'; -import FileUploadDocuSeal from '@/components/Structure/Files/FileUploadDocuSeal'; import { BASE_URL } from '@/utils/Url'; import { // GET @@ -33,11 +32,11 @@ import Popup from '@/components/Popup'; import Loader from '@/components/Loader'; import { useNotification } from '@/context/NotificationContext'; import AlertMessage from '@/components/AlertMessage'; +import FileUploadDocuSeal from '@/components/Structure/Files/FileUploadDocuSeal'; export default function FilesGroupsManagement({ csrfToken, - selectedEstablishmentId, - apiDocuseal + selectedEstablishmentId }) { const [schoolFileMasters, setSchoolFileMasters] = useState([]); const [schoolFileTemplates, setSchoolFileTemplates] = useState([]); @@ -116,72 +115,24 @@ export default function FilesGroupsManagement({ ); setRemovePopupOnConfirm(() => () => { setIsLoading(true); - // Supprimer les clones associés via l'API DocuSeal - const removeClonesPromises = [ - ...schoolFileTemplates - .filter((template) => template.master === templateMaster.id) - .map((template) => - removeTemplate(template.id, selectedEstablishmentId, apiDocuseal) - ), - removeTemplate(templateMaster.id, selectedEstablishmentId, apiDocuseal), - ]; + // Supprimer le template master de la base de données + deleteRegistrationSchoolFileMaster(templateMaster.id, csrfToken) + .then((response) => { + if (response.ok) { + setSchoolFileMasters( + schoolFileMasters.filter( + (fichier) => fichier.id !== templateMaster.id + ) + ); + showNotification( + `Le document "${templateMaster.name}" a été correctement supprimé.`, + 'success', + 'Succès' + ); - // Attendre que toutes les suppressions dans DocuSeal soient terminées - Promise.all(removeClonesPromises) - .then((responses) => { - const allSuccessful = responses.every((response) => response && response.id); - if (allSuccessful) { - logger.debug('Master et clones supprimés avec succès de DocuSeal.'); - - // Supprimer le template master de la base de données - deleteRegistrationSchoolFileMaster(templateMaster.id, csrfToken) - .then((response) => { - if (response.ok) { - setSchoolFileMasters( - schoolFileMasters.filter( - (fichier) => fichier.id !== templateMaster.id - ) - ); - showNotification( - `Le document "${templateMaster.name}" a été correctement supprimé.`, - 'success', - 'Succès' - ); - - setRemovePopupVisible(false); - setIsLoading(false); - } else { - showNotification( - `Erreur lors de la suppression du document "${templateMaster.name}".`, - 'error', - 'Erreur' - ); - setRemovePopupVisible(false); - setIsLoading(false); - } - }) - .catch((error) => { - logger.error('Error deleting file from database:', error); - showNotification( - `Erreur lors de la suppression du document "${templateMaster.name}".`, - 'error', - 'Erreur' - ); - setRemovePopupVisible(false); - setIsLoading(false); - }); - } else { - showNotification( - `Erreur lors de la suppression du document "${templateMaster.name}".`, - 'error', - 'Erreur' - ); - setRemovePopupVisible(false); - setIsLoading(false); - } - }) - .catch((error) => { - logger.error('Error removing template from DocuSeal:', error); + setRemovePopupVisible(false); + setIsLoading(false); + } else { showNotification( `Erreur lors de la suppression du document "${templateMaster.name}".`, 'error', @@ -189,7 +140,18 @@ export default function FilesGroupsManagement({ ); setRemovePopupVisible(false); setIsLoading(false); - }); + } + }) + .catch((error) => { + logger.error('Error deleting file from database:', error); + showNotification( + `Erreur lors de la suppression du document "${templateMaster.name}".`, + 'error', + 'Erreur' + ); + setRemovePopupVisible(false); + setIsLoading(false); + }); }); }; @@ -542,25 +504,13 @@ export default function FilesGroupsManagement({ icon={Signature} title="Formulaires à remplir" description="Gérez les formulaires nécessitant une signature électronique." - button={apiDocuseal} + button={true} buttonOpeningModal={true} onClick={() => { setIsModalOpen(true); setIsEditing(false); }} /> -
- - {!apiDocuseal && ( - - )} - {!apiDocuseal && 'Clé API Docuseal manquante'} - -
{ const storedUser = sessionStorage.getItem('user'); return storedUser ? JSON.parse(storedUser) : null; }); - const [apiDocuseal, setApiDocusealState] = useState(() => { - const storedApiDocuseal = sessionStorage.getItem('apiDocuseal'); - return storedApiDocuseal ? JSON.parse(storedApiDocuseal) : null; - }); const [selectedEstablishmentLogo, setSelectedEstablishmentLogoState] = useState(() => { const storedLogo = sessionStorage.getItem('selectedEstablishmentLogo'); return storedLogo ? JSON.parse(storedLogo) : null; @@ -94,11 +90,6 @@ export const EstablishmentProvider = ({ children }) => { sessionStorage.setItem('user', JSON.stringify(user)); }; - const setApiDocuseal = (api) => { - setApiDocusealState(api); - sessionStorage.setItem('apiDocuseal', JSON.stringify(api)); - }; - const setSelectedEstablishmentLogo = (logo) => { setSelectedEstablishmentLogoState(logo); sessionStorage.setItem('selectedEstablishmentLogo', JSON.stringify(logo)); @@ -122,7 +113,6 @@ export const EstablishmentProvider = ({ children }) => { name: role.establishment__name, evaluation_frequency: role.establishment__evaluation_frequency, total_capacity: role.establishment__total_capacity, - api_docuseal: role.establishment__api_docuseal, logo: role.establishment__logo, role_id: i, role_type: role.role_type, @@ -143,9 +133,6 @@ export const EstablishmentProvider = ({ children }) => { setSelectedEstablishmentTotalCapacity( userEstablishments[roleIndexDefault].total_capacity ); - setApiDocuseal( - userEstablishments[roleIndexDefault].api_docuseal - ); setSelectedEstablishmentLogo( userEstablishments[roleIndexDefault].logo ); @@ -168,7 +155,6 @@ export const EstablishmentProvider = ({ children }) => { setUserState(null); setSelectedEstablishmentEvaluationFrequencyState(null); setSelectedEstablishmentTotalCapacityState(null); - setApiDocusealState(null); setSelectedEstablishmentLogoState(null); sessionStorage.clear(); }; @@ -184,8 +170,6 @@ export const EstablishmentProvider = ({ children }) => { setSelectedEstablishmentEvaluationFrequency, selectedEstablishmentTotalCapacity, setSelectedEstablishmentTotalCapacity, - apiDocuseal, - setApiDocuseal, selectedEstablishmentLogo, setSelectedEstablishmentLogo, selectedRoleId, diff --git a/Front-End/src/pages/api/docuseal/cloneTemplate.js b/Front-End/src/pages/api/docuseal/cloneTemplate.js deleted file mode 100644 index 8f9aeaa..0000000 --- a/Front-End/src/pages/api/docuseal/cloneTemplate.js +++ /dev/null @@ -1,41 +0,0 @@ -import logger from '@/utils/logger'; -import { BE_DOCUSEAL_CLONE_TEMPLATE } from '@/utils/Url'; - -export default function handler(req, res) { - if (req.method === 'POST') { - const { templateId, email, is_required, establishment_id, apiDocuseal } = req.body; - - fetch(BE_DOCUSEAL_CLONE_TEMPLATE, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Auth-Token': apiDocuseal, - }, - body: JSON.stringify({ - templateId, - email, - is_required, - establishment_id, - }), - }) - .then((response) => { - if (!response.ok) { - return response.json().then((err) => { - throw new Error(err.message); - }); - } - return response.json(); - }) - .then((data) => { - logger.debug('Template cloned successfully:', data); - res.status(200).json(data); - }) - .catch((error) => { - logger.error('Error cloning template:', error); - res.status(500).json({ error: 'Internal Server Error' }); - }); - } else { - res.setHeader('Allow', ['POST']); - res.status(405).end(`Method ${req.method} Not Allowed`); - } -} diff --git a/Front-End/src/pages/api/docuseal/downloadTemplate/[slug].js b/Front-End/src/pages/api/docuseal/downloadTemplate/[slug].js deleted file mode 100644 index 9ae309c..0000000 --- a/Front-End/src/pages/api/docuseal/downloadTemplate/[slug].js +++ /dev/null @@ -1,35 +0,0 @@ -import logger from '@/utils/logger'; -import { BE_DOCUSEAL_DOWNLOAD_TEMPLATE } from '@/utils/Url'; - -export default function handler(req, res) { - if (req.method === 'GET') { - const { slug, establishment_id, apiDocuseal } = req.query; - logger.debug('slug : ', slug); - - fetch(`${BE_DOCUSEAL_DOWNLOAD_TEMPLATE}/${slug}?establishment_id=${establishment_id}`, { - method: 'GET', - headers: { - 'X-Auth-Token': apiDocuseal, - }, - }) - .then((response) => { - if (!response.ok) { - return response.json().then((err) => { - throw new Error(err.message); - }); - } - return response.json(); - }) - .then((data) => { - logger.debug('Template downloaded successfully:', data); - res.status(200).json(data); - }) - .catch((error) => { - logger.error('Error downloading template:', error); - res.status(500).json({ error: 'Internal Server Error' }); - }); - } else { - res.setHeader('Allow', ['GET']); - res.status(405).end(`Method ${req.method} Not Allowed`); - } -} diff --git a/Front-End/src/pages/api/docuseal/generateToken.js b/Front-End/src/pages/api/docuseal/generateToken.js deleted file mode 100644 index 2069abe..0000000 --- a/Front-End/src/pages/api/docuseal/generateToken.js +++ /dev/null @@ -1,34 +0,0 @@ -import logger from '@/utils/logger'; -import { BE_DOCUSEAL_GET_JWT } from '@/utils/Url'; - -export default function handler(req, res) { - if (req.method === 'POST') { - const { apiDocuseal, ...rest } = req.body; - - fetch(BE_DOCUSEAL_GET_JWT, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Auth-Token': apiDocuseal, - }, - body: JSON.stringify(rest), - }) - .then((response) => { - logger.debug('Response status:', response.status); - return response - .json() - .then((data) => ({ status: response.status, data })); - }) - .then(({ status, data }) => { - logger.debug('Response data:', data); - res.status(status).json(data); - }) - .catch((error) => { - logger.error('Error:', error); - res.status(500).json({ error: 'Internal Server Error' }); - }); - } else { - res.setHeader('Allow', ['POST']); - res.status(405).end(`Method ${req.method} Not Allowed`); - } -} diff --git a/Front-End/src/pages/api/docuseal/removeTemplate.js b/Front-End/src/pages/api/docuseal/removeTemplate.js deleted file mode 100644 index b3a9467..0000000 --- a/Front-End/src/pages/api/docuseal/removeTemplate.js +++ /dev/null @@ -1,34 +0,0 @@ -import logger from '@/utils/logger'; -import { BE_DOCUSEAL_REMOVE_TEMPLATE } from '@/utils/Url'; - -export default function handler(req, res) { - if (req.method === 'DELETE') { - const { templateId, establishment_id, apiDocuseal } = req.body; - - fetch(`${BE_DOCUSEAL_REMOVE_TEMPLATE}/${templateId}?establishment_id=${establishment_id}`, { - method: 'DELETE', - headers: { - 'X-Auth-Token': apiDocuseal, - }, - }) - .then((response) => { - if (!response.ok) { - return response.json().then((err) => { - throw new Error(err.message); - }); - } - return response.json(); - }) - .then((data) => { - logger.debug('Template removed successfully:', data); - res.status(200).json(data); - }) - .catch((error) => { - logger.error('Error removing template:', error); - res.status(500).json({ error: 'Internal Server Error' }); - }); - } else { - res.setHeader('Allow', ['DELETE']); - res.status(405).end(`Method ${req.method} Not Allowed`); - } -} diff --git a/Front-End/src/utils/Url.js b/Front-End/src/utils/Url.js index 7bddc8e..3064a15 100644 --- a/Front-End/src/utils/Url.js +++ b/Front-End/src/utils/Url.js @@ -4,12 +4,6 @@ export const WS_BASE_URL = process.env.NEXT_PUBLIC_WSAPI_URL; //URL-Back-End -// GESTION DocuSeal -export const BE_DOCUSEAL_GET_JWT = `${BASE_URL}/DocuSeal/generateToken`; -export const BE_DOCUSEAL_CLONE_TEMPLATE = `${BASE_URL}/DocuSeal/cloneTemplate`; -export const BE_DOCUSEAL_REMOVE_TEMPLATE = `${BASE_URL}/DocuSeal/removeTemplate`; -export const BE_DOCUSEAL_DOWNLOAD_TEMPLATE = `${BASE_URL}/DocuSeal/downloadTemplate`; - // GESTION LOGIN export const BE_AUTH_NEW_PASSWORD_URL = `${BASE_URL}/Auth/newPassword`; export const BE_AUTH_REGISTER_URL = `${BASE_URL}/Auth/subscribe`; @@ -131,12 +125,6 @@ export const FE_PARENTS_HOME_URL = '/parents'; export const FE_PARENTS_MESSAGERIE_URL = '/parents/messagerie'; export const FE_PARENTS_EDIT_SUBSCRIPTION_URL = '/parents/editSubscription'; -// API DOCUSEAL -export const FE_API_DOCUSEAL_GENERATE_TOKEN = '/api/docuseal/generateToken'; -export const FE_API_DOCUSEAL_CLONE_URL = '/api/docuseal/cloneTemplate'; -export const FE_API_DOCUSEAL_DOWNLOAD_URL = '/api/docuseal/downloadTemplate'; -export const FE_API_DOCUSEAL_DELETE_URL = '/api/docuseal/removeTemplate'; - /** * Fonction pour obtenir l'URL de redirection en fonction du rôle * @param {RIGHTS} role diff --git a/docker-compose.yml b/docker-compose.yml index f000e9a..9f85f5d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,10 +10,10 @@ services: database: image: "postgres:latest" - expose: - - 5432 + ports: + - "5432:5432" volumes: - - postgres-data:/var/lib/postgresql/data + - postgres-data:/var/lib/postgresql environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres