From d2b608ef941585ebc25451eb8e9d075dc0b5bee8 Mon Sep 17 00:00:00 2001 From: Omar Oughriss Date: Fri, 18 Jul 2025 14:41:29 +0200 Subject: [PATCH] Rename the main server just for now --- src/main-server.js | 179 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/main-server.js diff --git a/src/main-server.js b/src/main-server.js new file mode 100644 index 0000000..957a2a1 --- /dev/null +++ b/src/main-server.js @@ -0,0 +1,179 @@ +const express = require('express'); +const cors = require('cors'); +const fetch = require('node-fetch'); + +// Initialisation de l'application Express +const app = express(); +const PORT = process.env.PORT || 8080; + +// Configuration CORS +const corsOptions = { + origin: ['http://local.lecoffreio.4nkweb:3000', 'http://localhost:3000'], + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'] +}; + +app.use(cors(corsOptions)); +app.use(express.json()); + +function getOfficeStatus(statusName) { + switch (statusName) { + case 'Pourvu': + return 'ACTIVATED'; + case 'Pourvu mais décédé': + return 'ACTIVATED'; + case 'Sans titulaire': + return 'ACTIVATED'; + case 'Vacance': + return 'ACTIVATED'; + case 'En activité': + return 'ACTIVATED'; + default: + return 'DESACTIVATED'; + } +} + +function getRole(roleName) { + switch (roleName) { + case 'Notaire titulaire': + return { name: 'admin', label: 'Administrateur' }; + case 'Notaire associé': + return { name: 'admin', label: 'Administrateur' }; + case 'Notaire salarié': + return { name: 'notary', label: 'Notaire' }; + case 'Collaborateur': + return { name: 'notary', label: 'Notaire' }; + case 'Suppléant': + return { name: 'notary', label: 'Notaire' }; + case 'Administrateur': + return { name: 'admin', label: 'Administrateur' }; + case 'Curateur': + return { name: 'notary', label: 'Notaire' }; + default: + return { name: 'default', label: 'Défaut' }; + } +} + +function getCivility(civility) { + switch (civility) { + case 'Monsieur': + return 'MALE'; + case 'Madame': + return 'FEMALE'; + default: + return 'OTHERS'; + } +} + +app.get('/api/v1/health', (req, res) => { + res.json({ message: 'OK' }); +}); + +app.post('/api/v1/idnot/user/:code', async (req, res) => { + const code = req.params.code; + + try { + const params = { + client_id: 'B3CE56353EDB15A9', + client_secret: '3F733549E879878344B6C949B366BB5CDBB2DB5B7F7AB7EBBEBB0F0DD0776D1C', + redirect_uri: 'http://local.lecoffreio.4nkweb:3000/authorized-client', + grant_type: 'authorization_code', + code: code + }; + + const tokens = await ( + await fetch('https://qual-connexion.idnot.fr/user/IdPOAuth2/token/idnot_idp_v1', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams(params).toString() + }) + ).json(); + + const jwt = tokens.id_token; + if (!jwt) { + console.error('jwt not defined'); + return null; + } + const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64').toString('utf8')); + + const searchParams = new URLSearchParams({ + key: 'ba557f84-0bf6-4dbf-844f-df2767555e3e' + }); + + let userData; + try { + userData = await ( + await fetch(`https://qual-api.notaires.fr/annuaire/api/pp/v2/rattachements/${payload.profile_idn}?` + searchParams, { + method: 'GET' + }) + ).json(); + } catch (error) { + console.error('Error fetching ' + `https://qual-api.notaires.fr/annuaire/api/pp/v2/rattachements/${payload.profile_idn}`, error); + return null; + } + if (!userData || !userData.statutDuRattachement || userData.entite.typeEntite.name !== 'office') { + console.error('User not attached to an office (May be a partner)'); + return null; + } + + let officeLocationData; + try { + officeLocationData = (await ( + await fetch(`https://qual-api.notaires.fr/annuaire${userData.entite.locationsUrl}?` + searchParams, + { + method: 'GET' + }) + ).json()); + } catch (error) { + console.error('Error fetching' + `https://qual-api.notaires.fr/annuaire${userData.entite.locationsUrl}`, error); + return null; + } + if (!officeLocationData || !officeLocationData.result || officeLocationData.result.length === 0) { + console.error('Office location data not found'); + return null; + } + + const idnotUser = { + idNot: payload.sub, + office: { + idNot: payload.entity_idn, + name: userData.entite.denominationSociale ?? userData.entite.codeCrpcen, + crpcen: userData.entite.codeCrpcen, + office_status: getOfficeStatus(userData.entite.statutEntite.name), + address: { + address: officeLocationData.result[0].adrGeo4, + city: officeLocationData.result[0].adrGeoVille.split(' ')[0] ?? officeLocationData.result[0].adrGeoVille, + zip_code: Number(officeLocationData.result[0].adrGeoCodePostal) + }, + status: 'ACTIVE' + }, + role: getRole(userData.typeLien.name), + contact: { + first_name: userData.personne.prenom, + last_name: userData.personne.nomUsuel, + email: userData.mailRattachement, + phone_number: userData.numeroTelephone, + cell_phone_number: userData.numeroMobile ?? userData.numeroTelephone, + civility: getCivility(userData.personne.civilite) + } + }; + + if (!idnotUser.contact.email) { + console.error("User pro email empty"); + return null; + } + + res.json(idnotUser); + } catch (error) { + res.status(500).json({ + error: 'Internal Server Error', + message: error.message + }); + } +}); + +app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); +});