Quantcast
Viewing all articles
Browse latest Browse all 10

ServerCode in einem Editor schreiben und programmatisch hochladen

In diesem Blogartikel beschreiben wir, wie man ServerCode nicht auf der Webseite schreibt, sondern programmatisch hochladen kann.

Eine kurze Einführung: Wer die Vorgänge beim Laden und Speichern von Daten im Backend anpassen und kontrollieren möchte, kann dies mit dem ServerCode Modul erreichen. Das ServerCode Modul ermöglicht es, eigenen JavaScript Code zu schreiben, welcher ausgeführt werden kann, bevor oder nachdem vom SDK oder per HTTP Request ein Objekt gespeichert, geladen, aktualisiert oder gelöscht wird.

Den entsprechenden Code kann man im Dashboard schreiben in dem Bereich “ServerCode”, sofern das Modul aktiviert ist. Doch vielleicht möchte nicht jeder den Code auf der Webseite schreiben, sondern in einem eigenen Editor wie Emacs, Vim, oder GitHub’s Atom.

Dazu kann einfach der Code in dem Editor deiner Wahl geschrieben werden. Folgende Hook-Methoden können unter anderem geschrieben werden:

  • aom_beforePost(obj)
  • aom_afterPost(obj)
  • aom_beforeGet(obj)
  • aom_afterGetAll(objects, query)
  • aom_beforePut(objFromDB, obj)
  • … und weitere, siehe hier

Welche Objekte und Methoden in diesen Hooks verwendet werden können ist ebenfalls in der Dokumentation des ServerCode Moduls beschrieben. Zum Beispiel kann mit “AOM.getRequestingUsername()” der Username des Users ermittelt werden, von welchem der Request stammt. Mit “var userName = AOM.findByNames( “Basics”, “User”, “userName==\”” + userName + “\”” )” kann dann das User Objekt ermittelt und damit weiter gearbeitet werden.

Wenn der Code fertig ist, muss er nur noch hochgeladen werden. Das muss nicht per Copy & Paste in den im Dashboard integrierten Code-Editor geschehen, sondern kann programmatisch geschehen. Dadurch kann man den Vorgang auch automatisieren und z.B. in einen Build-Prozess integrieren. Die entsprechende REST Schnittstelle ist hier in unserer REST API Dokumentation beschrieben.

Beispiel für den Upload von Code mit cURL (bei vielen Linux-Distributionen bereits enthalten, ansonsten über den Paketmanager beziehbar, und bei Windows über die Projektwebseite beziehbar):

curl -vX POST https://apiomat.org/yambas/rest/modules/<MODULENAME>/metamodels/<METAMODEL-ID>/scripts \
-H "X-apiomat-apikey:1234567891234567891" -u "admin0815@example.com:123456" \
--data-urlencode "scriptContent=function aom_beforeGet(obj) { AOM.log('request from' + AOM.getRequestingUsername()) }"

MODULENAME ist üblicherweise der App-Name mit angehängtem “Main”; Heisst die App also “NewFacebook”, dann heisst das Modul “NewFacebookMain”.
Wo bekommt man die METAMODEL-ID her? Wenn das Metamodel (also die Klasse) nicht über das Dashboard, sondern per eigenem HTTP Request angelegt wurde, sei es mit cURL oder auf anderem Wege, dann wurde die gesamte URL des Metamodels inkl. ID im Location Header der Antwort zurückgegeben. Andernfalls kann man alle angelegten Metamodels abfragen und sich dort die richtige ID suchen:

curl -vX GET https://apiomat.org/yambas/rest/modules/<MODULENAME>/metamodels \
-H "X-apiomat-apikey:1234567891234567891" -u "admin0815@example.com:123456"

Anschließend muss das Modul neu deployed werden, genau wie wenn man das Datenmodell im Dashboard oder über die REST Schnittstelle ändert:

curl -vX PUT https://apiomat.org/yambas/rest/modules/<MODULENAME> \
-d "{\"moduleStatus\":{\"LIVE\":\"DEPLOYED\"}}" \
-H "Content-Type: application/json" -u "admin0815@example.com:123456"

Beispiel für den Upload von Code mit Java bei Verwendung des Apache Commons HTTP Clients:

private void example() throws Exception
{
    String script = "scriptContent=function aom_beforeGet(obj)
        { AOM.log('Incoming request from ' + AOM.getRequestingUsername()) }";
    uploadScript("<MODULENAME>", "<METAMODEL-ID>", script);
    deploy("<MODULENAME>");
}

private void uploadScript(String moduleName, String metaModelId, String script)
    throws Exception
{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://apiomat.org/yambas/rest/modules/"
        + moduleName + "/metamodels/" + metaModelId + "/scripts");
    post.setHeader("X-apiomat-apikey", "1234567891234567891");
    post.setHeader("Authorization", getBasicAuth("admin0815@example.com", "123456"));
    List urlParameters = new ArrayList();
    urlParameters.add(new BasicNameValuePair("scriptContent", script));
    post.setEntity(new UrlEncodedFormEntity(urlParameters));
    HttpResponse response = client.execute(post);
    // Should be 201
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
}

private void deploy(String moduleName)
{
    HttpClient client = new DefaultHttpClient();
    HttpPut put = new HttpPost("https://apiomat.org/yambas/rest/modules/" + moduleName);
    post.setHeader("Authorization", getBasicAuth("admin0815@example.com", "123456"));
    HttpEntity entity = new StringEntity("{\"moduleStatus\":{\"LIVE\":\"DEPLOYED\"}}");
    put.setEntity(entity);
    HttpResponse response = client.execute(put);
    // Should be 200
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
}

private String getBasicAuth(String userName, String password) throws Exception
{
    String credentials = userName + ":" + password;
    String encodedAuth =
        new String( Base64.encodeBase64( credentials.getBytes( "UTF-8" ) ), "UTF-8" );
    return "Basic " + encodedAuth;
}

Viel Spaß beim Programmieren!


Viewing all articles
Browse latest Browse all 10