Browse Source

On utilise la mise à jour de recuperer_url pour simplifier le code du service Discourse.

master
Eric Lupinacci 6 months ago
parent
commit
30c5efc076
  1. 2
      contrib_pipelines.php
  2. 4
      formulaires/contribution_inscrire.php
  3. 93
      services/discourse.php

2
contrib_pipelines.php

@ -151,7 +151,7 @@ function contrib_pre_edition($flux) {
and $inscription['topic_id']
and $flux['data']
) {
discourse_poster_inscription($inscription['username'], $inscription['topic_id'], $statut_nouveau);
discourse_poster_inscription($inscription['username'], $statut_nouveau, $inscription);
}
}
}

4
formulaires/contribution_inscrire.php

@ -35,7 +35,7 @@ function formulaires_contribution_inscrire_charger_dist($email) {
function formulaires_contribution_inscrire_verifier_dist($email) {
$erreurs = array();
// Acquérie le username et l'email saisis
// Acquérir le username et l'email saisis
$username = _request('username');
$email = _request('email');
$descriptif = _request('descriptif');
@ -128,7 +128,7 @@ function formulaires_contribution_inscrire_traiter_dist($email) {
// On envoie une notification sur Discuter dans la catégorie Inscription pour prévenir les administrateurs
// de l'arrivée d'une demande.
include_spip('services/discourse');
$topic_id = discourse_poster_inscription($set['username']);
$topic_id = discourse_poster_inscription($set['username'], 'prop', $set);
if ($topic_id) {
// Mettre à jour l'inscription avec l'id du topic créé sur Discourse pour la demande
objet_modifier('inscription', $id, array('topic_id' => $topic_id));

93
services/discourse.php

@ -18,18 +18,32 @@ if (!defined('_DISCOURSE_SPIP_ENDPOINT_BASE_URL')) {
*
* @internal
*
* @param array $parametres_url Liste des paramètres de l'url à accoler dans l'ordre fourni.
* @param array $parametres_path Liste des paramètres de path à accoler dans l'ordre fourni.
* @param array $parametres_query Liste des paramètres de query à accoler dans l'ordre fourni.
*
* @return string L'URL de la requête au service
*
*/
function discourse_construire_url($parametres_url) {
function discourse_construire_url($parametres_path, $parametres_query = array()) {
// Construire l'URL de l'api sollicitée
// -- la partie path
$url = _DISCOURSE_SPIP_ENDPOINT_BASE_URL
. implode('/', $parametres_url)
. implode('/', $parametres_path)
. '.json';
// -- la partie query éventuelle
if ($parametres_query) {
$query = '';
foreach ($parametres_query as $_champ => $_valeur) {
$query .= ($query ? '&' : '?')
. $_champ
. '='
. rawurlencode($_valeur);
}
$url .= $query;
}
return $url;
}
@ -62,20 +76,18 @@ function discourse_requeter($url, $options = array()) {
$config = lire_config('contrib', array());
$cle = $config['discourse_cle'] ?? '';
$user = $config['discourse_username'] ?? '';
$entete = 'API-Key: ' . $cle . "\r\n"
. 'API-Username: ' . $user . "\r\n";
$options['headers'] = array(
'API-Key' => $cle,
'API-Username' => $user
);
// Si l'index datas est fourni c'est un POST et on passe les données en chaine JSON après les en-têtes
$data = '';
// Si l'index datas est fourni c'est une mise à jour et on passe les données en chaine JSON après les en-têtes
if (!empty($options['datas'])) {
$data = json_encode($options['datas']);
$entete .= 'Content-Type: application/json'. "\r\n"
. 'Accept: application/json' . "\r\n";
$options['datas'] = json_encode($options['datas']);
$options['headers']['Content-Type'] = 'application/json';
$options['headers']['Accept'] = 'application/json';
}
// In fine, on passe les en-têtes et les données éventuelles dans l'index 'datas'.
$options['datas'] = $entete . "\n" . $data;
// Requête au serveur Discourse
$flux = recuperer_url($url, $options);
if (empty($flux['page'])) {
@ -88,7 +100,8 @@ function discourse_requeter($url, $options = array()) {
if (!empty($retour['errors'])) {
// Le traitement renvoie une erreur qui est défini dans le message
$reponse['erreur'] = 'discourse_nok';
spip_log("Erreur de traitement Discourse `{$retour['error_type']}` pour l'url `$url`", 'contrib' . _LOG_ERREUR);
$erreur = $retour['error_type'] ?? ($retour['errors'][0] ?? '');
spip_log("Erreur de traitement Discourse `${erreur}` pour l'url `$url`", 'contrib' . _LOG_ERREUR);
} else {
$reponse['donnees'] = $retour;
}
@ -104,34 +117,43 @@ function discourse_requeter($url, $options = array()) {
/**
* @return bool
*/
function discourse_poster_inscription($user, $id_topic = 0, $statut = 'prop') {
function discourse_poster_inscription($user, $statut = 'prop', $parametres = []) {
// Par défaut on considère que la fonction est en erreur
$id = 0;
if ($user) {
// Construction de l'url de la requête de post : topic ou post on utilise toujours la même url.
$parametres_url = array('posts');
$url = discourse_construire_url($parametres_url);
$parametres_path = array('posts');
$url = discourse_construire_url($parametres_path);
// Date de l'action
$date = affdate_heure(date('Y-m-d H:i:s'));
// Initialisation des options de requête
$options = [];
// Construction des données de POST
if ($statut === 'prop') {
$texte = 'Une demande d\'inscription à la Forge SPIP a été faite le '
. $date
. '. Une notification sera envoyée en réponse une fois la demande prise en compte.'
. "\n Le descriptif de la demande est le suivant : \""
. ($parametres['descriptif'] ?? '')
. '"';
$options['datas'] = array(
'title' => 'SPIP-Contrib - Inscription à la Forge de "' . $user . '"',
'raw' => 'Une demande d\'inscription à la Forge SPIP a été faite le ' . $date . '. Une notification sera envoyée en réponse une fois la demande prise en compte.',
'raw' => $texte,
'category' => 31,
);
} elseif ($statut === 'publie') {
$options['datas'] = array(
'topic_id' => $id_topic,
'topic_id' => $parametres['topic_id'] ?? 0,
'raw' => 'Le compte de "' . $user . '" a été créé sur la Forge SPIP le ' . $date . '.',
);
} elseif ($statut === 'refuse') {
$options['datas'] = array(
'topic_id' => $id_topic,
'topic_id' => $parametres['topic_id'] ?? 0,
'raw' => 'La demande d\'inscription à la Forge SPIP faite par "' . $user . '" a été refusée le ' . $date . '.',
);
}
@ -158,13 +180,13 @@ function discourse_cloturer_inscription($id_topic) {
if ($id_topic) {
// Construction de l'url de la requête de post : topic ou post on utilise toujours la même url.
$parametres_url = array('t', $id_topic, 'status');
$url = discourse_construire_url($parametres_url);
$parametres_path = array('t', $id_topic, 'status');
$url = discourse_construire_url($parametres_path);
// Construction des données de PUT
$options['datas'] = array(
'status' => 'closed',
'enabled' => 'false',
'enabled' => 'true',
);
$options['methode'] = 'PUT';
@ -177,3 +199,28 @@ function discourse_cloturer_inscription($id_topic) {
return $retour;
}
/**
* @return bool
*/
function discourse_rechercher($terme) {
// Par défaut on considère que la fonction est en erreur
$retour = array();
if ($terme) {
// Construction de l'url de la requête de post : topic ou post on utilise toujours la même url.
$parametres_path = array('search');
$parametres_query = array('q' => $terme);
$url = discourse_construire_url($parametres_path, $parametres_query);
// Requête de POST et retour fonction de l'action
$options = array();
$reponse = discourse_requeter($url, $options);
if (empty($reponse['erreur'])) {
$retour = $reponse['donnees'];
}
}
return $retour;
}
Loading…
Cancel
Save