...
| 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
| Bloc de code |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
channels {
id
code
color
icon
routerLink
filterable
translations {
languagesCode
label
}
}
} |
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"
}
}
} |
Important News
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
importantNews {
id
translations {
languagesCode
title
content
buttonLabel
}
image
authorization {
roles
type
}
color
link
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
importantNew(id: "1") {
id
translations {
languagesCode
title
content
buttonLabel
}
image
authorization {
roles
type
}
color
link
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"importantNew": {
"id": "1",
"translations": [
{
"languagesCode": "fr",
"title": "Cartes étudiant",
"content": "Vos cartes d'étudiant sont disponibles !",
"buttonLabel": "Voir vos cartes"
},
{
"languagesCode": "en",
"title": "Student cards",
"content": "Your student cards are available!",
"buttonLabel": "See your cards"
}
],
"image": "5a3695fc-af24-4c60-bd67-50eaee02d81e",
"authorization": {
"roles": [
"student"
],
"type": "ALLOW"
},
"color": "#EF154E",
"link": "/cards",
"statisticName": "cards"
}
}
} |
Login
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Instance Singleton |
|---|
| collapse | true |
|---|
|
query {
login {
translations {
languagesCode
notAuthenticatedText
connectionText
}
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": {
"login": {
"translations": [
{
"languagesCode": "fr",
"notAuthenticatedText": "Vous n'êtes pas authentifié",
"connectionText": "<p>Bonjour</p>"
},
{
"languagesCode": "en",
"notAuthenticatedText": "You are not authenticated",
"connectionText": "<p>Welcome</p>"
}
] |
| Bloc de code |
|---|
| language | yaml |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
channel(id: "1") {
id
code
color
icon
routerLink
filterable
translations {
languagesCode
label}
}
}
}} |
Social Networks
| Bloc de code |
|---|
| language | yamlgraphql |
|---|
| title | Exemple de réponseToutes les instances de la collection |
|---|
| collapse | true |
|---|
|
{
"data": {
"channel": {
query {
socialNetworks {
"id": "1",
title
icon
"code": "ALERT",link
position
"color": "#EF154E",
"icon": null,}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
socialNetwork(id: "1") {
id
title
"routerLink": null,icon
link
position
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{ "filterable": false,
"data": {
"translationssocialNetwork": [{
{
"id": "1",
"languagesCode"title": "engithub",
"label"icon": "ALERTlogo-github",
}"link": "https://github.com/EsupPortail",
{"position": 1
}
}
} |
Static Pages
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query {
staticPages {
"languagesCode": "fr",id
translations {
"label": "ALERTE" languagesCode
title
}content
}
icon
]iconSvgDark
iconSvgLight
}position
statisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Contact Us | | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
staticPage(id: "1") {
id
translations {
languagesCodequery {
contactUs{
idtitle
tocontent
}
icon
iconSvgDark
translations{iconSvgLight
position
statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
languagesCode
"data": {
"staticPage": content{
title"id": "1",
}
}
} |
| Bloc de code |
|---|
|
query {
features(status: "publishedtranslations"): {[
id
description{
icon
iconSvgDark
"languagesCode": "fr",
iconSvgLight
link
menu"title": "Aide",
position
routerLink
"content": "<h2>Bonjour ssoService!</h2>\n<p>Lorem ...</p>"
status
type},
translations{
{
languagesCode
searchKeywords
"languagesCode": "en",
shortTitle
"title": "Help",
}
"content": "<h2>Hello !</h2>\n<p>Lorem ...</p>"
authorization {
roles}
authorization],
}
"icon": "help-circle-outline",
settingsByRole{
"iconSvgDark": null,
position
role
"iconSvgLight": null,
}
}
} |
| Bloc de code |
|---|
|
query {
pages(status: "publishedposition"): {1,
id
status"statisticName": "help"
icon}
}
} |
Widgets
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Toutes les instances de la collection |
|---|
| collapse | true |
|---|
|
query { iconSvgDark
widgets {
iconSvgLightid
positiondescription
statisticName
widget
translations {
languagesCode
languagesCode
title
content
}
icon
titleiconSvgDark
}
}
} |
| Bloc de code |
|---|
|
query {
widgets(status: "published")iconSvgLight
authorization {
idroles
status
descriptiontype
}
widgetposition
settingsByRole iconSvgDark{
iconSvgLightposition
iconrole
}
linktype
routerLink
positionlink
ssoService
statisticName
color
routerLinkstatisticName
}
} |
| Bloc de code |
|---|
| language | graphql |
|---|
| title | Récupérer une instance de la collection |
|---|
| collapse | true |
|---|
|
query {
widget(id: color"1") {
id
typedescription
widget
translations {
languagesCode
languagesCode
title
content
}
icon
titleiconSvgDark
iconSvgLight
authorization }{
authorization {roles
type
roles}
position
settingsByRole authorization{
}position
settingsByRole{role
}
type
positionrouterLink
link
rolessoService
color
}statisticName
}
} |
| Bloc de code |
|---|
| language | json |
|---|
| title | Social Networks | | Exemple de réponse |
|---|
| collapse | true |
|---|
|
{
"data": query {
socialNetworks{
id
"widget": {
icon
"id": "1",
link
title "description": "Widget affichant les prochains événements dans le calendrier",
}
}
|
| Bloc de code |
|---|
|
query {
login{
id"widget": "calendar:calendar",
translations {
"translations": [
languagesCode
{
connexionText
notAuthenticatedText
"languagesCode": "en",
}
}
}
|
| Bloc de code |
|---|
|
query {
languages{
code
"title": "Your next directionevents",
name
}
}
|
| Bloc de code |
|---|
|
query {
importantNews(status: "published"){
"content": idnull
status
image},
link
color{
position
statisticName
"languagesCode": "fr",
translations{
languagesCode
"title": "Vos prochains évènements",
content
buttonLabel
"content": null
title
}
authorization {],
roles
"icon": null,
authorization
"iconSvgDark": null,
}
}
} |
URL en méthode GET
| Bloc de code |
|---|
<host>/assets/<image-name> |
- host : adresse du serveur
- image-name : nom de l'image
Format de retour
Format attendu
- Code HTTP 200 : si tout s'est bien passé
Cas d'erreur
- Erreur HTTP 4xx ou 5xx : En cas de problème ou erreur
Exemple
| Bloc de code |
|---|
|
<host>/graphql |
| Bloc de code |
|---|
|
query {
languages "iconSvgLight": null,
"authorization": {
code
direction
"roles": [
name
}
} |
| Bloc de code |
|---|
|
{
"data": {
anonymous"
],
"languages "type": [
"DISALLOW"
{
},
"codeposition": "fr"50,
"directionsettingsByRole": "ltr"[],
"nametype": "Françaisexternal",
"routerLink": }null,
{
"link": "https://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp?ticket={st}",
"codessoService": "enhttps://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp",
"directioncolor": "ltr"null,
"namestatisticName": "English"null
}
]
}
} |