12 KiB
Schritt 2: Interface erstellen
← Zurück: Datenmodell erstellen | Weiter: Feature-Logik implementieren →
Übersicht: Was sind Interfaces?
Interfaces sind aktive Klassen, die den Datenbankzugriff implementieren. Sie unterscheiden sich von Datamodels (die nur die Datenstruktur definieren):
| Aspekt | Datamodels | Interfaces |
|---|---|---|
| Zweck | Definiert WAS (Datenstruktur) | Implementiert WIE (Datenzugriff) |
| Inhalt | Pydantic-Modelle mit Feldern und Validierung | Klassen mit CRUD-Methoden (create, get, update, delete) |
| Beispiel | class Projekt(BaseModel): ... |
def createProjekt(...) -> Projekt: ... |
| Aktivität | Passiv (nur Struktur) | Aktiv (führt Operationen aus) |
Analogie:
- Datamodel = Bauplan (beschreibt das Haus)
- Interface = Bauunternehmer (baut das Haus)
Struktur: Real Estate CRUD-Interface
Da das Feature stateless arbeitet, benötigen wir nur ein Interface für CRUD-Operationen auf Real Estate-Entitäten:
Real Estate-Datenmodelle → Real Estate CRUD-Interface
Datamodel: datamodelRealEstate.py
ProjektParzelleDokumentKanton,Gemeinde,LandGeoPolylinie,GeoPunktKontext- etc.
Interface: interfaceDbRealEstateObjects.py
RealEstateObjects(Haupt-Interface)RealEstateAccess(Zugriffskontrolle)- Methoden:
createProjekt(),getParzelle(),updateDokument(), etc.
Hinweis: Das Haupt-Interface enthält auch executeQuery() für direkte SQL-Queries (stateless)
Warum nur ein Haupt-Interface?
-
Stateless Design:
- Keine Session-Verwaltung notwendig
- Direkte CRUD-Operationen auf Real Estate-Modellen
-
Einfache Architektur:
- Ein Interface für alle CRUD-Operationen
- Weniger Komplexität, bessere Wartbarkeit
-
Query-Funktionalität:
executeQuery()ist direkt im Haupt-Interface verfügbar- Für direkte SQL-Queries (stateless)
- Keine Session-Management-Funktionen
Zu erstellende Dateien
Schritt 2a: Real Estate CRUD-Interface (ERFORDERLICH)
Zwei separate Dateien (wie bei anderen Features):
Datei 1: modules/interfaces/interfaceDbRealEstateAccess.py
Enthält:
RealEstateAccess- Zugriffskontrolle für Real Estate-Entitäten- Methoden:
uam(),canModify()
Zweck: Prüft Zugriffsrechte und filtert Daten basierend auf Benutzerprivilegien
Datei 2: modules/interfaces/interfaceDbRealEstateObjects.py
Enthält:
RealEstateObjects- Haupt-Interface für CRUD-OperationengetInterface()- Factory-Funktion- Nutzt
RealEstateAccessaus der Access-Datei
Zweck: Verwaltet Real Estate-Entitäten (Projekt, Parzelle, Dokument, etc.)
Nutzt:
datamodelRealEstate.py(Projekt, Parzelle, Dokument, etc.)interfaceDbRealEstateAccess.py(für Zugriffskontrolle)
Wann benötigt: Für alle CRUD-Operationen auf Real Estate-Entitäten (z.B. Projekte erstellen/bearbeiten, Parzellen verwalten). Dies ist das Haupt-Interface für das Feature.
Übersicht: Dateien und ihre Beziehungen
┌─────────────────────────────────────────────────────────────┐
│ DATAMODELS (Struktur) │
├─────────────────────────────────────────────────────────────┤
│ datamodelRealEstate.py │
│ ├── Projekt │
│ ├── Parzelle │
│ ├── Dokument │
│ ├── Kanton, Gemeinde, Land │
│ ├── GeoPolylinie, GeoPunkt │
│ ├── Kontext │
│ └── ... │
└─────────────────────────────────────────────────────────────┘
│
│ nutzt
▼
┌─────────────────────────────────────────────────────────────┐
│ INTERFACES (Zugriff) │
├─────────────────────────────────────────────────────────────┤
│ REAL ESTATE CRUD-INTERFACE (ERFORDERLICH) │
│ │
│ interfaceDbRealEstateAccess.py │
│ └── RealEstateAccess │
│ ├── uam() │
│ └── canModify() │
│ │
│ interfaceDbRealEstateObjects.py │
│ ├── RealEstateObjects │
│ │ ├── createProjekt() │
│ │ ├── getProjekt() │
│ │ ├── updateProjekt() │
│ │ ├── deleteProjekt() │
│ │ ├── createParzelle() │
│ │ ├── getParzelle() │
│ │ └── ... (CRUD für alle Entitäten) │
│ └── getInterface() │
│ └── nutzt RealEstateAccess │
│ │
│ │
│ HINWEIS: executeQuery() ist im Haupt-Interface verfügbar │
│ (kein separates Chat-Interface notwendig) │
└─────────────────────────────────────────────────────────────┘
Interface-Struktur: Access vs. Objects
Jedes Interface besteht aus zwei Klassen:
1. *Access Klasse (Zugriffskontrolle)
Zweck: Prüft, wer was sehen/dürfen darf
Methoden:
uam()- Filtert Daten basierend auf BenutzerprivilegiencanModify()- Prüft, ob Benutzer ändern darf
Beispiel: RealEstateAccess
2. *Objects Klasse (Haupt-Interface)
Zweck: Führt CRUD-Operationen aus
Methoden:
create*()- Erstellt neue Einträgeget*()- Lädt einzelne Einträge nach IDget*()(Plural) - Lädt Listen von Einträgen mit optionalen Filternupdate*()- Aktualisiert Einträgedelete*()- Löscht EinträgeexecuteQuery()- Führt direkte SQL-Queries aus (stateless)
Nutzt: *Access für Zugriffskontrolle
Beispiel: RealEstateObjects
Warum getrennt?
- Separation of Concerns: Zugriffskontrolle ist separate Verantwortlichkeit
- Wiederverwendbarkeit: Access-Klasse kann von mehreren Interfaces genutzt werden
- Testbarkeit: Zugriffskontrolle kann unabhängig getestet werden
Implementierung: Real Estate CRUD-Interface
Das Real Estate CRUD-Interface besteht aus zwei separaten Dateien, genau wie bei anderen Features (interfaceDbAppObjects.py + interfaceDbAppAccess.py).
Datei 1: Access-Implementierung
Datei: modules/interfaces/interfaceDbRealEstateAccess.py
Enthält:
RealEstateAccessKlasse- Methoden:
uam(),canModify()
Funktionalität:
uam(): Filtert Datensätze basierend auf Benutzerprivilegien (SYSADMIN sieht alles, ADMIN sieht Mandat, User sieht nur eigene)canModify(): Prüft, ob Benutzer Datensätze ändern/löschen darf- Fügt Zugriffskontroll-Attribute hinzu:
_hideView,_hideEdit,_hideDelete
Datei 2: Objects-Implementierung
Datei: modules/interfaces/interfaceDbRealEstateObjects.py
Enthält:
RealEstateObjectsKlasse (Haupt-Interface)getInterface()Factory-Funktion (Singleton-Pattern)
Datenbank-Konfiguration:
- Verwendet
DB_REALESTATE_*Umgebungsvariablen (nichtDB_APP_*) - Variablen:
DB_REALESTATE_HOST,DB_REALESTATE_DATABASE,DB_REALESTATE_USER,DB_REALESTATE_PASSWORD_SECRET,DB_REALESTATE_PORT
CRUD-Methoden für alle Entitäten:
- Projekt:
createProjekt(),getProjekt(),getProjekte(),updateProjekt(),deleteProjekt() - Parzelle:
createParzelle(),getParzelle(),getParzellen(),updateParzelle(),deleteParzelle() - Dokument:
createDokument(),getDokument(),getDokumente(),updateDokument(),deleteDokument() - Gemeinde:
createGemeinde(),getGemeinde(),getGemeinden(),updateGemeinde(),deleteGemeinde() - Kanton:
createKanton(),getKanton(),getKantone(),updateKanton(),deleteKanton() - Land:
createLand(),getLand(),getLaender(),updateLand(),deleteLand()
Zusätzliche Funktionalität:
- List-Methoden: Alle Entitäten haben
get*()(Plural) Methoden für Listen mit optionalen Filtern - Location-Resolution:
getParzellen()löst automatisch Gemeinde-Namen zu IDs auf - Query-Ausführung:
executeQuery()für direkte SQL-Queries (stateless) - Supporting Tables: Automatische Erstellung von Land, Kanton, Gemeinde, Dokument Tabellen bei Initialisierung
Wichtige Punkte:
- DatabaseConnector: Nutzt
connectorDbPostgre.DatabaseConnectorfür Datenbankzugriff - Access Control:
RealEstateAccessimplementiert Benutzer- und Mandaten-Filterung - Singleton Pattern:
getInterface()erstellt pro User eine Instanz - CRUD-Operationen:
recordCreate,recordModify,recordDelete,getRecordsetvom Connector - MandateId: Wird automatisch gesetzt, wenn nicht vorhanden
- List-Methoden: Alle Entitäten haben
get*()(Plural) Methoden für Listen mit optionalen Filtern - Location-Resolution: Parzelle-Filter können Gemeinde-Namen enthalten, die automatisch zu IDs aufgelöst werden
- Query-Ausführung:
executeQuery()ist direkt im Haupt-Interface verfügbar (kein separates Chat-Interface notwendig) - Datenbank-Initialisierung: Unterstützende Tabellen (Land, Kanton, Gemeinde, Dokument) werden automatisch erstellt
Query-Ausführung: executeQuery()
Das Haupt-Interface RealEstateObjects enthält die Methode executeQuery() für direkte SQL-Queries. Kein separates Chat-Interface ist notwendig.
Verwendung
Für CRUD-Operationen (EMPFOHLEN):
- Verwenden Sie die strukturierten CRUD-Methoden (
createProjekt(),getProjekte(), etc.) - Vorteile: Validierung, Zugriffskontrolle, Typsicherheit, keine SQL-Injection-Risiken
Für komplexe SELECT-Queries (OPTIONAL):
- Verwenden Sie
executeQuery()direkt im Haupt-Interface - Warnung: Nur für SELECT-Queries, immer Parameterisierung verwenden, Queries validieren
Hinweise zur Query-Ausführung
- Stateless: Keine Session-Management-Funktionen
- Nur für Queries: Primär für SELECT-Queries gedacht
- Sicherheit: Immer Parameterisierung verwenden
- Validierung: Queries sollten validiert werden (z.B. nur SELECT erlauben)
Zusammenfassung: Benötigte Dateien
Erforderlich (für CRUD-Operationen):
-
✅
modules/datamodels/datamodelRealEstate.py- Real Estate-Datenmodelle (Projekt, Parzelle, Dokument, etc.)
-
✅
modules/interfaces/interfaceDbRealEstateAccess.py- Zugriffskontrolle für Real Estate-Entitäten (RealEstateAccess)
-
✅
modules/interfaces/interfaceDbRealEstateObjects.py- Real Estate CRUD-Interface (RealEstateObjects)
- Nutzt
interfaceDbRealEstateAccess.py - Haupt-Interface für alle CRUD-Operationen
Hinweis zu Query-Ausführung:
- ✅
executeQuery()ist bereits im Haupt-Interface verfügbar- Kein separates Chat-Interface notwendig
- Direkt in
RealEstateObjectsverfügbar - Stateless, keine Session-Management
← Zurück: Datenmodell erstellen | Weiter: Feature-Logik implementieren →