...
| Bloc de code |
|---|
|
# CMS TO USE : directus | wordpress
DEFAULT_CMS=
# DIRECTUS
#DIRECTUS_API_URL=xxx
#DIRECTUS_API_TOKEN=xxx
#DIRECTUS_API_TIMEOUT=5000
# WORDPRESS
#WORDPRESS_API_URL=xxx
#WORDPRESS_API_USERNAME=xxx
#WORDPRESS_API_PASSWORD=xxx
#WORDPRESS_API_TIMEOUT=5000 |
Dans DEFAULT_CMS indiquez le CMS souhaité, puis dé-commentez les lignes de conf propres au CMS choisi.
Collections et leurs champs disponibles
Channels
Sécurité
Le connecteur requiert une authentification JWT HS256 de la part du backend de Multi.
Définir une clé JWT privée dans le fichier .env au niveau de l'attribut TOKEN_SECRET, puis générez un bearer token à partir de cette clé.
Ce bearer token sera ensuite à placer dans le fichier .env des microservices nécessitant un accès aux données du CMS au niveau de la variable se terminant par _SERVICE_CMS_CONNECTOR_API_BEARER_TOKEN (ex: auth, contact-us, features, important-news, ...)
| Info |
|---|
Il est tout à fait possible de générer un bearer token différent par microservice. Ce qui pourrait permettre d'identifier plus tard dans les logs du connecteur quel microservice a effectué quelle requête via l'analyse du payload | Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de payload |
|---|
| {
"service": "important-news",
"iss": "multi-cms-connector"
} |
|
Routes disponibles
Le connecteur CMS expose plusieurs routes :
- Une route
/graphql pour les requêtes GraphQL - Une route GET
/health, publique, permettant de retourner l'état de l'application, pour le monitoring - Une route GET
/cache/clear/features, permettant de vider le cache pour les features - Une route GET
/cache/clear/contact-us, permettant de vider le cache pour contact-us - Une route GET
/cache/clear/login, permettant de vider le cache pour login - Une route GET
/cache/clear/important-news, permettant de vider le cache pour les important-news - Une route GET
/cache/clear/channels, permettant de vider le cache pour les channels - Une route GET
/cache/clear/social-networks, permettant de vider le cache pour les social-networks - Une route GET
/cache/clear/static-pages, permettant de vider le cache pour les static-pages - Une route GET
/cache/clear/widgets, permettant de vider le cache pour les widgets - Une route GET
/cache/clear/map-points, permettant de vider le cache pour les données de carte (map-points, map-categories, map-icons et campuses) - Une route GET
/cache/clear-all, permettant de vider l'ensemble du cache
Toutes ces routes sont protégées par l'authentification JWT, exceptée celle pour le healthcheck
Collections et leurs champs disponibles via GraphQL
Channels
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
channels {
id
code
color
icon
routerLink
filterable
translations {
languagesCode
label
}
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
channel(id: "1") {
id
code
color
icon
routerLink
filterable
translations {
languagesCode
label
}
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"channel": {
"id": "1",
"code": "ALERT",
"color": "#EF154E",
"icon": null,
"routerLink": null,
"filterable": false,
"translations": [
{
"languagesCode": "en",
"label": "ALERT"
},
{
"languagesCode": "fr",
"label": "ALERTE"
}
]
}
}
} |
Contact Us
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Instance Singleton |
|---|
| collapse | true |
|---|
|
query {
contactUs {
icon
to
translations {
languagesCode
title
content
}
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"contactUs": {
"icon": "mail",
"to": "test@test.com",
"translations": [
{
"languagesCode": "fr",
"title": "Nous contacter",
"content": "<p>On peut tromper 1000 fois 1 personne, mais on ne peut pas tromper 1000 fois 1000 personnes</p>"
},
{
"languagesCode": "en",
"title": "Contact us",
"content": "<p>You can fool 1 person 1000 times, but you can't fool 1000 people 1000 times</p>"
}
]
}
}
} |
Features
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
features {
id
description
translations {
languagesCode
title
shortTitle
searchKeywords
}
icon
iconSvgDark
iconSvgLight
menu
authorization {
roles
type
}
position
settingsByRole {
position
role
}
type
routerLink
link
ssoService
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
feature(id: "1") {
id
description
translations {
languagesCode
title
shortTitle
searchKeywords
}
icon
iconSvgDark
iconSvgLight
menu
authorization {
roles
type
}
position
settingsByRole {
position
role
}
type
routerLink
link
ssoService
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"feature": {
"id": "1",
"description": "Redirige l'utilisateur vers le service interne affichant les dernières actualités",
"translations": [
{
"languagesCode": "fr",
"title": "L'actualité",
"shortTitle": null,
"searchKeywords": null
},
{
"languagesCode": "en",
"title": "News",
"shortTitle": null,
"searchKeywords": null
}
],
"icon": null,
"iconSvgDark": "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\">...</svg>",
"menu": "top",
"authorization": null,
"position": 10,
"settingsByRole": [
{
"position": 1,
"role": "student"
}
],
"type": "internal",
"routerLink": "/rss",
"link": null,
"ssoService": null,
"statisticName": "rss" |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
channels {
id
code
color
icon
routerLink
filterable
translations {
languagesCode
label}
}
}
}} |
Important News
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
channel(id: "1") { {
importantNews {
id
translations {
languagesCode
title
id
codecontent
color
iconbuttonLabel
routerLink}
filterableimage
translationsauthorization {
languagesCoderoles
labeltype
}
color
link
statisticName
}
} |
| Bloc de code |
|---|
| language | jsongraphql |
|---|
| title | Exemple de réponseRécupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
{
"data":query {
importantNew(id: "channel1":) {
"id": "1",
translations {
"code": "ALERT", languagesCode
title
"color": "#EF154E",
content
"icon": null,buttonLabel
}
image
"routerLink": null,authorization {
roles
"filterable": false,
type
}
"translations": [color
link
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"importantNew": {
"languagesCodeid": "en1",
"labeltranslations": "ALERT"[
},{
{ "languagesCode": "fr",
"languagesCodetitle": "frCartes étudiant",
"labelcontent": "ALERTE"
Vos cartes d'étudiant sont disponibles !",
}
"buttonLabel": "Voir vos ]cartes"
}
}
} |
Contact Us
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Instance Singleton |
|---|
| collapse | true |
|---|
|
query { },
contactUs {
icon
to
translations {
languagesCode
title"languagesCode": "en",
content
}
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"datatitle": { "Student cards",
"contactUs": {
"iconcontent": "mailYour student cards are available!",
"tobuttonLabel": "test@test.com",See your cards"
"translations": [ }
],
{
"image": "5a3695fc-af24-4c60-bd67-50eaee02d81e",
"languagesCodeauthorization": "fr",{
"titleroles": "Nous contacter",[
"contentstudent":
"<p>On peut tromper 1000 fois 1 personne, mais on ne peut pas tromper 1000 fois 1000 personnes</p>"
],
},
"type": "ALLOW"
{
},
"languagesCodecolor": "en#EF154E",
"title"link": "Contact us/cards",
"contentstatisticName": "<p>Youcards"
can fool 1 person 1000 times, but you}
can't fool 1000 people 1000 times</p>" }
} |
Login
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Instance Singleton |
|---|
| collapse | true |
|---|
|
query {
login {
translations {
}languagesCode
notAuthenticatedText
]
connectionText
}
}
} |
...
| Bloc de code |
|---|
| language | graphqljson |
|---|
| title | Toutes les instances de la collectionExemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"login": {
"translations": [query {
features {
id
description
translations {
{
languagesCode
title
shortTitle"languagesCode": "fr",
searchKeywords
}
icon
iconSvgDark
iconSvgLight"notAuthenticatedText": "Vous n'êtes pas authentifié",
menu
authorization {
roles
"connectionText": "<p>Bonjour</p>"
type
}
position
settingsByRole {},
position
role{
}
type
routerLink
link
ssoService"languagesCode": "en",
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
feature(id: "1") {
id
description
"notAuthenticatedText": "You are translationsnot {authenticated",
languagesCode
title
"connectionText": "<p>Welcome</p>"
shortTitle
searchKeywords
}
icon
iconSvgDark
iconSvgLight]
menu
authorization {}
}
} |
Social Networks
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
socialNetworks roles{
typeid
}title
positionicon
settingsByRole {link
position
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
socialNetwork(id: role"1") {
}id
typetitle
routerLinkicon
link
ssoService
statisticNameposition
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"featuresocialNetwork": {
"id": "1",
"descriptiontitle": "Redirige l'utilisateur vers le service interne affichant les dernières actualitésgithub",
"translationsicon": ["logo-github",
{
"languagesCode": "fr""link": "https://github.com/EsupPortail",
"position": 1
"title": "L'actualité", }
}
} |
Static Pages
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
staticPages {
id
translations {
"shortTitle": null,
languagesCode
title
"searchKeywords": nullcontent
}
icon
iconSvgDark
},iconSvgLight
position
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
staticPage(id: "1") {
id
translations {
languagesCode
"languagesCode": "en",
title
content
}
"title": "News", icon
iconSvgDark
iconSvgLight
position
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"shortTitledata": null,{
"staticPage": {
"searchKeywordsid": null"1",
}"translations": [
],
{
"icon": null,
"iconSvgDarklanguagesCode": "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\">...</svg>",
fr",
"menutitle": "topAide",
"authorization": null,
"content": "<h2>Bonjour !</h2>\n<p>Lorem ...</p>"
"position": 10,
"settingsByRole": [ },
{
"positionlanguagesCode": 1"en",
"title": "Help",
"rolecontent": "student<h2>Hello !</h2>\n<p>Lorem ...</p>"
}
],
"typeicon": "internalhelp-circle-outline",
"routerLinkiconSvgDark": "/rss"null,
"linkiconSvgLight": null,
"ssoServiceposition": null1,
"statisticName": "rsshelp"
}
}
} |
...
Widgets
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
importantNews {query {
widgets {
id
description
idwidget
translations {
languagesCode
title
content
}
buttonLabelicon
}iconSvgDark
imageiconSvgLight
authorization {
roles
type
}
colorposition
settingsByRole {
position
role
}
type
routerLink
link
positionssoService
color
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
importantNewwidget(id: "1") {
id
description
widget
translations {
languagesCode
title
content
}
buttonLabelicon
iconSvgDark
iconSvgLight
authorization {
roles
type
}
imageposition
authorizationsettingsByRole {
position
rolesrole
}
type
}routerLink
colorlink
linkssoService
positioncolor
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"widget": {
"id": "1",
"description": "Widget affichant les prochains événements dans le calendrier"importantNew": {,
"idwidget": "1calendar:calendar",
"translations": [
{
"languagesCode": "fren",
"title": "CartesYour next étudiantevents",
"content": "Vos cartes d'étudiant sont disponibles !",
null
},
{
"buttonLabel": "Voir vos cartes"
"languagesCode": "fr",
},
"title": "Vos prochains {évènements",
"languagesCodecontent": "en",null
}
"title": "Student cards" ],
"icon": null,
"content": "Your student cards are available!""iconSvgDark": null,
"iconSvgLight": null,
"buttonLabel": "See your cards"
"authorization": {
}
"roles": [
],
"image": "5a3695fc-af24-4c60-bd67-50eaee02d81e",anonymous"
"authorization": { ],
"rolestype": [
"DISALLOW"
},
"studentposition": 50,
"settingsByRole": [],
"type": "ALLOWexternal",
}"routerLink": null,
"colorlink": "#EF154Ehttps://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp?ticket={st}",
"linkssoService": "/cardshttps://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp",
"positioncolor": null,
"statisticName": "cards"null
}
}
} |