24 KiB
RBAC Zugriffskonzept (Katalog + Seiten + Endpoints)
Kontext aus dem Codebestand (aktueller Stand)
- RBAC-Regeln und Rollen existieren bereits mit immutable Kontextfeldern und AccessRule-Unterstuetzung fuer DATA/UI/RESOURCE. Siehe
AccessRuleContext,Role,AccessRulein:
21:116:gateway/modules/datamodels/datamodelRbac.py
class AccessRuleContext(str, Enum):
DATA = "DATA"
UI = "UI"
RESOURCE = "RESOURCE"
...
class AccessRule(BaseModel):
roleId: str
context: AccessRuleContext
item: Optional[str]
view: bool
read: Optional[AccessLevel]
create: Optional[AccessLevel]
update: Optional[AccessLevel]
delete: Optional[AccessLevel]
- RBAC-Endpunkte fuer Permissions und Access Rules existieren bereits (Access Rules sind SysAdmin-only):
35:214:gateway/modules/routes/routeRbac.py
@router.get("/permissions")
@router.get("/permissions/all")
@router.get("/rules")
- Mandantenzuordnung von Benutzern/Rollen laeuft ueber
/api/mandates/{mandateId}/usersund die Junction-TabellenUserMandateRole(Mandanten-Kontext) undFeatureAccessRole(Feature-Instanz-Kontext):
15:149:gateway/modules/datamodels/datamodelMembership.py
class UserMandateRole(BaseModel):
userMandateId: str
roleId: str
...
class FeatureAccessRole(BaseModel):
featureAccessId: str
roleId: str
- Im Frontend existieren Admin-Seiten fuer Benutzer-Mandant-Mitgliedschaften und Mandanten-Rollen:
1:120:frontend_nyla/src/pages/admin/AdminUserMandatesPage.tsx
1:185:frontend_nyla/src/pages/admin/AdminMandateRolesPage.tsx
Damit ist klar:
- Zugriffregeln existieren bereits (view + CRUD mit none/my/group/all).
- Fehlend ist ein Katalog + Editor-UI fuer Objektregeln (DATA/UI/RESOURCE).
Entscheidungen / Antworten zu Inputs
-
Shared Katalog-Location (Gateway):
- Es gibt aktuell keinen gemeinsamen RBAC-Objektkatalog in datamodels. Datamodels definieren nur Schema.
- Ziel-Location:
gateway/modules/security/rbacCatalog/(Service-Layer), nichtdatamodels. - DATA-Objekte koennen on-the-fly aus Modellen/Attributen abgeleitet werden, ohne Persistenz.
- UI- und RESOURCE-Objekte brauchen explizite Registry-Eintraege, persistent in einer Katalog-Tabelle, dann ueber Gateway-Endpunkte abrufbar.
- Feature-Initialisierung im Gateway registriert die UI/RESOURCE-Keys. Die Admin-UI zeigt alle persistierten Katalogobjekte (keine Filterung nach Registrierungsstatus).
- Persistenz ist Pflicht, um Regeln nicht zu verlieren, wenn Features entfernt oder deaktiviert werden.
-
Admin-Seite fuer Mandantenverwaltung: gleich wie Rollen-Zuordnung?
- Mandanten-CRUD getrennt von Rollen-Zuordnung.
- Heute: Mandanten-CRUD ist SysAdmin-only (
/api/mandates), Rollen-Zuordnung ist Mandanten-Admin (/api/mandates/{mandateId}/users). - Ziel: separate AdminMandatesPage (SysAdmin), AdminUserMandatesPage fuer Rollen-Zuordnung.
- Zusaetzlich: AdminRbacRulesPage (Feature-Instanz-Admin) fuer Objektregeln.
-
Registry-Eigentum und Quellen:
- Feature-Initialisierung im Gateway definiert alle UI/RESOURCE-Objekte der Features.
- Frontend registriert keine Feature-UI-Objekte.
- System-UI-Objekte werden direkt im Backend definiert (keine UI-Abhaengigkeit).
-
UI-Permissions:
- UI-Kontext nutzt nur
view. - Kein create/update/delete fuer UI-Kontext.
- UI-Kontext nutzt nur
-
Katalog-Scope:
- Der Katalog enthaelt alle Objekte (global + mandate + feature instance).
-
Bootstrap-Scope (interfaceBootstrap.py):
- Bootstrap laeuft nur, wenn die Datenbank leer ist.
- Bootstrap erzeugt nur System-RBAC (Root-Mandant, Admin/Event-User, globale Rollen, Basisregeln).
- Bootstrap definiert keine Feature-Rollen oder Feature-Zugriffsregeln.
- System-UI-Objekte sind im Backend definiert und koennen im Bootstrap registriert werden.
Zielarchitektur
A) RBAC Objektkatalog (shared im Gateway)
Ziel: Ein einziger Objektbaum fuer DATA / UI / RESOURCE, mit Mandant + Feature-Instanz-Kontext.
Quelle je Objekttyp:
- DATA: abgeleitet aus Model-Metadaten (Tabellen + Felder).
- UI: Registry aus Feature-Initialisierung plus backend-definierte System-UI-Objekte.
- RESOURCE: Registry aus Feature-Initialisierung.
Persistenz:
- Kleine Katalog-Tabelle
RbacObject(oder aehnlich) fuer UI/RESOURCE. - DATA-Objekte nicht speichern; on-demand generieren.
- Nicht registrierte Objekte bleiben im Katalog und bleiben selektierbar; keine Filterung nach Registrierung.
Model (gateway/modules/datamodels/datamodelRbacCatalog.py):
idobjectKey(unique, z.B.ui.feature.trustee.contracts.tab.documents)context(DATA | UI | RESOURCE)featureCode(z.B.trustee)featureInstanceId(nullable)mandateId(nullable)label(multilingual, optional)meta(JSON, optional, z.B. Endpoint-Info oder UI-Hints)
Registry-Logik (gateway/modules/security/rbacCatalog/catalogService.py):
getDataCatalog(mandateId, featureInstanceId)-> aus Modellen ableiten:data.table.<table>data.table.<table>.<field>
getUiCatalog(mandateId, featureInstanceId, featureCode)-> ausRbacObject(UI-Kontext)getResourceCatalog(mandateId, featureInstanceId, featureCode)-> ausRbacObject(RESOURCE-Kontext)getCatalog(...)-> zusammenfuehren; alle Objekte (global + mandate + feature instance)
ObjectKey-Konvention:
- DATA:
data.table.<table>data.table.<table>.<field>
- UI:
ui.feature.<featureCode>.<area>.<element>- Beispiel:
ui.feature.trustee.contracts.tab.documents
- RESOURCE:
resource.feature.<featureCode>.<endpoint>- Beispiel:
resource.feature.trustee.contracts.create
B) RBAC Rules Editor (neue Admin-Seite)
Seitenname: AdminRbacRulesPage
Zielgruppe: Feature-Instanz-Admin
Route: /admin/feature-instances/:featureInstanceId/rbac
Navigation: Feature-Instanz-Seiten “Rollen” + “Zugriffe” ersetzen durch:
- “Feature-Benutzer” (bestehende User/Rollen-Zuordnung)
- “Zugriffe (RBAC)” (neue Seite fuer Objektregeln)
Layout:
- Links: Objektbaum (DATA / UI / RESOURCE)
- Oben: Rollen-Auswahl (Feature-Instanz-Rollen)
- Rechts: Regel-Grid (view/read/create/update/delete mit Scope)
- UI: nur
view - RESOURCE: view + CRUD mit none/my/group/all
- DATA: CRUD mit none/my/group/all
- UI: nur
Verhalten:
- Auswahl eines Objekts zeigt Regeln je Rolle.
- Aenderungen ueber create/update/delete von AccessRule.
- Nur Rollen der Feature-Instanz sind auswaehlbar.
C) Backend-Endpunkte (Vorschlag)
Katalog-Endpunkte
GET /api/rbac/catalog?featureInstanceId=...&featureCode=...&include=data,ui,resource
Response:
{
"data": [{ "objectKey": "data.table.TrusteeContract", "label": "...", "children": [...] }],
"ui": [{ "objectKey": "ui.feature.trustee.contracts", "label": "...", "children": [...] }],
"resource": [{ "objectKey": "resource.feature.trustee.contracts.create", "label": "..." }]
}
POST /api/rbac/catalog/ui
POST /api/rbac/catalog/resource
Payload:
{
"featureCode": "trustee",
"featureInstanceId": "optional",
"mandateId": "optional",
"objects": [
{ "objectKey": "ui.feature.trustee.contracts", "label": { "en": "...", "de": "..." }, "meta": {} }
]
}
Notes:
- Endpunkte registrieren/aktualisieren UI/RESOURCE-Katalogeintraege.
- DATA-Objekte werden nie gepostet.
- Admin-UI darf alle persistenten Objekte selektieren.
AccessRule-Endpunkte (bestehend, aber erweitert)
GET /api/rbac/rules?roleId=...&context=UI&item=ui.feature.trustee.contracts
POST /api/rbac/rules
PUT /api/rbac/rules/{ruleId}
DELETE /api/rbac/rules/{ruleId}
Policy:
- Nur SysAdmin darf Regeln verwalten.
Optionale Options-Endpunkte fuer Admin-UI
GET /api/options/mandate.roles?mandateId=...
GET /api/options/featureInstance.roles?featureInstanceId=...
GET /api/options/featureInstances?mandateId=...
D) Enforcement
- DATA: ueber RBAC in der Daten-Schicht.
- UI: Frontend nutzt
getAllPermissionsund blendet aus viaview. - RESOURCE: Gateway prueft am Endpoint-Entry.
Implementierungsschritte (high level)
- Katalog-Model + Service im Gateway.
- Katalog-Endpunkte in
routeRbacCatalog.py. - Registry-Producer:
- Feature-Initialisierung registriert UI/RESOURCE.
- System-UI-Objekte werden im Backend registriert.
- Neue Admin-Seite
AdminRbacRulesPage. - Feature-Instanz-Navigation anpassen.
Bootstrap-Abgleich (aktuell vs Ziel)
Aktuell (interfaceBootstrap.py):
- Root-Mandant, Admin-User, Event-User.
- Globale Template-Rollen:
admin,user,viewer. - AccessRules (nur wenn keine existieren):
- Default DATA rules (item=None).
- Table-spezifische DATA rules (Mandate, UserInDB, Standard-Tabellen, AuthEvent).
- UI rules (context=UI, item=None, view=True).
- RESOURCE rules (context=RESOURCE, item=None, view=True).
- Feature-Initialisierung und Feature-Template-Rollen.
- AccessRules fuer Feature-Template-Rollen.
Ziel:
- Bootstrap nur System-RBAC, nur bei leerer DB.
- Feature-Definitionen/Template-Rollen/Feature-Regeln entfernen.
- Feature-Initialisierung verwaltet Katalog + Feature-Regeln.
Konkrete Aenderungen in interfaceBootstrap.py
Aus initBootstrap() entfernen:
initFeatures(db)_initFeatureTemplateRoleAccessRules(db)
Feature-Template-Rollen entfernen:
_initFeatureTemplateRoles(db)und alle Aufrufe
Feature-Regeln entfernen:
_initFeatureTemplateRoleAccessRules(db)und alle Aufrufe
System-RBAC behalten:
initRoles()fuer globale Rollenadmin,user,viewerinitRbacRules()fuer:- Default DATA rules
- Table-spezifische DATA rules
- UI rules (view)
- RESOURCE rules (view)
Bootstrap-Guard:
- Nur bei leerer DB.
- System-UI-Objekte im Backend registrieren (Bootstrap oder Startup).
Offene Punkte
- Alle Regeln bleiben persistent, bis sie manuell geloescht werden.
Feature-Containerisierung
Ziel
Jedes Feature in einem eigenen Ordner, damit Features durch Ordner-Praesenz aktiv sind. Jeder Container enthaelt:
datamodelFeatureXxx.pyinterfaceFeatureXxx.pyrouteFeatureXxx.py- main module fuer RBAC-Objekte
- optionale Helpers
Aktuelle Feature-Dateien
Routes (gateway/modules/routes):
routeFeatureTrustee.pyrouteFeatureChatbot.pyrouteFeatureChatDynamic.py(chatworkflow)routeFeatureNeutralization.pyrouteFeatureRealEstate.pyrouteFeatureWorkflow.py(automation events)routeFeatures.py(Feature/Instance-Management, kein Feature)
Interfaces (gateway/modules/interfaces):
interfaceDbTrustee.pyinterfaceDbChatbot.py(shared mit workflow)interfaceDbRealEstate.pyinterfaceFeatures.py(Feature/Instance-Management, kein Feature)
Datamodels (gateway/modules/datamodels):
datamodelTrustee.pydatamodelChat.pydatamodelWorkflow.pydatamodelRealEstate.pydatamodelNeutralizer.pydatamodelFeatures.py(Feature/Instance-Management, kein Feature)
Feature-Logik (gateway/modules/features):
chatbot/(mainChatbot.py, eventManager.py, chatbotConstants.py)realEstate/(mainRealEstate.py)neutralizePlayground/(mainNeutralizePlayground.py)
Nicht-Feature Module (aus features heraus):
gateway/modules/features/featuresLifecycle.py->gateway/modules/workflows/automation/(Event Scheduler Handling)gateway/modules/features/workflow/->gateway/modules/workflows/automation/(zentrale Workflow Execution Engine)gateway/modules/features/dynamicOptions/-> entfernen, dynamische Optionen ueber API-Routen
Zielstruktur pro Feature
trustee (neu):
- Move:
modules/routes/routeFeatureTrustee.pymodules/interfaces/interfaceDbTrustee.pymodules/datamodels/datamodelTrustee.py
- Add:
modules/features/trustee/mainTrustee.py(RBAC UI/RESOURCE-Katalog)
- Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
chatbot:
- Move:
modules/routes/routeFeatureChatbot.pymodules/interfaces/interfaceDbChatbot.py- modules/datamodels/datamodelChatbot.py
- Keep:
modules/features/chatbot/mainChatbot.py, Helpers
- Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
aichat (chatworkflow):
- Move:
modules/routes/routeFeatureChatDynamic.pymodules/interfaces/interfaceDbChat.py- modules/datamodels/datamodelChat.py
- Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
neutralizer (Rename von neutralizePlayground):
- Move:
modules/routes/routeFeatureNeutralization.pymodules/datamodels/datamodelNeutralizer.py
- Keep:
modules/features/neutralizePlayground/mainNeutralizePlayground.py(Rename Ordner zuneutralizer)
- Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
realestate:
- Move:
modules/routes/routeFeatureRealEstate.pymodules/interfaces/interfaceDbRealEstate.pymodules/datamodels/datamodelRealEstate.py
- Keep:
modules/features/realEstate/mainRealEstate.py
- Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
automation (neu):
-
Move:
modules/routes/routeDataAutomation.pymodules/interfaces/interfaceDbAutomation.py<<- new, to put all automation related interfaces here>>modules/datamodels/datamodelAutomation.py<<- new, to put class AutomationDefinition here>>
-
Add main module fuer RBAC-Katalog (falls noch nicht vorhanden)
-
Neue datamodel/interface/route/main Module
App-Routing als Plug-and-Play
gateway/app.py importiert routeFeature*.py aus Feature-Containern.
Pattern:
from modules.features.<featureCode>.routeFeature<FeatureCode> import router as <featureRouter>- Nur existierende Ordner werden eingebunden.
- Feature-Ordner loeschen = Feature deaktivieren.
Notwendige Referenz-Updates
- Imports in
app.pyauf neue Pfade. - Alle direkten Imports der alten
modules/routes/routeFeature*.py. featuresLifecycle.pyundworkflownachgateway/modules/workflows/automation/verschieben.dynamicOptionsentfernen und UI/API auf Options-Routen umstellen.- Referenzen auf
modules/interfaces/interfaceDb*.pyundmodules/datamodels/datamodel*.pyanpassen.
Machbarkeit und Bedenken
- Shared Interfaces/Models (chatbot/workflow) brauchen klare Ownership oder Shared-Modul.
- Feature-Lifecycle sollte Feature-Registry dynamisch laden.
- Feature-Registry (
routeFeatures.py,interfaceFeatures.py,datamodelFeatures.py) bleibt global.
Fragen / Klaerungen
- Bleiben
routeFeatures.pyundinterfaceFeatures.pyglobal? -> JA - Shared chatbot/chat: Shared-Modul oder Duplikation? --> Bereits dupliziert, somit separiert
- Feature-Discovery dynamisch (scan) oder explizite Imports in
app.py? -> dynamisch
Propositionen
routeFeatures.py,interfaceFeatures.py,datamodelFeatures.pyglobal behalten (System-Feature-Registry).- Explizite Imports in
app.py, aber zentral ueber Feature-Index. --> Die einzelnen Features benötigen keine zentrale komponente mehr. Echt plug & play - Event Scheduler + Workflow Engine in
gateway/modules/workflows/automation/(kein Feature). dynamicOptionsentfernen, dynamische Daten per spezialisierte API-Routen (RBAC-Admin Stil).
Bedenken
- Feature-Removal muss Cron/Jobs/Hook-Registrierungen entfernen. --> bereits implementiert. die werden dann nicht mehr gefunden
- Migration erzeugt viele Import-Aenderungen und Test-Anpassungen. --> korrekt. daher schritt für schritt plan machen
dynamicOptions-Ablösung erfordert UI/API-Umstellung auf neue Options-Routen.
Services in Feature-Container integrieren
Ziel
Services, die eindeutig zu Features gehoeren, sollen in den jeweiligen Feature-Container verschoben werden und plug&play geladen werden (analog zu Routes).
Zuordnung
- aichat:
gateway/modules/aicoregateway/modules/services/serviceAigateway/modules/services/serviceExtractiongateway/modules/services/serviceGenerationgateway/modules/services/serviceWeb
- neutralizer:
gateway/modules/services/serviceNeutralization
- Generisch (bleibt shared):
- alle anderen Services bleiben in
gateway/modules/services
- alle anderen Services bleiben in
Plug&Play fuer Services (analog Routes)
- Feature-Container exportiert Service-Registrierung (z.B.
registerServices()). - Zentrale Service-Registry laedt nur vorhandene Feature-Container.
- Entfernt man den Feature-Ordner, werden auch Services nicht mehr geladen.
Umsetzungsschritte (Ergaenzung)
Schritt S1: aichat-Services verschieben
- Move:
gateway/modules/aicore/->gateway/modules/features/aichat/aicore/
- Move:
gateway/modules/services/serviceAi/->gateway/modules/features/aichat/services/serviceAi/gateway/modules/services/serviceExtraction/->gateway/modules/features/aichat/services/serviceExtraction/gateway/modules/services/serviceGeneration/->gateway/modules/features/aichat/services/serviceGeneration/gateway/modules/services/serviceWeb/->gateway/modules/features/aichat/services/serviceWeb/
- Referenzen anpassen:
- alle Imports dieser Services auf die neuen Pfade.
- Service-Registry in aichat registriert diese Module.
Schritt S2: neutralizer-Services verschieben
- Move:
gateway/modules/services/serviceNeutralization/->gateway/modules/features/neutralizer/services/serviceNeutralization/
- Referenzen anpassen:
- alle Imports auf neuen Pfad.
- Service-Registry in neutralizer registriert dieses Modul.
Schritt S3: Service-Discovery
- Zentraler Loader (shared) laedt Services pro Feature-Container dynamisch.
- Shared Services bleiben unveraendert in
gateway/modules/services.
Umsetzungskonzept (schrittweise)
Schritt 0: Bestandsaufnahme und Freeze
- Ziel: saubere Basis, keine parallelen Feature-Refactors.
- Aktion: Branch erstellen, keine Feature-Folder loeschen vor Abschluss.
Schritt 1: Bootstrap auf System-RBAC reduzieren
- Datei:
gateway/modules/interfaces/interfaceBootstrap.py - Aenderung:
- In
initBootstrap()entfernen:initFeatures(db)_initFeatureTemplateRoleAccessRules(db)
- Entfernen:
_initFeatureTemplateRoles(db)(Funktion + Call-Sites)_initFeatureTemplateRoleAccessRules(db)(Funktion + Call-Sites)
- In
- Referenzen: alle Verweise auf Feature-Template-Rollen und Feature-AccessRules loeschen.
- Ergebnis: Bootstrap erstellt nur System-RBAC bei leerer DB.
Schritt 2: Feature-Container vorbereiten (Ordnerstruktur)
- Ziel: pro Feature ein Container mit klarer Struktur.
- Neuer Ordner pro Feature:
gateway/modules/features/<featureCode>/- Pflicht-Module:
datamodelFeatureXxx.pyinterfaceFeatureXxx.pyrouteFeatureXxx.pymain<Feature>.py(registriert UI/RESOURCE Katalog)
- Ergebnis: leere Container fuer
trustee,chatbot,aichat,neutralizer,realestate,automation.
Schritt 3: Trustee in Container verschieben
- Move:
gateway/modules/routes/routeFeatureTrustee.py->gateway/modules/features/trustee/routeFeatureTrustee.pygateway/modules/interfaces/interfaceDbTrustee.py->gateway/modules/features/trustee/interfaceFeatureTrustee.pygateway/modules/datamodels/datamodelTrustee.py->gateway/modules/features/trustee/datamodelFeatureTrustee.py
- Neu:
gateway/modules/features/trustee/mainTrustee.py(RBAC UI/RESOURCE Katalogregistrierung)
- Referenzen anpassen:
- Alle Imports von
routeFeatureTrustee.py,interfaceDbTrustee.py,datamodelTrustee.py app.pyRouter-Import und Registrierung- Tests, falls vorhanden
- Alle Imports von
Schritt 4: Chatbot in Container verschieben
- Move:
gateway/modules/routes/routeFeatureChatbot.py->gateway/modules/features/chatbot/routeFeatureChatbot.pygateway/modules/interfaces/interfaceDbChatbot.py->gateway/modules/features/chatbot/interfaceFeatureChatbot.pygateway/modules/datamodels/datamodelChatbot.py->gateway/modules/features/chatbot/datamodelFeatureChatbot.py
- Keep:
gateway/modules/features/chatbot/mainChatbot.py+ Helpers
- Neu:
gateway/modules/features/chatbot/mainChatbotCatalog.py(oder inmainChatbot.py)
- Referenzen anpassen:
- Alle Imports von
routeFeatureChatbot.py,interfaceDbChatbot.py,datamodelChatbot.py app.pyRouter-Import und Registrierung
- Alle Imports von
Schritt 5: AIChat (chatworkflow) in Container verschieben
- Move:
gateway/modules/routes/routeFeatureChatDynamic.py->gateway/modules/features/aichat/routeFeatureAiChat.pygateway/modules/interfaces/interfaceDbChat.py->gateway/modules/features/aichat/interfaceFeatureAiChat.pygateway/modules/datamodels/datamodelChat.py->gateway/modules/features/aichat/datamodelFeatureAiChat.py
- Keep:
gateway/modules/features/workflow/mainWorkflow.py(falls nur Workflow-Logik)
- Neu:
gateway/modules/features/aichat/mainAiChat.py(RBAC UI/RESOURCE Katalog)
- Referenzen anpassen:
- Alle Imports von
routeFeatureChatDynamic.py,interfaceDbChat.py,datamodelChat.py app.pyRouter-Import und Registrierung
- Alle Imports von
Schritt 6: Neutralizer in Container verschieben und Ordner umbenennen
- Rename:
gateway/modules/features/neutralizePlayground/->gateway/modules/features/neutralizer/
- Move:
gateway/modules/routes/routeFeatureNeutralization.py->gateway/modules/features/neutralizer/routeFeatureNeutralizer.pygateway/modules/datamodels/datamodelNeutralizer.py->gateway/modules/features/neutralizer/datamodelFeatureNeutralizer.py
- Neu:
gateway/modules/features/neutralizer/mainNeutralizer.py(RBAC UI/RESOURCE Katalog)
- Referenzen anpassen:
- Alle Imports auf
neutralizePlayground app.pyRouter-Import und Registrierung
- Alle Imports auf
Schritt 7: RealEstate in Container verschieben
- Move:
gateway/modules/routes/routeFeatureRealEstate.py->gateway/modules/features/realestate/routeFeatureRealEstate.pygateway/modules/interfaces/interfaceDbRealEstate.py->gateway/modules/features/realestate/interfaceFeatureRealEstate.pygateway/modules/datamodels/datamodelRealEstate.py->gateway/modules/features/realestate/datamodelFeatureRealEstate.py
- Keep:
gateway/modules/features/realEstate/mainRealEstate.py
- Neu:
gateway/modules/features/realestate/mainRealEstateCatalog.py(oder in mainRealEstate)
- Referenzen anpassen:
- Alle Imports der alten Pfade
app.pyRouter-Import und Registrierung
Schritt 8: Automation als Feature-Container
- Move:
gateway/modules/routes/routeDataAutomation.py->gateway/modules/features/automation/routeFeatureAutomation.py
- Neu:
gateway/modules/features/automation/interfaceFeatureAutomation.pygateway/modules/features/automation/datamodelFeatureAutomation.py(enthaeltAutomationDefinition)gateway/modules/features/automation/mainAutomation.py(RBAC UI/RESOURCE Katalog)
- Referenzen anpassen:
- Alle Imports von
routeDataAutomation.py app.pyRouter-Import und Registrierung
- Alle Imports von
Schritt 9: App-Routing dynamisch
- Datei:
gateway/app.py - Aenderung:
- Entferne direkte Imports aus
modules/routes/. - Importiere Router aus Feature-Containern dynamisch (Feature-Discovery).
- Entferne direkte Imports aus
- Referenzen: alle Router-Registrierungen auf neue Pfade/Discovery umstellen.
Schritt 10: featuresLifecycle anpassen
- Datei:
gateway/modules/features/featuresLifecycle.py - Aenderung:
- Feature-Registry dynamisch laden (Folder-Discovery).
- Keine direkten Imports aus alten Pfaden.
- Referenzen: Aufrufe in
app.pybleiben, aber Lifecycle nutzt Feature-Liste.
Schritt 11: Referenzen global bereinigen
- Ziel: Import-Pfade konsistent.
- Aenderungen:
- Alle Imports von
modules/routes/routeFeature*.pyentfernen. - Alle Imports von
modules/interfaces/interfaceDb*.pyaufinterfaceFeature*.pyumstellen. - Alle Imports von
modules/datamodels/datamodel*.pyaufdatamodelFeature*.pyumstellen.
- Alle Imports von
Schritt 12: RBAC Katalog Registrierungen pro Feature
- Ziel: jede Feature-Instanz registriert UI/RESOURCE Keys.
- Dateien:
main<Feature>.pyje Feature-Container - Aenderung: einheitliche Registrierungs-API verwenden (im Katalog-Service).
Schritt 13: Tests und Verifikation
- Smoke Tests:
- Start Gateway, pruefen dass alle Feature-Routes registriert sind.
- Entferne Feature-Ordner testweise -> Route nicht mehr vorhanden.
- RBAC Katalog liefert Objekte fuer alle Features.
- Bootstrap erzeugt nur System-RBAC bei leerer DB.