esup-multi

Arborescence des pages

Vous regardez une version antérieure (v. /wiki/spaces/ESUPMULTI/pages/1425801229/Connecteur+CMS+Headless) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 9) afficher la version suivante »

Paramétrage

Le connecteur CMS a été pensé de manière à pouvoir s'interfacer avec plusieurs CMS. Actuellement, 2 modules permettent de communiquer avec Wordpress et Directus.

La configuration du CMS qui sera utilisé se fait au niveau du fichier .env

# CMS TO USE : directus | wordpress
DEFAULT_CMS=

# DIRECTUS
#DIRECTUS_API_URL=xxx
#DIRECTUS_API_TOKEN=xxx

# WORDPRESS
#WORDPRESS_API_URL=xxx
#WORDPRESS_API_USERNAME=xxx
#WORDPRESS_API_PASSWORD=xxx

Dans DEFAULT_CMS indiquez le CMS souhaité, puis dé-commentez les lignes de conf propres au CMS choisi.

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, ...)

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

Exemple de payload
{
  "service": "important-news",
  "iss": "multi-cms-connector"
}


Routes disponibles

Le connecteur CMS expose 2 routes :

  • Une route /graphql pour les requêtes GraphQL, protégée par une authentification JWT
  • Une route GET /health, publique, permettant de retourner l'état de l'application, pour le monitoring

Collections et leurs champs disponibles via GraphQL

Channels

Toutes les instances de la collection
query {
  channels {
    id
    code
    color
    icon
    routerLink
    filterable
    translations {
        languagesCode
        label
    }
  }
}
Récupérer une instance de la collection
query {
  channel(id: "1") {
    id
    code
    color
    icon
    routerLink
    filterable
    translations {
        languagesCode
        label
    }
  }
}
Exemple de réponse
{
    "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

Instance Singleton
query {
  contactUs {
    icon
    to
    translations {
        languagesCode
        title
        content
    }
  }
}
Exemple de réponse
{
    "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

Toutes les instances de la collection
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
  }
}
Récupérer une instance de la collection
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
  }
}
Exemple de réponse
{
    "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

Toutes les instances de la collection
query {
  importantNews {
    id
    translations {
        languagesCode
        title
        content
        buttonLabel
    }
    image
    authorization {
        roles
        type
    }
    color
    link
    position
    statisticName
  }
}
Récupérer une instance de la collection
query {
  importantNew(id: "1") {
    id
    translations {
        languagesCode
        title
        content
        buttonLabel
    }
    image
    authorization {
        roles
        type
    }
    color
    link
    position
    statisticName
  }
}
Exemple de réponse
{
    "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",
            "position": null,
            "statisticName": "cards"
        }
    }
}

Login

Instance Singleton
query {
  login {
    translations {
        languagesCode
        notAuthenticatedText
        connectionText
    }
  }
}
Exemple de réponse
{
    "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>"
                }
            ]
        }
    }
}

Social Networks

Toutes les instances de la collection
query {
  socialNetworks {
    id
    title
    icon
    link
    position
  }
}
Récupérer une instance de la collection
query {
  socialNetwork(id: "1") {
    id
    title
    icon
    link
    position
  }
}
Exemple de réponse
{
    "data": {
        "socialNetwork": {
            "id": "1",
            "title": "github",
            "icon": "logo-github",
            "link": "https://github.com/EsupPortail",
            "position": 1
        }
    }
}

Static Pages

Toutes les instances de la collection
query {
  staticPages {
    id
    translations {
        languagesCode
        title
        content
    }
    icon
    iconSvgDark
    iconSvgLight
    position
    statisticName
  }
}
Récupérer une instance de la collection
query {
  staticPage(id: "1") {
    id
    translations {
        languagesCode
        title
        content
    }
    icon
    iconSvgDark
    iconSvgLight
    position
    statisticName
  }
}
Exemple de réponse
{
    "data": {
        "staticPage": {
            "id": "1",
            "translations": [
                {
                    "languagesCode": "fr",
                    "title": "Aide",
                    "content": "<h2>Bonjour !</h2>\n<p>Lorem ...</p>"
                },
                {
                    "languagesCode": "en",
                    "title": "Help",
                    "content": "<h2>Hello !</h2>\n<p>Lorem ...</p>"
                }
            ],
            "icon": "help-circle-outline",
            "iconSvgDark": null,
            "iconSvgLight": null,
            "position": 1,
            "statisticName": "help"
        }
    }
}

Widgets

Toutes les instances de la collection
query {
  widgets {
    id
    description
    widget
    translations {
        languagesCode
        title
        content
    }
    icon
    iconSvgDark
    iconSvgLight
    authorization {
        roles
        type
    }
    position
    settingsByRole {
        position
        role
    }
    type
    routerLink
    link
    ssoService
    color
    statisticName
  }
}
Récupérer une instance de la collection
query {
  widget(id: "1") {
    id
    description
    widget
    translations {
        languagesCode
        title
        content
    }
    icon
    iconSvgDark
    iconSvgLight
    authorization {
        roles
        type
    }
    position
    settingsByRole {
        position
        role
    }
    type
    routerLink
    link
    ssoService
    color
    statisticName
  }
}
Exemple de réponse
{
    "data": {
        "widget": {
            "id": "1",
            "description": "Widget affichant les prochains événements dans le calendrier",
            "widget": "calendar:calendar",
            "translations": [
                {
                    "languagesCode": "en",
                    "title": "Your next events",
                    "content": null
                },
                {
                    "languagesCode": "fr",
                    "title": "Vos prochains évènements",
                    "content": null
                }
            ],
            "icon": null,
            "iconSvgDark": null,
            "iconSvgLight": null,
            "authorization": {
                "roles": [
                    "anonymous"
                ],
                "type": "DISALLOW"
            },
            "position": 50,
            "settingsByRole": [],
            "type": "external",
            "routerLink": null,
            "link": "https://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp?ticket={st}",
            "ssoService": "https://mail.mon-univ.fr/zimbra/preauth/preauthUL_ETU.jsp",
            "color": null,
            "statisticName": null
        }
    }
}




  • Aucune étiquette