Well, all was good under the sun, until a reader pointed out that I had omitted a very important piece. I was expecting STARLIMS developers to know how to manage; but it is not so. Re-reading, I realized that indeed, one might need directions.
I’m talking about the API_Helper_Custom.RestApiCustomBase
class.
This class is not really needed, you can instead inherit of the RestApi.RestApiBase
class.
But having our own custom base is good! It allows us to implement common functionalities that all your services may need. In this example, I’ll provide an impersonation method, very useful if you wish to have a single integration user, but actually know who the user should be impersonating.
:CLASS RestApiCustomBase;
:INHERIT RestApi.RestApiBase;
:DECLARE APIEmail;
:DECLARE LangId;
:DECLARE UserName;
/* do stuff here that applies to all custom API's;
:PROCEDURE Constructor;
:DECLARE sUser;
Me:LangId := "ENG";
Me:UserName := GetUserData();
Me:APIEmail := Request:Headers:Get("SL-API-Email");
sUser := LSearch("select USRNAM from USERS where EMAIL = ? and STATUS = ?", "", "DATABASE", { Me:APIEmail, 'Active' });
:IF ( !Empty(sUser) ) .and. ( sUser <> GetUserData() );
Me:Impersonate(sUser);
:ENDIF;
Me:LangId := LSearch("select LANGID from USERS where USRNAM = ?", "ENG", "DATABASE", { MYUSERNAME });
:ENDPROC;
/* Allow system to impersonate a user so transactions are corrected against the correct user;
:PROCEDURE Impersonate;
:PARAMETERS sUser;
:IF !IsDefined("MYUSERNAME");
:PUBLIC MYUSERNAME;
:ENDIF;
MYUSERNAME := sUser;
SetUserData(MYUSERNAME);
:ENDPROC;
As you can see, this is pretty simple. Once you have this REST API ready, inherit this class, and you should be fine to have a working API. In the above example, the code expect a header SL-API-Email that will contain the email of the user to impersonate. If it is not provided, then the user to whom the key belong is the current user.
Hope this helps those who didn’t yet figure it out!