Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b7ed0fe
Urcam-3 add microservice knowledge-base
jnesis-jbole Jul 25, 2025
861d297
Urcam-3 Mock feature knowledge-base
jnesis-jbole Jul 25, 2025
c992e15
Urcam-3 add microservice knowledge-base to package
jnesis-jbole Jul 25, 2025
e382aec
Urcam-3 add user-frontend-ionic project knowledge-base
jnesis-jbole Jul 25, 2025
4307c7d
add microservice knowledge-base
jnesis-jbole Jul 25, 2025
18587d9
add microservice knowledge-base .env.dist and prettierrc file
jnesis-jbole Jul 25, 2025
323119c
URCAM-3 fixed compilation bugs
jnesis-aaugen Jul 29, 2025
ea9433c
docs: update library list
actions-user Jul 30, 2025
597de5a
feat: URCAM-9 Add frontend page structure
tsimon-jnesis Aug 1, 2025
7a0ae5b
remove unused interface
jnesis-jbole Aug 1, 2025
c3f2a42
remove logout body fix test ( Will be handled by UL)
jnesis-jbole Aug 1, 2025
fb981dd
update readme
jnesis-jbole Aug 1, 2025
3445516
Merge pull request #1 from Rayshor/URCAM-3
jnesis-jbole Aug 1, 2025
15614c8
URCAM-4 Managing Pages in Wordpress (WIP)
jnesis-aaugen Aug 4, 2025
5860eaf
Merge branch 'jnesis' into URCAM-4
jnesis-aaugen Aug 4, 2025
a7e8088
URCAM-4 Update wordpress import files
jnesis-aaugen Aug 4, 2025
eadb1ce
URCAM-4 manage cover image in wordpress
jnesis-aaugen Aug 4, 2025
1e90f3f
Fix linting error
tsimon-jnesis Aug 4, 2025
4455f92
URCAM-4 manage search words information in wordpress
jnesis-aaugen Aug 4, 2025
a4e8813
Fix MR review
tsimon-jnesis Aug 5, 2025
cb4ca67
Fix errors
tsimon-jnesis Aug 5, 2025
cdc8d96
Merge pull request #2 from Rayshor/feat/URCAM-9-page-structure
jnesis-jbole Aug 5, 2025
2c72533
Merge branch 'jnesis' into URCAM-4
jnesis-aaugen Aug 5, 2025
306b403
URCAM-10 rights management
jnesis-aaugen Aug 6, 2025
8547e91
URCAM-4 add knowledge-base pods import, remove log
jnesis-jbole Aug 7, 2025
c59e8cb
Merge pull request #3 from Rayshor/URCAM-4
jnesis-jbole Aug 7, 2025
1c4442a
URCAM-6: Recherche dans les pages de la base de connaissance
jnesis-jbole Aug 28, 2025
d007b75
URCAM-12 Design : mode sombre
jnesis-jbole Aug 28, 2025
964a91e
URCAM-13: cover management
jnesis-aaugen Sep 2, 2025
01065ca
Merge pull request #7 from Rayshor/URCAM-13
jnesis-jbole Sep 2, 2025
d0c5d3b
URCAM-10: Fix MR review
jnesis-aaugen Sep 2, 2025
91fd0d1
Merge branch 'jnesis' into URCAM-10
jnesis-aaugen Sep 2, 2025
93149e2
Merge pull request #6 from Rayshor/URCAM-10
jnesis-jbole Sep 2, 2025
e5e30ac
URCAM-10 rights management : remove orphans after authorization
jnesis-aaugen Sep 24, 2025
5890d1b
Merge pull request #8 from Rayshor/URCAM-10
jnesis-jbole Sep 26, 2025
dfcae9c
Urcam 17- V2.1.0 + gestion du cache knowledge-base (#9)
jnesis-jbole Dec 16, 2025
5a2c570
Urcam 18 Renommer "informations" (#10)
jnesis-jbole Dec 16, 2025
c543cd9
URCAM-19 Fix graphql request (#11)
jnesis-jbole Dec 16, 2025
2c5fd1f
URCAM-20: Ajout lien authentifié dans la base de connaissance
jnesis-aaugen Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .run/backend_knowledge-base.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="backend/knowledge-base" type="js.build_tools.npm" folderName="Backend">
<package-json value="$PROJECT_DIR$/dev/user-backend-nest/microservices/knowledge-base/package.json" />
<command value="run" />
<scripts>
<script value="start:dev" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
</component>
13 changes: 13 additions & 0 deletions .run/frontend_knowledge-base.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="frontend/knowledge-base" type="js.build_tools.npm" folderName="Frontend">
<package-json value="$PROJECT_DIR$/dev/user-frontend-ionic/package.json" />
<command value="run" />
<scripts>
<script value="module:watch" />
</scripts>
<arguments value="knowledge-base" />
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
</component>
42 changes: 42 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,48 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

## 2.1.0 (2025-10-16)

### Client
#### Bug fixes
* Correction du mode *EdgeToEdge* pour Android
* Désactivation du plugin *EdgeToEdge* pour iOS
* **(app-update)**: Le client n'était plus capable de récupérer la version min requise suite au passage au multi-tenants
* **(chatbot)** : Balises non affichées dans les messages du chatbot
* **(features)** : Normalisation du contenu pour la recherche dans les services
* **(login)** : Afficher/masquer le mot de passe, utilisation du composant Ionic prévu à cet effet
* **(map)** : Prise en compte de l'état d'activation du service de localisation du système
* **(schedule)** : Suppression des espaces dans le champ *asUser* des gestionnaires
* **(shared)** : Navigation, correction faille XSS avec `Browser.open()`
* **(statistics)** : Correction erreur Matomo sur création de cookie sur mobile + utilisation de l'UUID générée pour les stats backend comme identifiant Matomo

#### Autres
* Mises à jour des dépendances suite aux alertes CVE

### Backend
#### Bug fixes
* **(contact-us)** : Prévention partielle des usurpations d'adresse email, et avertissement si l'utilisateur n'est pas connecté

#### New features
* **(auth)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(contact-us)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(features)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(important-news)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(notifications)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(social-networks)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS
* **(static-pages)** : Suppression du cache dans le microservice, déportation vers le connecteur CMS

#### Autres
* Mises à jour des dépendances suite aux alertes CVE

### Connecteurs
#### New features
* **(multi-cms-connector)** : Ajout de cache pour palier aux problèmes de performance côté CMS
* **(multi-cms-connector)** : Ajout de routes permettant de vider le cache via des webhooks côté CMS

#### Autres
* Mises à jour des dépendances suite aux alertes CVE

## 2.0.0 (2025-07-16)

### Client
Expand Down
3 changes: 3 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Upgrades

## 2.0.0 vers 2.1.0
→ [Mise à jour de la version 2.0.0 à la version 2.1.0](https://www.esup-portail.org/wiki/x/BQAwY)

## 1.2.0 vers 2.0.0
→ [Mise à jour de la version 1.2.0 à la version 2.0.0](https://www.esup-portail.org/wiki/x/A4AYWQ)

Expand Down
30 changes: 30 additions & 0 deletions dev/connectors/multi-cms-connector/.env.dist
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ DEFAULT_CMS=

# DIRECTUS
#DIRECTUS_API_URL=xxx
#DIRECTUS_ASSETS_PUBLIC_URL=xxx/assets
#DIRECTUS_API_TOKEN=xxx
#DIRECTUS_API_TIMEOUT=5000

Expand All @@ -20,3 +21,32 @@ DEFAULT_CMS=
#WORDPRESS_API_USERNAME=xxx
#WORDPRESS_API_PASSWORD=xxx
#WORDPRESS_API_TIMEOUT=5000

# CACHE (actif par défaut)
CACHE_ENABLED=true
# CACHE TTL (en millisecondes) + invalidation webhook possible
# Channels - 1 jour par défaut
CACHE_TTL_CHANNELS=86400000
# Contact Us - 1 jour par défaut
CACHE_TTL_CONTACT_US=86400000
# Features - 1 jour par défaut
CACHE_TTL_FEATURES=86400000
# Important News - 1 jour par défaut
CACHE_TTL_IMPORTANT_NEWS=86400000
# Login - 1 jour par défaut
CACHE_TTL_LOGIN=86400000
# Social Networks - 1 jour par défaut
CACHE_TTL_SOCIAL_NETWORKS=86400000
# Static Pages - 1 jour par défaut
CACHE_TTL_STATIC_PAGES=86400000
# Widgets - 1 jour par défaut
CACHE_TTL_WIDGETS=86400000
# Knowledge Base - 1 jour par défaut
CACHE_TTL_KNOWLEDGE_BASE=86400000

# REDIS (optionnel - pour cache distribué)
# Si non configuré, utilise le cache en mémoire local
#REDIS_HOST=redis-service
#REDIS_PORT=6379
#REDIS_PASSWORD=
#REDIS_DB=0
3 changes: 1 addition & 2 deletions dev/connectors/multi-cms-connector/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,5 @@ pids
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Schema GraphQL généré automatiquement par Apollo
src/schema.gpl

/old/*
132 changes: 132 additions & 0 deletions dev/connectors/multi-cms-connector/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,141 @@ Pour connaitre les requêtes GraphQL disponibles côté backend se référer à
### Directus
* `DIRECTUS_API_URL`: URL de l'API Directus
* `DIRECTUS_API_TOKEN`: Token d'accès à l'API Directus
* `DIRECTUS_ASSETS_PUBLIC_URL`: URL publique pour les assets Directus

### Wordpress
* `WORDPRESS_API_URL`: URL de l'API Wordpress
* `WORDPRESS_API_USERNAME`: Nom d'utilisateur de l'API Wordpress
* `WORDPRESS_API_PASSWORD`: Mot de passe de l'API Wordpress

### Redis
* `REDIS_HOST`: Hôte du serveur Redis
* `REDIS_PORT`: Port du serveur Redis
* `REDIS_PASSWORD`: Mot de passe du serveur Redis (optionnel)
* `REDIS_DB`: Numéro de la base de données Redis (optionnel, défaut : 0)

### Cache
* `CACHE_ENABLED`: Active ou désactive le cache (true/false, défaut : true)
* `CACHE_TTL_CHANNELS`: TTL du cache pour la collection Channels (en secondes)
* `CACHE_TTL_CONTACT_US`: TTL du cache pour la collection Contact-Us (en secondes)
* `CACHE_TTL_FEATURES`: TTL du cache pour la collection Features (en secondes)
* `CACHE_TTL_IMPORTANT_NEWS`: TTL du cache pour la collection Important-News (en secondes)
* `CACHE_TTL_LOGIN`: TTL du cache pour la collection Login (en secondes)
* `CACHE_TTL_SOCIAL_NETWORKS`: TTL du cache pour la collection Social-Networks (en secondes)
* `CACHE_TTL_STATIC_PAGES`: TTL du cache pour la collection Static-Pages (en secondes)
* `CACHE_TTL_WIDGETS`: TTL du cache pour la collection Widgets (en secondes)
* `CACHE_TTL_KNOWLEDGE_BASE=86400000` : TTL du cache pour la collection Base de Knowledge-Base (en secondes)

## Cache

Le connecteur CMS utilise un système de cache Redis distribué pour optimiser les performances et éviter les latences des requêtes vers le CMS.

### Architecture du Cache

- **Backend principal** : Redis (avec fallback automatique vers le cache mémoire si Redis n'est pas disponible)
- **Namespace** : `multi:{env}:cache:` pour éviter les conflits avec d'autres services
- **Clés** : Format `multi:{env}:cache:{collection}:all` ou `multi:{env}:cache:{collection}:{id}`
- **TTL configurables** : Par collection via variables d'environnement
- **Invalidation** : Manuelle via API REST et automatique au démarrage
- **Protection contre Cache Stampede** : Verrous distribués Redis (`multi:{env}:lock:{collection}:{id}`) avec tokens sécurisés
- **Déduplication des promesses** : Évite les appels multiples en parallèle sur la même instance

### Configuration du Cache

#### Activation/Désactivation
Le cache peut être entièrement désactivé pour les tests de performance :

```bash
# Désactiver le cache
CACHE_ENABLED=false
```

#### Variables d'environnement TTL
Les TTL du cache de chaque collection peut être paramétré depuis le fichier .env (cf. Configuration ci-dessus)

#### Valeurs par défaut (fallback)
Si les variables d'environnement ne sont pas définies, les TTL suivants sont utilisés :
- **Collections dynamiques** (features, important-news, widgets) : 1 heure
- **Collections statiques** (login, contact-us, channels, etc.) : 1 jour
- **TTL par défaut** : 5 minutes

### API Cache

Des routes sont mises à disposition pour vider le cache depuis une application tierce.
Cela peut être utile si on souhaite utiliser des TTL plus long, mais pouvoir tout de même invalider le cache lors de la modification d'un élément dans le CMS par exemple.

#### Vider tout le cache
```bash
GET /cache/clear-all
```

#### Vider le cache d'une collection
```bash
GET /cache/clear/{collection}
```

Collections disponibles : `channels`, `contact-us`, `features`, `important-news`, `login`, `pages`, `social-networks`, `static-pages`, `widgets`

### Système d'événements et Preload

Le système utilise des événements NestJS pour déclencher automatiquement le preload des données après vidage du cache.

#### Architecture événementielle

1. **Au démarrage** : Le `CacheService` vide tout le cache via le pattern `multi:{env}:cache:*`
2. **Via l'API** : Le `CacheController` invalide une collection et émet `{cms}.{collection}.cache.cleared`
3. **Services** : Chaque service écoute son événement spécifique et preload automatiquement

#### Implémentation dans un service

Chaque service de collection implémente le pattern suivant :

```typescript
import { Injectable, Logger } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
import { CacheService } from '@cache/cache.service';
import { CacheCollection } from '@cache/cache.config';

@Injectable()
export class FeaturesWordpressService {
private readonly logger = new Logger(FeaturesWordpressService.name);

constructor(
private readonly wordpressService: WordpressService,
private readonly cacheService: CacheService,
) {}

@OnEvent('wordpress.features.cache.cleared')
async handleCacheCleared() {
this.logger.log('Received cache cleared event - preloading data...');
try {
await this.preloadData();
} catch (error) {
this.logger.error(
'Failed to preload features after cache clear:',
error.message,
);
}
}

public async preloadData() {
this.logger.log('Preloading features...');
await this.getFeatures();
this.logger.log('Features preloaded successfully');
}

async getFeatures(): Promise<Features[]> {
return this.cacheService.getOrFetchWithLock(
CacheCollection.FEATURES,
() => this.loadFeaturesFromWordpress(),
);
}

private async loadFeaturesFromWordpress(): Promise<Features[]> {
this.logger.debug('Loading features from WordPress...');
// Requête GraphQL vers le CMS...
const data = await this.wordpressService.executeGraphQLQuery(/* ... */);
return data.features.nodes.map(this.mapToMultiModel);
}
}
```
Loading