Instanzierung 2
Ein Thema, das mir in den letzten Tagen und Wochen den Nerv geraubt hat, ist Instanzierung. Genau bedeutet das: die Abschottung von Benutzergruppen gegenüber anderen in der Applikation.
Vielleicht wird es an der Stelle Zeit, erst einmal etwas über die Applikation zu erzählen, die wir entwickeln. Es handelt sich um ein flexibles Werkzeug, mit dem mehrere Benutzer gemeinsam als Team arbeiten können. Natürlich kann jeder einfach selbst ein Team anlegen, Teammitglieder eintragen und loslegen. Gegenüber normalen Ein-Benutzer-Systemen gibt es da nur ein kleines Problem: in Ein-Benutzer-Systemen ist jeder gegen den anderen abgeschottet. Man kann also die Inhalte einfach gegen die Benutzer-ID prüfen und somit zuordnen. Bei Mehrbenutzer-Systemen müssen die Inhalte innerhalb einer Gruppe zugänglich sein und von allen anderen abgeschottet sein. In etwa sieht das also so aus:

Jetzt wäre auch das noch halbwegs erträglich, aber erinnert ihr euch? Ich sagte “flexibles Werkzeug”. Im Grunde kann jedes Team die Applikation nach ihren Vorstellungen und Arbeitsabläufen umbiegen. Und dann sieht das plötzlich so aus:

Und das ist leider ein etwas anderes Kaliber. Plötzlich laufen völlig unterschiedliche Abläufe nebeneinander in einer Applikation. Die Teams haben also nur gemeinsam, dass sie aus einer Gruppe von Benutzern bestehen, die ihre Abläufe bearbeiten. Oberstes Gebot ist, dass sie unter keinen Umständen Inhalte, Abläufe, .. irgend etwas von anderen Instanzen auch nur mitbekommen.
In der Theorie sieht das einfach aus. Jedes Element in der Datenbank muss nur einer Instanz zugeordnet werden. In der Praxis bedeutet das aber auch, dass jedes SQL-Statement auf die Instanz prüfen muss. Das ist etwas unangenehmer.
Unser Framework kann zwar wunderbar mit Benutzern, Rechten, Rollen und dem ganzen Kram umgehen, aber von Instanzen hat es keine Ahnung. Und soll es auch nicht. Also fröhlich alle Klassen überladen und Prüfungen für Instanzen eingebaut. Im Grunde funktionierte das sehr gut, aber das Testen wird trotzdem zum Albtraum. Habe ich schon erwähnt, dass es mehrere Arten von Instanzen mit unterschiedlichen Möglichkeiten gibt?
Im Nachhinein bin ich sehr froh das Framework ordentlich objektorientiert aufgezogen zu haben. In der Praxis erwies sich das selbst bei so massiven Eingriffen noch handlich und hilfreich. Rückblickend war die Implementierung von Instanzen zwar zeitaufwändig, aber es hat nicht das Framework überfordert (obwohl es manchmal so aussah). Letztendlich sieht der Aufbau nun so aus:

Bleibt nur noch das Testing. Und das ist in der Tat das, was mir so sehr auf die Nerven ging. Klar kann man die Abschottung auch in die Unit-Tests einbauen, aber wirkliche Sicherheit erhält man dadurch nicht. Insbesondere die vermaledeiten AJAX-Aufrufe erwiesen sich als massive Hass-Konstrukte. Von jedem aufrufbare Aktionen und Datenquellen, die per Parameter gesteuert werden? Da kommt doch Freude auf.
Doch langsam aber sicher scheint es so, als wären die letzten Bugs bezüglich Instanzierung (und deren Sicherheit) beseitigt. Ist das System fertig für den Produktiv-Einsatz? Hölle, nein, wir reden hier von sensitiven Daten die das System verwalten soll. Aber am Horizont nähert sich die Closed Beta. Und endlich die Erklärung, um was es sich bei der Applikation eigentlich handelt.
Lass mich raten: Visio?
Hehehe..