Moin moin und hallo,

im Folgenden Artikel möchte ich die Entwicklung meines Cloud-Dienstes weiter vorantreiben und auf die ersten Implementierung-Details eingehen.


Ziel

Im letzten Artikel habe ich mich vor allem versucht die Idee zu beschreiben und in ein dazu passendes Model zu übertragen.

Dieses Model lässt sich nun ohne wieteres in ein konrektes Datenmodell umwandeln.

MEAN Stack

Für die Umsetzung habe ich mich für den MEAN Stack entschieden. Da ich noch ganz am Anfang stehe, können sich die Anforderungen noch schnell und umfangreich ändern und in solchen Fällen ist dieser Technologie-Stack ideal.

Ich setze aber nicht reines Express JS ein sondern Sails JS, dass mir schon viel Konfigurationaufwand abnimmt und mit den getroffenen Konventionen den Entwicklungsaufwand veringert sowie sicherstellt, dass ein gewisses Maß an Software-Qualität schon von vornherein gewährleistet ist.

MEAN steht im Übrigen für:

  1. Mongo DB
  2. Express JS
  3. Angular JS
  4. Node JS

Ausgangssituation

Im vorherigen Teil haben wir uns das folgende KLassen-Diagramm erarbeitet

Model Diskurs App


Aber wie lässt sich dieses nun in ein Datenmodell umwandeln. Dazu muss man wissen, dass Sails JS das Hauseigene ORM Waterline einsetzt. Also wird die formal uns schon eine Struktur vorgeben. Schauen wir man zum Beispiel auf das Model Commentator:

module.exports = {

    attributes: {

        blocked: {
            type: "boolean"
        },

        comments: {
            collection: "Comment",
            via: "author"
        },

         blockades: {
            collection: "Block",
            via: "commentator"
        }
    }
}

Wie man sieht findet man die im Model definierten Eigenschaften wieder aber auch zwei neue 1-n-Relationen wieder nämlich:

  1. comments

    • Jeder Commentator kann n-Kommentare schreiben
  2. blockades

    • Jeder Commentator kann in n-Channels blockiert werden, sprich n-Blocks erhalten

Jeder Commentator kann sich in undenlichen vielen Kanälen diskutieren und ist dabei immer auch ein User

Im Model erbt der Commentator sowie Moderator von der Klasse User. Diese Vererbung löse ich in Form einer weiteren Realtion zu dem Datenmodell “User” auf:

module.exports = {

    attributes: {

        name: {
            type: 'String',
            required: true
        },

        email: {
            type: 'String',
            required: true,
            unique: true
        },

        password: {
            type: 'String',
            required: true
        },

        activatedAt: {
            type: 'Date'
        },

        enabled: {
            type: 'Boolean',
            defaultsTo: false
        },

        moderator: {
            model: 'Moderator'
        },

        commentator: {
            model: 'Commentator'
        }
    }
}

Die Vererbung wird in Form einer 1-1-Realtion auf gelöst. Entsprechnd muss man das Commentator-Modell erweitern :

module.exports = {

    attributes: {

        blocked: {
            type: "boolean"
        },

        comments: {
            collection: "Comment",
            via: "author"
        },

         blockades: {
            collection: "Block",
            via: "commentator"
        },

        user: {
            model: 'User'
        },
    }
}

Nach dem gleichen Schema werden alle anderen Modelle umgesetzt.

Backend

Auf die Details, wie man Sails JS im MEAN-Stack einsetzt, bin ich schon an derer Stelle eingegangen und möchte hier den Setup-Schritt überpsringen.

Einer der Vorteile von Sails JS sind die angesprochenen Konventionen. Einer davon ist die per Default verfügbare REST-API zu allen definierten Datenmodellen, falls entsprechende Controller ebenfalls angelegt worden sind.

Unsere Modell-Struktur sieht derzeit wie folgt aus:

Datenmodell


Legen wir passend die Controller, nur mit “module.exports” und ohne wietere Impelemtierung an, steht uns schon die REST-API zur Verfügung:

Controller

REST-API

Die Schnittstellen, die uns jetzt zur Verfügung stehen decken zunächst nur CRUD ab, und lassen sich gut per z.B. Postman testen.

Legen wir dazu mal einen User an: User anlegen

Dieser User soll jetzt ein Commentator sein: Commentator anlegen

Machen wir mal den User zu einem Moderator : Moderator anlegen

Legen wir mal unseren ersten Channel an : Channel anlegen

Jetzt kann endlich der erste Comment übertragen werden: Comment anlegen

Wir können uns wie folgt vergewissern, dass alles erfolgreich angelegt worden ist:

Comment Liste


Fazit & Ausblick


Ich habe in diesem Artikel versucht die Basis für die zukünftige Weiterentwicklung zu legen.

Wie an der Rangehensweise zu erkennen ist, legen wir (Q2B GmbH) / ich nicht einfach mit dem “Coden” los, sondern erarbeiten uns im Vorfeld schon ein möglichst tragfähiges Konzept und in Folge eine Software-Archetiktur.

Eine erfolgreiche Software-Entwicklung kann nur zielgerichtet erfolgen. Die Software entsteht immer lange vor dem Programmcode. Quellcode ist nur eine mögliche Repräsentation der dahinter liegenden Idee.

Zu Verdeutlichung möchte ich darauf Hinweisen, dass die Implementierung auch in einer anderen Programmiersprache und Framework genauso umgesetzt werden kann.

Die einzige Konstante ist die Formalisierung, die im Vorfeld erarbeitet wird.

Was bisher gänzlich fehlt ist das Frontend. Das werde ich mit Hilfe von Angular JS und Bootstrap umsetzen. Die umfangreiche Erläuterung folgt aber erst im nächsten Teil.

Aber auch das Backend wird nicht mehr so rudimentär bleiben wir jetzt. Wir müssen noch etwas an den Sicherheitsmechanismen schrauben und eine Registrierungsmaske einführen.


#### In diesem Sinne, bis demnächst!