Die REST-API von SeedDMS ansprechen

Vor einiger Zeit habe ich mir auf meinem Linux-Server hier zu Hause das Dokumentenmanagement-System SeedDMS installiert. Ich habe dieses Produkt ausgewählt, weil es mit PHP programmiert ist (eine Alternative benötigt Java und scheint nach einem Testlauf nicht die erhofte Maturität aufzuweisen.)

Obwohl die Installation dieses Produkts auch nicht ganz simpel ist (dies erläutere ich dereinst in einem separaten Blog-Artikel), weist es die nötige Maturität aus und bringt eine ansehnliche Liste von Features mit. Grösstes Manko ist eine aktuelle, für Endanwender verständliche Dokumentation.

Eine der von mir gesuchten Funktionalitäten ist die REST API, welche man unter der URL /restapi/index.php ansprechen kann.

Als ich damit die ersten API-Calls machen wollte, kam leider eine leere Antwort zurück. Im php.err fand sich folgende Zeile:

...
[27-Nov-2016 11:55:44 Europe/Zurich] PHP Warning: require(Slim/Slim.php): failed to open stream: No such file or directory in /var/www/seeddms/restapi/index.php on line 55
[27-Nov-2016 11:55:44 Europe/Zurich] PHP Fatal error: require(): Failed opening required 'Slim/Slim.php' (include_path='/var/www/seeddms/::.:/usr/share/php/') in /var/www/seeddms/restapi/index.php on line 55
...

Hmmm! Da scheinen mit der Quickstart-Version 5.0.7 (die einzige, die ich auf meinem Server zum Laufen gebracht zu habe) nicht alle externen Dependencies mitzukommen.

Ein Issue auf Sourceforge bestätigt meine Vermutung, bringt aber keine Lösung mit (was bringt es dem Endbenutzer, wenn die Dependency im README ergänzt wird?).

Ein, zwei Google-Suchen später finde ich dann einerseits die Web-Site des Frameworks, andererseits das Github-Repository.

Doch wie und wo installiere ich das Paket nun?

Eine weitere Google-Suche leitet mich auf eine Web-Site weiter, welche die Dokumentenstruktur einer älteren SeedDMS-Installation auflistet und dabei auch einen Ordner Slim aufweist. Der Ordner enthält folgende Dateien:

Parent Directory

Environment.php

Exception/

Http/

Log.php

LogWriter.php

Middleware.php

Middleware/

Route.php

Router.php

Slim.php

View.php

Als ich diese Struktur mit dem Github-Repository verglich, konnte ich keine Ähnlichkeiten feststellen.

Dann der Geistesblitz: Vielleicht verwendet SeedDMS noch eine ältere Version des Frameworks? Richtig geraten: Aktuell trägt das Framework die Version 3.0, SeedDMS baut aber auf Version 2.0 des Frameworks auf.

Ein Blick auf die Dateistruktur des 2.x Branches bestätigt meine Vermutung. Ich lade mir von diesem Branch die ZIP-Datei herunter und kopiere anschliessend den Unterordner Slim im Ordner Slim-2.x in das Web-Root von SeedDMS (/var/www/seeddms/Slim).

Nun klappt der Aufruf der API, weil PHP die Include-Datei unter /var/www/seeddms/Slim/Slim.php findet!

Am Ende der /restapi/index.php findet sich auch eine Liste aller verfügbarer API-Calls:

$app->post('/login', 'doLogin');
$app->get('/logout', 'doLogout');
$app->get('/account', 'getAccount');
$app->get('/search', 'doSearch');
$app->get('/searchbyattr', 'doSearchByAttr');
$app->get('/folder/:id', 'getFolder');
$app->post('/folder/:id/move', 'moveFolder');
$app->delete('/folder/:id', 'deleteFolder');
$app->get('/folder/:id/children', 'getFolderChildren');
$app->get('/folder/:id/parent', 'getFolderParent');
$app->get('/folder/:id/path', 'getFolderPath');
$app->get('/folder/:id/attributes', 'getFolderAttributes');
$app->post('/folder/:id/createfolder', 'createFolder');
$app->put('/folder/:id/document', 'uploadDocument');
$app->get('/document/:id', 'getDocument');
$app->delete('/document/:id', 'deleteDocument');
$app->post('/document/:id/move', 'moveDocument');
$app->get('/document/:id/content', 'getDocumentContent');
$app->get('/document/:id/versions', 'getDocumentVersions');
$app->get('/document/:id/version/:version', 'getDocumentVersion');
$app->get('/document/:id/files', 'getDocumentFiles');
$app->get('/document/:id/file/:fileid', 'getDocumentFile');
$app->get('/document/:id/links', 'getDocumentLinks');
$app->get('/document/:id/attributes', 'getDocumentAttributes');
$app->put('/account/fullname', 'setFullName');
$app->put('/account/email', 'setEmail');
$app->get('/account/locked', 'getLockedDocuments');
$app->post('/accounts', 'createAccount');
$app->get('/accounts/:id', 'getAccountById');
$app->put('/accounts/:id/disable', 'setDisabledAccount');
$app->post('/groups', 'createGroup');
$app->get('/groups/:id', 'getGroup');
$app->put('/groups/:id/addUser', 'addUserToGroup');
$app->put('/groups/:id/removeUser', 'removeUserFromGroup');
$app->put('/folder/:id/setInherit', 'setFolderInheritsAccess');
$app->put('/folder/:id/access/group/add', 'addGroupAccessToFolder'); //
$app->put('/folder/:id/access/user/add', 'addUserAccessToFolder'); //
$app->put('/folder/:id/access/group/remove', 'removeGroupAccessFromFolder');
$app->put('/folder/:id/access/user/remove', 'removeUserAccessFromFolder');
$app->put('/folder/:id/access/clear', 'clearFolderAccessList');
$app->run();

Eine simple API-Abfrage schaut folgendermassen aus:

/restapi/index.php/login mit den POST-Parametern user und pass

Das Session-Cookie mydms_session=XXX; in eine Variable speichern. Es muss bei allen folgenden API-Calls mit übermittelt werden

/restapi/index.php/searchbyattr?name=AttrName&value=AttrValue mit den GET-Parametern name und value

Die Antwort wird als JSON zurückgegeben, welche mit json_decode() in ein PHP-Objekt/Array geparsed werden kann