Delete import_map_analysis.md
not codebase part
This commit is contained in:
parent
deed1d975e
commit
dc3b8784a3
1 changed files with 0 additions and 247 deletions
|
|
@ -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)
|
||||
Loading…
Reference in a new issue