esup-multi

Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Bloc de code
languageyaml
# 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
titleToutes les instances de la collection
collapsetrue
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
languagejson
titleExemple 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
languagegraphql
titleToutes les instances de la collection
collapsetrue
query {
  channels {
    id
    code
    color
    icon
    routerLink
    filterable
    translations {
        languagesCode
        label
    }
  }
}
Bloc de code
languagegraphql
titleRécupérer une instance de la collection
collapsetrue
query {
  channel(id: "1") {
    id
    code
    color
    icon
    routerLink
    filterable
    translations {
        languagesCode
        label
    }
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{
    "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
languagegraphql
titleInstance Singleton
collapsetrue
query {
  contactUs {
    icon
    to
    translations {
        languagesCode
        title
        content
    }
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{
    "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
languagegraphql
titleToutes les instances de la collection
collapsetrue
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
languagegraphql
titleRécupérer une instance de la collection
collapsetrue
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
languagejson
titleExemple de réponse
collapsetrue
{
    "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
languagegraphql
titleToutes les instances de la collection
collapsetrue
query {
  importantNews {
    id
    translations {
        languagesCode
        title
        content
        buttonLabel
    }
    image
    authorization {
        roles
        type
    }
    color
    link
    statisticName
  }
}
Bloc de code
languagegraphql
titleRécupérer une instance de la collection
collapsetrue
query {
  importantNew(id: "1") {
    id
    translations {
        languagesCode
        title
        content
        buttonLabel
    }
    image
    authorization {
        roles
        type
    }
    color
    link
    statisticName
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{
    "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
languagegraphql
titleInstance Singleton
collapsetrue
query {
  login {
    translations {
        languagesCode
        notAuthenticatedText
        connectionText
    }
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{
    "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
languageyaml
titleRécupérer une instance de la collection
collapsetrue
query {
  channel(id: "1") {
    id
    code
    color
    icon
    routerLink
    filterable
    translations {
        languagesCode
        label}
    }
  }
}}

Social Networks

Bloc de code
languageyamlgraphql
titleExemple de réponseToutes les instances de la collection
collapsetrue
{
    "data": {
        "channel": {
        query {
  socialNetworks {
    "id": "1",
    title
    icon
    "code": "ALERT",link
    position
        "color": "#EF154E",
            "icon": null,}
}
Bloc de code
languagegraphql
titleRécupérer une instance de la collection
collapsetrue
query {
  socialNetwork(id: "1") {
    id
    title
    "routerLink": null,icon
    link
    position
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{    "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
languagegraphql
titleToutes les instances de la collection
collapsetrue
query {
  staticPages {
    "languagesCode": "fr",id
    translations   {
             "label": "ALERTE" languagesCode
        title
        }content
    }
    icon
    ]iconSvgDark
    iconSvgLight
    }position
    statisticName
  }
}
Bloc de code
languagegraphql
titleContact UsRécupérer une instance de la collection
collapsetrue
query {
  staticPage(id: "1") {
    id
    translations {
        languagesCodequery {
	contactUs{
        idtitle
        tocontent
    }
    icon
    iconSvgDark
    translations{iconSvgLight
    position
    statisticName
  }
}
Bloc de code
languagejson
titleExemple de réponse
collapsetrue
{
  languagesCode
  "data": {
        "staticPage": content{
              title"id": "1",
        }
    }
}
Bloc de code
titleFeatures
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
titlePages
query {
	pages(status: "publishedposition"): {1,
        id
        status"statisticName": "help"
        icon}
    }
}

Widgets

Bloc de code
languagegraphql
titleToutes les instances de la collection
collapsetrue
query {    iconSvgDark
  widgets {
     iconSvgLightid
        positiondescription
        statisticName
  widget
      translations {
        languagesCode
    languagesCode
    title
        content
    }
    icon
    titleiconSvgDark
        }
    }
}
Bloc de code
titleWidgets
query {
	widgets(status: "published")iconSvgLight
    authorization {
        idroles
		status
        descriptiontype
    }
    widgetposition
    settingsByRole    iconSvgDark{
        iconSvgLightposition
        iconrole
    }
    linktype
    routerLink
    positionlink
        ssoService
		statisticName
    color
    routerLinkstatisticName
  }
}
Bloc de code
languagegraphql
titleRécupérer une instance de la collection
collapsetrue
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
languagejson
titleSocial NetworksExemple de réponse
collapsetrue
{
    "data": query {
	socialNetworks{
        id
"widget": {
             icon
"id": "1",
         link
        title   "description": "Widget affichant les prochains événements dans le calendrier",
    }
}
Bloc de code
titleLogin
query {
	login{
        id"widget": "calendar:calendar",
        translations {
     "translations": [
       languagesCode
         {
   connexionText
            notAuthenticatedText
     "languagesCode": "en",
  }
    }
}
Bloc de code
titleLanguages
query {
	languages{
        code
     "title": "Your next directionevents",
        name
    }
}
Bloc de code
titleImportant News
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
titleURL en méthode POST
<host>/graphql
Bloc de code
titleBody de la requête
query {
	languages       "iconSvgLight": null,
            "authorization": {
        code
        direction
"roles": [
            name
    }
}
Bloc de code
titleRéponse
{
    "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
            }
        ]
    }
}