From dc3b8784a382829e84b7da4c6c30d9dcd841fd05 Mon Sep 17 00:00:00 2001 From: Patrick Motsch <141018425+patrick-motsch@users.noreply.github.com> Date: Sun, 11 Jan 2026 14:20:04 +0100 Subject: [PATCH] Delete import_map_analysis.md not codebase part --- import_map_analysis.md | 247 ----------------------------------------- 1 file changed, 247 deletions(-) delete mode 100644 import_map_analysis.md diff --git a/import_map_analysis.md b/import_map_analysis.md deleted file mode 100644 index 4074d1a7..00000000 --- a/import_map_analysis.md +++ /dev/null @@ -1,247 +0,0 @@ -# Import Map Analysis: interfaces ↔ connectors ↔ security - -## Overview -This document maps all imports between `modules/interfaces`, `modules/connectors`, and `modules/security` to identify structural issues, circular dependencies, and architectural concerns. - -**Architectural Principle:** -- ✅ Connectors (infrastructure) can import from Security (infrastructure) -- ✅ Interfaces (business logic) can import from Security (infrastructure) -- ✅ Interfaces (business logic) can import from Connectors (infrastructure) -- ❌ Connectors should NOT import from Interfaces (business logic) - ---- - -## Import Dependencies Map - -### **CONNECTORS → SECURITY** - -#### `connectorDbPostgre.py` -- **Imports from security:** - - `from modules.security.rbac import RbacClass` (line 13) - - **Usage:** - - **Runtime instantiation:** `RbacClass(self)` in `getRecordsetWithRBAC()` (line 1073) - - Creates `RbacClass` instance to get user permissions - - **Status:** ✅ **ARCHITECTURALLY CORRECT** - Connectors can import from security module - ---- - -### **SECURITY → CONNECTORS** - -#### `security/rbac.py` (moved from `interfaces/interfaceRbac.py`) -- **Imports from connectors:** - - `from modules.connectors.connectorDbPostgre import DatabaseConnector` (line 11, inside TYPE_CHECKING) - - **Usage:** Type hint only (`db: "DatabaseConnector"`) - - **Status:** ✅ Fixed with TYPE_CHECKING to avoid circular import - - **Architecture:** ✅ Correct - Security module can import from connectors (infrastructure layer) - -### **INTERFACES → CONNECTORS** - -#### `interfaceBootstrap.py` -- **Imports from connectors:** - - `from modules.connectors.connectorDbPostgre import DatabaseConnector` (line 9) - - **Usage:** Function parameter types (`initBootstrap(db: DatabaseConnector)`) - -#### `interfaceDbAppObjects.py` -- **Imports from connectors:** - - `from modules.connectors.connectorDbPostgre import DatabaseConnector` (line 12) - - **Usage:** Class initialization (`self.db: DatabaseConnector`) -- **Imports from security:** - - `from modules.security.rbac import RbacClass` (line 17) - - **Usage:** RBAC permission checking - - **Architecture:** ✅ Correct - Interfaces can import from security (infrastructure layer) - -#### `interfaceDbChatObjects.py` -- **Imports from connectors:** - - `from modules.connectors.connectorDbPostgre import DatabaseConnector` (line 29) - - **Usage:** Class initialization - -#### `interfaceDbComponentObjects.py` -- **Imports from connectors:** - - `from modules.connectors.connectorDbPostgre import DatabaseConnector` (line 13) - - **Usage:** Class initialization - -#### `interfaceVoiceObjects.py` -- **Imports from connectors:** - - `from modules.connectors.connectorVoiceGoogle import ConnectorGoogleSpeech` (line 10) - - **Usage:** Class initialization - ---- - -## Circular Dependency Analysis - -### **CIRCULAR DEPENDENCY #1: RESOLVED** ✅ -``` -connectorDbPostgre.py (line 13) - └─> imports RbacClass from security.rbac - └─> Uses: RbacClass(self) at runtime (line 1073) - -security/rbac.py (line 11, inside TYPE_CHECKING) - └─> imports DatabaseConnector (type hint only) -``` - -**Status:** ✅ **RESOLVED** by moving RBAC to security module + `TYPE_CHECKING` - -**Architectural Fix:** -- Moved `interfaceRbac.py` → `security/rbac.py` -- Connectors can import from security (infrastructure layer) -- Interfaces can import from security (business logic layer) -- No architectural violation: security is shared infrastructure - -**Solution Applied:** -```python -# security/rbac.py -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from modules.connectors.connectorDbPostgre import DatabaseConnector - -class RbacClass: - def __init__(self, db: "DatabaseConnector"): # String annotation - self.db = db # Uses db at runtime, but import is deferred -``` - -**Why This Works:** -1. At **import time**: `connectorDbPostgre` imports `RbacClass` ✅ -2. `RbacClass` tries to import `DatabaseConnector` but it's inside `TYPE_CHECKING`, so **no actual import occurs** ✅ -3. At **runtime**: When `getRecordsetWithRBAC()` calls `RbacClass(self)`, `DatabaseConnector` is already fully loaded ✅ -4. Runtime circular reference is safe because Python objects can reference each other once loaded - ---- - -## Architecture Analysis - -### **Current Structure** - -``` -┌─────────────────────────────────────────────────────────────┐ -│ CONNECTORS │ -│ (Database, External Services) │ -│ │ -│ connectorDbPostgre.py │ -│ └─> Uses: RbacClass (runtime instantiation) ⚠️ │ -│ │ -│ connectorVoiceGoogle.py │ -│ connectorTicketsClickup.py │ -│ connectorTicketsJira.py │ -└─────────────────────────────────────────────────────────────┘ - ▲ - │ imports - │ -┌─────────────────────────────────────────────────────────────┐ -│ INTERFACES │ -│ (Business Logic, Data Access Layer) │ -│ │ -│ security/rbac.py (moved from interfaces) │ -│ └─> Uses: DatabaseConnector (type hint only) ✅ │ -│ └─> Can be imported by both connectors and interfaces │ -│ │ -│ interfaceBootstrap.py │ -│ └─> Uses: DatabaseConnector │ -│ │ -│ interfaceDbAppObjects.py │ -│ └─> Uses: DatabaseConnector │ -│ └─> Uses: security.rbac.RbacClass │ -│ └─> Uses: interfaceBootstrap.initBootstrap │ -│ │ -│ interfaceDbChatObjects.py │ -│ └─> Uses: DatabaseConnector │ -│ │ -│ interfaceDbComponentObjects.py │ -│ └─> Uses: DatabaseConnector │ -│ │ -│ interfaceVoiceObjects.py │ -│ └─> Uses: connectorVoiceGoogle.ConnectorGoogleSpeech │ -└─────────────────────────────────────────────────────────────┘ -``` - ---- - -## Potential Issues & Recommendations - -### ✅ **RESOLVED ISSUES** - -1. **Circular Import: security.rbac ↔ connectorDbPostgre** - - **Status:** ✅ Resolved by moving to security module + TYPE_CHECKING - - **Impact:** None - Proper architectural layering maintained - -### ⚠️ **POTENTIAL ISSUES** - -1. **Tight Coupling: Interfaces depend on specific connectors** - - **Issue:** `interfaceDbAppObjects.py` directly imports `DatabaseConnector` - - **Impact:** Makes it harder to swap database implementations - - **Recommendation:** Consider dependency injection or abstract base class - -2. **Connector importing from Security (connectorDbPostgre → security.rbac)** ✅ - - **Status:** ✅ **RESOLVED** - Moved RBAC to security module - - **Current Usage:** Runtime instantiation in `getRecordsetWithRBAC()` (line 1073) - - **Code:** - ```python - RbacInstance = RbacClass(self) - permissions = RbacInstance.getUserPermissions(...) - ``` - - **Architecture:** ✅ Correct - Connectors can import from security (infrastructure layer) - - **Rationale:** Security is shared infrastructure, not business logic - -3. **Multiple interfaces importing same connector** - - **Files importing DatabaseConnector:** - - `interfaceBootstrap.py` - - `interfaceDbAppObjects.py` - - `interfaceDbChatObjects.py` - - `interfaceDbComponentObjects.py` - - **Impact:** Medium - creates coupling - - **Recommendation:** Consider a shared database interface abstraction - ---- - -## Recommendations - -### **1. Move RBAC Logic Out of Connector** -**Current:** `connectorDbPostgre.getRecordsetWithRBAC()` instantiates `RbacClass(self)` at runtime -**Recommendation:** -- ~~Move `getRecordsetWithRBAC()` to `interfaceRbac.py` or `interfaceDbAppObjects.py`~~ ✅ **RESOLVED** - RBAC moved to security module -- Connector should only handle raw database operations -- Interface layer handles RBAC filtering - -### **2. Use Dependency Injection** -**Current:** Interfaces directly import `DatabaseConnector` -**Recommendation:** -- Create abstract base class `DatabaseConnectorBase` -- Interfaces depend on abstraction, not concrete implementation -- Allows easier testing and swapping implementations - -### **3. Consider Layered Architecture** -``` -┌─────────────────────────────────────┐ -│ Interfaces (Business Logic) │ -│ - Uses connectors via abstraction │ -└─────────────────────────────────────┘ - ▲ - │ -┌─────────────────────────────────────┐ -│ Connectors (Infrastructure) │ -│ - No knowledge of interfaces │ -└─────────────────────────────────────┘ -``` - -### **4. Use TYPE_CHECKING for All Type-Only Imports** -**Current:** `security/rbac.py` uses TYPE_CHECKING (moved from interfaces) -**Recommendation:** Use TYPE_CHECKING for all type-only imports between layers - ---- - -## Summary - -### **Current State:** -- ✅ 1 circular dependency **RESOLVED** (moved to security module) -- ✅ Architectural violation **FIXED** (RBAC moved to security) -- ⚠️ Multiple tight couplings to `DatabaseConnector` (acceptable for now) - -### **Architectural Health:** -- **Overall:** 🟢 **Good** - Proper layering maintained -- **Architecture:** ✅ Connectors → Security (infrastructure) ✅ Interfaces → Security (infrastructure) -- **Risk Level:** Low - Clean separation of concerns - -### **Completed Actions:** -1. ✅ **DONE:** Fixed circular import with TYPE_CHECKING -2. ✅ **DONE:** Moved RBAC to security module (proper architectural layering) -3. 🔄 **OPTIONAL:** Introduce abstraction layer for database connector (future improvement)