gedankenessen-legacy / prototyping

0 stars 0 forks source link

Wo wird die Rolle von Nutzer in Projekt gespeichert ? #1

Closed marlonschlosshauer closed 3 years ago

marlonschlosshauer commented 3 years ago

Wie ich die jetzige Implementation verstehe: In der Collection der User wird nichts zu der Rolle abgespeichert. Information zu der Rolle steht in dem Document in der Projects Collection. Unter ProjectUsers kann die Rolle über id user_id und _id (Projekt Id) herausgefunden werden.

Wie ich es mir in einer SQL Datenbank vorstelle: Es gibt einen Table für UserRole in der die Id des Users, die Id Des Projektes und die Rolle (Enum) in einer Zeile stehen.

Würde es Sinn machen für die Rollen eine eigene Collection zu erstellen ? Gibt es einen Vorteil zu der momentanen Implementierung ?

Projekt2_Database_Design

pheim1 commented 3 years ago

Ich dachte mir, dass wenn man eine Abfrage zu einem Projekt macht, dann hat man direkt schon alle UserIds sowie dessen Rollen zu diesem Projekt, ohne eine zweite Abfrage zu machen.

Um unsere Endpunkte zu sichern, müssen wir ja bei jedem Access auf die API eine Middleware haben, die überprüft, ob dieser User Änderungen an diesem Endpunkt für diese Ressource machen darf.

Einen Vorteil für deinen Vorschlag kann ich leider nicht finden, falls mir einen einfällt, informier ich dich hier.

Mein Schema würde es erlauben, dass ein User mehrere Projekten und Firmen angehört equivalent zu GitHub mit den Organisationen.

marlonschlosshauer commented 3 years ago

Das wir keine zweite Abfrage machen müssten, finde ich sogar einen großen Vorteil. Würde ein Prototyp von dem Umgang mit dieser Struktur hier Sinn machen oder ist dank dem ORM die Verwendung eigentlich gleich ?

pheim1 commented 3 years ago

Ein ORM wird nicht zum Einsatz kommen, wenn überhaupt ein ODM wobei ich bis jetzt kein Vorteil im Einsatz eines ODMs sehe. Wir implementieren das Repository-Pattern und MongoDB ist echt angenehm zum Abfragen.

Hier ein Auszug der generischen Base Repository (müsste noch erweitert werden für unseren UseCase -> companyId & projectId müssen übereinstimmen, wir wollen ja nur unsere Daten):

    public virtual async Task<TEntity> Get(string id)
    {
        var objectId = new ObjectId(id);

        FilterDefinition<TEntity> filter = Builders<TEntity>.Filter.Eq("_id", objectId);

        return await _dbCollection.FindAsync(filter).Result.FirstOrDefaultAsync();
    }

Alle Collections erhalten eine Repository Klasse die von BaseRepository erbt , und damit die Basis Funktionen für einfache Abfragen implementieren.