Publié le :

Ajouter un utilisateur à un groupe SASjs

En attente de validation
Attention : Ce code nécessite des droits administrateur.
La macro `%ms_adduser2group` prend un ID utilisateur (`uid`) et un ID de groupe (`gid`) en paramètres. Elle construit et envoie une requête POST à l'endpoint `/SASjsApi/group/&gid/&uid` d'un serveur SASjs. L'authentification est gérée via un fichier token dont le chemin est spécifié dans la variable `&_sasjs_tokenfile`. La macro utilise `PROC HTTP` pour effectuer l'appel API. En cas de succès, elle lit la réponse JSON, qui contient la liste mise à jour des membres du groupe, et la charge dans un jeu de données de sortie (`outds`). Des macros utilitaires comme `%mp_abort` et `%mf_getuniquefileref` sont utilisées pour la gestion des erreurs et la création de références de fichiers uniques.
Analyse des données

Type : EXTERNE


Les données ne sont pas créées localement. Le script interroge une API externe (SASjs Server) via PROC HTTP. La réponse de l'API, au format JSON, est ensuite lue et transformée en un jeu de données SAS. Le script dépend également de variables d'environnement (`&_sasjs_tokenfile`, `&_sasjs_apiserverurl`) pour fonctionner.

1 Bloc de code
Macro
Explication :
Définit la macro `ms_adduser2group` avec ses paramètres. Effectue une vérification d'erreur initiale, déclare les variables locales, génère des références de fichier et de bibliothèque uniques avec des macros externes, et configure l'option `nobomfile` pour assurer la compatibilité avec l'API.
Copié !
1%macro ms_adduser2group(uid=0
2 ,gid=0
3 ,outds=work.ms_adduser2group
4 ,mdebug=0
5 );
6 
7%mp_abort(
8 iftrue=(&syscc ne 0)
9 ,mac=ms_adduser2group.sas
10 ,msg=%str(syscc=&syscc on macro entry)
11)
12 
13%local fref0 fref1 fref2 libref optval rc msg;
14%let fref0=%mf_getuniquefileref();
15%let fref1=%mf_getuniquefileref();
16%let libref=%mf_getuniquelibref();
17 
18/* avoid sending bom marker to API */
19%let optval=%sysfunc(getoption(bomfile));
20options nobomfile;
2 Bloc de code
DATA STEP Data
Explication :
Ce DATA STEP crée un fichier temporaire qui servira d'en-tête pour la requête HTTP. Il y écrit l'en-tête 'accept: application/json' et y ajoute le contenu du fichier token d'authentification SASjs (`&_sasjs_tokenfile`).
Copié !
1DATA _null_;
2 file &fref0 lrecl=1000;
3 INFILE "&_sasjs_tokenfile" lrecl=1000;
4 INPUT;
5 IF _n_=1 THEN put "accept: application/json";
6 put _infile_;
7RUN;
3 Bloc de code
PROC HTTP Data
Explication :
Utilise `PROC HTTP` pour envoyer une requête POST à l'API SASjs. L'URL est construite dynamiquement avec l'adresse du serveur, l'ID du groupe et l'ID de l'utilisateur. Les en-têtes préparés précédemment sont passés via `headerin=`, et la réponse JSON de l'API est écrite dans le fichier temporaire référencé par `&fref1`.
Copié !
1PROC HTTP method='POST' headerin=&fref0 out=&fref1
2 url="&_sasjs_apiserverurl/SASjsApi/group/&gid/&uid";
3%IF &mdebug=1 %THEN %DO;
4 debug level=1;
5%END;
6RUN;
4 Bloc de code
LIBNAME JSON Data
Explication :
Ce bloc traite la réponse JSON de l'API. Un moteur `LIBNAME JSON` est utilisé pour mapper directement le fichier JSON de réponse comme une bibliothèque SAS. Ensuite, un DATA STEP lit la table 'users' de cette bibliothèque JSON (correspondant à la clé 'users' dans le JSON) et la copie dans le jeu de données de sortie `&outds`, en supprimant les colonnes ordinales inutiles.
Copié !
1LIBNAME &libref JSON fileref=&fref1;
2 
3DATA &outds;
4 SET &libref..users;
5 drop ordinal_root ordinal_users;
6%IF &mdebug=1 %THEN %DO;
7 putlog _all_;
8%END;
9RUN;
5 Bloc de code
Options
Explication :
Restaure l'option `BOMFILE` à sa valeur d'origine. Ensuite, si le mode debug n'est pas activé (`mdebug=0`), il nettoie les ressources utilisées en libérant les références de fichier et de bibliothèque qui ont été allouées au début de la macro.
Copié !
1/* reset options */
2options &optval;
3 
4%IF &mdebug=0 %THEN %DO;
5 filename &fref0 clear;
6 filename &fref1 clear;
7 LIBNAME &libref clear;
8%END;
9%ELSE %DO;
10 DATA _null_;
11 INFILE &fref1;
12 INPUT;
13 putlog _infile_;
14 RUN;
15%END;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.