697 lines
23 KiB
Markdown
697 lines
23 KiB
Markdown
# System Architecture Analysis: Super User Access & Global Settings Strategy
|
|
|
|
**Date**: December 20, 2025
|
|
**Purpose**: Strategic analysis of super user access, global settings architecture, and separation of admin functions
|
|
**Status**: Planning & Analysis Phase
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
This document analyzes the current super user/aws-admin architecture and proposes a cleaner separation between:
|
|
1. **Backend administrative access** (Django admin - keep as is)
|
|
2. **Frontend user interface** (remove super user exceptions)
|
|
3. **Global system settings** (true global config, not account-based fallbacks)
|
|
|
|
---
|
|
|
|
## Current State Analysis
|
|
|
|
### 1. Backend Super User Access (Django Admin)
|
|
|
|
**Current Implementation**: ✅ **WELL DESIGNED - KEEP AS IS**
|
|
|
|
**Purpose**:
|
|
- Full database access and management
|
|
- Account, user, billing administration
|
|
- System configuration
|
|
- Data cleanup and maintenance
|
|
- Background task monitoring
|
|
|
|
**Verdict**: **REQUIRED** - Backend super user is essential for:
|
|
- Database migrations
|
|
- Emergency data fixes
|
|
- Account management
|
|
- Billing operations
|
|
- System maintenance
|
|
|
|
---
|
|
|
|
### 2. Frontend Super User Access (React App)
|
|
|
|
**Current Implementation**: ⚠️ **QUESTIONABLE - NEEDS REVIEW**
|
|
|
|
#### 2.1 What Frontend Admin Pages Currently Do
|
|
|
|
| Page Category | Current Pages | Functionality | Django Admin Equivalent | Recommendation |
|
|
|---------------|---------------|---------------|------------------------|----------------|
|
|
| **System Dashboard** | `/admin/dashboard` | Account stats, usage metrics | ✅ Available via django-admin dashboard | 🔄 **MOVE** to Django admin |
|
|
| **Account Management** | `/admin/accounts`<br>`/admin/subscriptions`<br>`/admin/account-limits` | View/edit all accounts | ✅ Available in django admin | 🔄 **MOVE** to Django admin |
|
|
| **Billing Admin** | `/admin/billing`<br>`/admin/invoices`<br>`/admin/payments`<br>`/admin/credit-costs`<br>`/admin/credit-packages` | Billing operations | ✅ Available in django admin | 🔄 **MOVE** to Django admin |
|
|
| **User Admin** | `/admin/users`<br>`/admin/roles`<br>`/admin/activity-logs` | User management | ✅ Available in django admin | 🔄 **MOVE** to Django admin |
|
|
| **System Config** | `/admin/system-settings`<br>`/admin/ai-settings`<br>`/settings/modules`<br>`/admin/integration-settings` | Global settings | ⚠️ Partially in django admin | ⚠️ **REVIEW** - See section 3 |
|
|
| **Monitoring** | `/settings/status`<br>`/settings/api-monitor`<br>`/settings/debug-status` | API health, debug info | ❌ Not in django admin | 🔄 **MOVE** to Django admin |
|
|
| **Developer Tools** | `/admin/function-testing`<br>`/admin/system-testing` | Testing utilities | ❌ Not in django admin | 🗑️ **REMOVE** or move to Django admin |
|
|
| **UI Elements** | 22 demo pages | Component library showcase | ❌ Not needed in admin | 🗑️ **REMOVE** from production |
|
|
|
|
#### 2.2 Problems with Current Frontend Admin Access
|
|
|
|
**Issue 1: Duplicate Interfaces**
|
|
- Same data manageable in both Django admin and React frontend
|
|
- Two UIs to maintain for the same operations
|
|
- Inconsistent behavior between the two
|
|
|
|
**Issue 2: Security Surface Area**
|
|
- Frontend admin pages increase attack surface
|
|
- Additional routes to protect
|
|
- Client-side code can be inspected/manipulated
|
|
|
|
**Issue 3: Development Complexity**
|
|
- Special cases throughout codebase for super user
|
|
- Fallback logic mixed with primary logic
|
|
- Harder to test and maintain
|
|
|
|
**Issue 4: User Confusion**
|
|
- Normal users wonder why menu items don't work
|
|
- Unclear which interface to use (Django admin vs frontend)
|
|
- UI elements demo pages in production
|
|
|
|
---
|
|
|
|
### 3. Global Settings Architecture
|
|
|
|
**Current Implementation**: ⚠️ **POORLY DESIGNED - NEEDS REFACTORING**
|
|
|
|
#### 3.1 Current "Fallback" Pattern (WRONG APPROACH)
|
|
|
|
**File**: `backend/igny8_core/ai/settings.py` (Lines 53-65)
|
|
|
|
```python
|
|
# Current: "Fallback" to aws-admin settings
|
|
if not settings_obj:
|
|
for slug in ['aws-admin', 'default-account', 'default']:
|
|
system_account = Account.objects.filter(slug=slug).first()
|
|
if system_account:
|
|
settings_obj = IntegrationSettings.objects.filter(account=system_account).first()
|
|
if settings_obj:
|
|
break
|
|
```
|
|
|
|
**Problems**:
|
|
1. ❌ Called "fallback" but actually used as **primary global settings**
|
|
2. ❌ Settings tied to an account (aws-admin) when they should be account-independent
|
|
3. ❌ If aws-admin account deleted, global settings lost
|
|
4. ❌ Confusing: "aws-admin account settings" vs "global platform settings"
|
|
5. ❌ Users might think they need API keys, but system uses shared keys
|
|
|
|
#### 3.2 Settings Currently Using Fallback Pattern
|
|
|
|
**Integration Settings** (OpenAI, DALL-E, Anthropic, etc.):
|
|
- ❌ **Current**: Per-account with fallback to aws-admin
|
|
- ✅ **Should be**: Global system settings (no account association)
|
|
- ⚠️ **Exception**: Allow power users to override with their own keys (optional)
|
|
|
|
**AI Prompts**:
|
|
- ❌ **Current**: Per-account with system defaults
|
|
- ✅ **Should be**: Global prompt library with account-level customization
|
|
|
|
**Content Strategies**:
|
|
- ❌ **Current**: Mixed account-level and global
|
|
- ✅ **Should be**: Global templates + account customization
|
|
|
|
**Author Profiles**:
|
|
- ❌ **Current**: Mixed account-level and global
|
|
- ✅ **Should be**: Global library + account customization
|
|
|
|
**Publishing Channels**:
|
|
- ✅ **Current**: Already global (correct approach)
|
|
- ✅ **Keep as is**
|
|
|
|
---
|
|
|
|
## Proposed Architecture
|
|
|
|
### Phase 1: Remove Frontend Admin Exceptions
|
|
|
|
#### 1.1 Remove Frontend Admin Routes
|
|
|
|
**Pages to Remove from Frontend**:
|
|
```
|
|
/admin/dashboard → Use Django admin dashboard
|
|
/admin/accounts → Use Django admin
|
|
/admin/subscriptions → Use Django admin
|
|
/admin/account-limits → Use Django admin
|
|
/admin/billing → Use Django admin
|
|
/admin/invoices → Use Django admin
|
|
/admin/payments → Use Django admin
|
|
/admin/credit-costs → Use Django admin
|
|
/admin/credit-packages → Use Django admin
|
|
/admin/users → Use Django admin
|
|
/admin/roles → Use Django admin
|
|
/admin/activity-logs → Use Django admin
|
|
/admin/system-settings → Use Django admin
|
|
/admin/ai-settings → Use Django admin
|
|
/admin/integration-settings → Use Django admin
|
|
/admin/function-testing → Remove (dev tool)
|
|
/admin/system-testing → Remove (dev tool)
|
|
/ui-elements/* → Remove (22 demo pages)
|
|
```
|
|
|
|
**Pages to Move to Django Admin**:
|
|
```
|
|
/settings/status → Create Django admin page
|
|
/settings/api-monitor → Create Django admin page
|
|
/settings/debug-status → Create Django admin page
|
|
```
|
|
|
|
**Pages to Keep in Frontend** (Normal user features):
|
|
```
|
|
/settings/modules → Keep (account owners enable/disable modules)
|
|
/settings/account → Keep (account settings, team management)
|
|
/settings/billing → Keep (view own invoices, payment methods)
|
|
/settings/integrations → Keep (configure own WordPress sites)
|
|
```
|
|
|
|
#### 1.2 Remove Frontend Super User Checks
|
|
|
|
**Files to Clean Up**:
|
|
|
|
1. **AppSidebar.tsx** - Remove admin section entirely
|
|
2. **AdminGuard.tsx** - Remove (no admin routes to guard)
|
|
3. **ProtectedRoute.tsx** - Remove `isPrivileged` checks
|
|
4. **ApiStatusIndicator.tsx** - Move to Django admin
|
|
5. **ResourceDebugOverlay.tsx** - Remove or django admin only
|
|
6. **api.ts** - Remove comments about admin/developer overrides
|
|
|
|
**Result**: Frontend becomes pure user interface with no special cases for super users.
|
|
|
|
---
|
|
|
|
### Phase 2: Refactor Global Settings Architecture
|
|
|
|
#### 2.1 Create True Global Settings Models
|
|
|
|
**New Database Structure**:
|
|
|
|
```python
|
|
# NEW: Global system settings (no account foreign key)
|
|
class GlobalIntegrationSettings(models.Model):
|
|
"""
|
|
Global platform-wide integration settings
|
|
Used by all accounts unless they provide their own keys
|
|
"""
|
|
# OpenAI
|
|
openai_api_key = EncryptedCharField(max_length=500, blank=True)
|
|
openai_model = models.CharField(max_length=100, default='gpt-4')
|
|
openai_temperature = models.FloatField(default=0.7)
|
|
|
|
# DALL-E
|
|
dalle_api_key = EncryptedCharField(max_length=500, blank=True)
|
|
dalle_model = models.CharField(max_length=100, default='dall-e-3')
|
|
|
|
# Anthropic
|
|
anthropic_api_key = EncryptedCharField(max_length=500, blank=True)
|
|
anthropic_model = models.CharField(max_length=100, default='claude-3-sonnet')
|
|
|
|
# System metadata
|
|
is_active = models.BooleanField(default=True)
|
|
last_updated = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
verbose_name = "Global Integration Settings"
|
|
verbose_name_plural = "Global Integration Settings"
|
|
|
|
def __str__(self):
|
|
return "Global Integration Settings"
|
|
|
|
# MODIFIED: Account-specific overrides (optional)
|
|
class AccountIntegrationSettings(models.Model):
|
|
"""
|
|
Optional account-specific API key overrides
|
|
If not set, uses GlobalIntegrationSettings
|
|
"""
|
|
account = models.OneToOneField(Account, on_delete=models.CASCADE)
|
|
|
|
# Override OpenAI (blank = use global)
|
|
openai_api_key = EncryptedCharField(max_length=500, blank=True, null=True)
|
|
openai_model = models.CharField(max_length=100, blank=True, null=True)
|
|
|
|
# Override DALL-E (blank = use global)
|
|
dalle_api_key = EncryptedCharField(max_length=500, blank=True, null=True)
|
|
|
|
use_own_keys = models.BooleanField(default=False,
|
|
help_text="If True, account must provide their own API keys. If False, uses global keys.")
|
|
|
|
def get_effective_settings(self):
|
|
"""Get effective settings (own keys or global)"""
|
|
if self.use_own_keys and self.openai_api_key:
|
|
return {
|
|
'openai_api_key': self.openai_api_key,
|
|
'openai_model': self.openai_model or GlobalIntegrationSettings.objects.first().openai_model,
|
|
# ... etc
|
|
}
|
|
else:
|
|
# Use global settings
|
|
global_settings = GlobalIntegrationSettings.objects.first()
|
|
return {
|
|
'openai_api_key': global_settings.openai_api_key,
|
|
'openai_model': global_settings.openai_model,
|
|
# ... etc
|
|
}
|
|
```
|
|
|
|
#### 2.2 Updated Settings Lookup Logic
|
|
|
|
**Before (Confusing Fallback)**:
|
|
```python
|
|
# Look for account settings → fallback to aws-admin account
|
|
settings_obj = IntegrationSettings.objects.filter(account=account).first()
|
|
if not settings_obj:
|
|
# "Fallback" to aws-admin (confusing - actually primary!)
|
|
system_account = Account.objects.filter(slug='aws-admin').first()
|
|
settings_obj = IntegrationSettings.objects.filter(account=system_account).first()
|
|
```
|
|
|
|
**After (Clear Global Settings)**:
|
|
```python
|
|
# Try account-specific override first
|
|
account_settings = AccountIntegrationSettings.objects.filter(account=account).first()
|
|
|
|
if account_settings and account_settings.use_own_keys:
|
|
# Account provides their own keys
|
|
return account_settings.get_effective_settings()
|
|
else:
|
|
# Use global platform settings
|
|
global_settings = GlobalIntegrationSettings.objects.first()
|
|
return global_settings
|
|
```
|
|
|
|
#### 2.3 Settings That Should Be Global
|
|
|
|
**Truly Global** (No account association):
|
|
- ✅ OpenAI/DALL-E/Anthropic API keys (system default)
|
|
- ✅ Default AI models (gpt-4, dall-e-3, etc.)
|
|
- ✅ Default temperature/parameters
|
|
- ✅ Rate limiting rules
|
|
- ✅ Cost per operation (CreditCostConfig)
|
|
- ✅ System-wide feature flags
|
|
|
|
**Global Library with Account Customization**:
|
|
- ✅ AI Prompts (global library + account custom prompts)
|
|
- ✅ Content Strategies (global templates + account strategies)
|
|
- ✅ Author Profiles (global personas + account authors)
|
|
- ✅ Publishing Channels (global available channels)
|
|
|
|
**Purely Account-Specific**:
|
|
- ✅ WordPress site integrations
|
|
- ✅ Account billing settings
|
|
- ✅ Team member permissions
|
|
- ✅ Site/Sector structure
|
|
|
|
---
|
|
|
|
### Phase 3: Django Admin Enhancement
|
|
|
|
#### 3.1 New Django Admin Pages to Create
|
|
|
|
**Monitoring Dashboard** (Replace `/settings/status`):
|
|
```python
|
|
# backend/igny8_core/admin/monitoring.py
|
|
def system_health_dashboard(request):
|
|
"""
|
|
Django admin page showing:
|
|
- Database connections
|
|
- Redis status
|
|
- Celery workers
|
|
- API response times
|
|
- Error rates
|
|
"""
|
|
context = {
|
|
'db_status': check_database(),
|
|
'redis_status': check_redis(),
|
|
'celery_workers': check_celery(),
|
|
'api_health': check_api_endpoints(),
|
|
}
|
|
return render(request, 'admin/monitoring/system_health.html', context)
|
|
```
|
|
|
|
**API Monitor** (Replace `/settings/api-monitor`):
|
|
```python
|
|
def api_monitor_dashboard(request):
|
|
"""
|
|
Django admin page showing:
|
|
- All API endpoints status
|
|
- Response time graphs
|
|
- Error rate by endpoint
|
|
- Recent failed requests
|
|
"""
|
|
# Current ApiStatusIndicator logic moved here
|
|
pass
|
|
```
|
|
|
|
**Debug Console** (Replace `/settings/debug-status`):
|
|
```python
|
|
def debug_console(request):
|
|
"""
|
|
Django admin page showing:
|
|
- Environment variables
|
|
- Active settings
|
|
- Feature flags
|
|
- Cache status
|
|
"""
|
|
pass
|
|
```
|
|
|
|
#### 3.2 Add to Django Admin Site URLs
|
|
|
|
```python
|
|
# backend/igny8_core/admin/site.py
|
|
def get_urls(self):
|
|
urls = super().get_urls()
|
|
custom_urls = [
|
|
# Existing
|
|
path('dashboard/', self.admin_view(admin_dashboard), name='dashboard'),
|
|
path('reports/revenue/', self.admin_view(revenue_report), name='report_revenue'),
|
|
|
|
# NEW: Monitoring pages
|
|
path('monitoring/system-health/', self.admin_view(system_health_dashboard), name='monitoring_system_health'),
|
|
path('monitoring/api-monitor/', self.admin_view(api_monitor_dashboard), name='monitoring_api_monitor'),
|
|
path('monitoring/debug-console/', self.admin_view(debug_console), name='monitoring_debug_console'),
|
|
]
|
|
return custom_urls + urls
|
|
```
|
|
|
|
---
|
|
|
|
## Pros & Cons Analysis
|
|
|
|
### Current Architecture (Frontend Admin Access)
|
|
|
|
**Pros**:
|
|
- ✅ Modern UI for admin operations
|
|
- ✅ Real-time monitoring in React
|
|
- ✅ Consistent look with rest of app
|
|
- ✅ Easier to build complex dashboards
|
|
|
|
**Cons**:
|
|
- ❌ Duplicate interfaces (Django + React)
|
|
- ❌ More code to maintain
|
|
- ❌ Larger security surface area
|
|
- ❌ Special cases throughout codebase
|
|
- ❌ Confusing fallback patterns
|
|
- ❌ Client-side admin code visible
|
|
|
|
---
|
|
|
|
### Proposed Architecture (Django Admin Only)
|
|
|
|
**Pros**:
|
|
- ✅ Single source of truth for admin operations
|
|
- ✅ Smaller attack surface
|
|
- ✅ Less code to maintain
|
|
- ✅ No special cases in frontend
|
|
- ✅ Clear separation of concerns
|
|
- ✅ Django admin is battle-tested
|
|
- ✅ Better security (server-side only)
|
|
- ✅ Truly global settings (not account-based)
|
|
|
|
**Cons**:
|
|
- ⚠️ Need to build monitoring pages in Django admin
|
|
- ⚠️ Less modern UI (Django admin vs React)
|
|
- ⚠️ Some features need recreation
|
|
|
|
---
|
|
|
|
## Migration Strategy
|
|
|
|
### Step 1: Create Global Settings Models (Week 1)
|
|
|
|
**Tasks**:
|
|
1. ✅ Create `GlobalIntegrationSettings` model
|
|
2. ✅ Create `GlobalSystemSettings` model
|
|
3. ✅ Migrate existing aws-admin settings to global settings
|
|
4. ✅ Create migration script
|
|
5. ✅ Update `get_settings()` functions to use global first
|
|
|
|
**Migration Script**:
|
|
```python
|
|
# management/commands/migrate_to_global_settings.py
|
|
def handle(self):
|
|
# 1. Get aws-admin account settings
|
|
aws_account = Account.objects.filter(slug='aws-admin').first()
|
|
if aws_account:
|
|
account_settings = IntegrationSettings.objects.filter(account=aws_account).first()
|
|
|
|
# 2. Create global settings from aws-admin settings
|
|
GlobalIntegrationSettings.objects.create(
|
|
openai_api_key=account_settings.openai_api_key,
|
|
openai_model=account_settings.openai_model,
|
|
dalle_api_key=account_settings.dalle_api_key,
|
|
# ... copy all settings
|
|
)
|
|
|
|
# 3. Delete aws-admin specific settings (now global)
|
|
account_settings.delete()
|
|
|
|
print("✅ Migrated to global settings")
|
|
```
|
|
|
|
---
|
|
|
|
### Step 2: Update Backend Logic (Week 1-2)
|
|
|
|
**Files to Update**:
|
|
1. `ai/settings.py` - Use global settings
|
|
2. `ai/ai_core.py` - Remove aws-admin fallback
|
|
3. `api/permissions.py` - Remove `IsSystemAccountOrDeveloper` (no longer needed)
|
|
4. API views - Remove super user bypasses
|
|
|
|
**Example Change**:
|
|
```python
|
|
# BEFORE
|
|
def get_openai_settings(account):
|
|
settings = IntegrationSettings.objects.filter(account=account).first()
|
|
if not settings:
|
|
# Fallback to aws-admin
|
|
aws = Account.objects.filter(slug='aws-admin').first()
|
|
settings = IntegrationSettings.objects.filter(account=aws).first()
|
|
return settings
|
|
|
|
# AFTER
|
|
def get_openai_settings(account):
|
|
# Check if account has custom keys
|
|
account_settings = AccountIntegrationSettings.objects.filter(account=account).first()
|
|
if account_settings and account_settings.use_own_keys:
|
|
return account_settings.get_effective_settings()
|
|
|
|
# Use global settings
|
|
return GlobalIntegrationSettings.objects.first()
|
|
```
|
|
|
|
---
|
|
|
|
### Step 3: Create Django Admin Monitoring Pages (Week 2)
|
|
|
|
**Create**:
|
|
1. System Health Dashboard
|
|
2. API Monitor
|
|
3. Debug Console
|
|
4. Add to Django admin menu
|
|
|
|
**Test**:
|
|
- Access from Django admin at `/admin/monitoring/`
|
|
- Verify functionality matches React pages
|
|
|
|
---
|
|
|
|
### Step 4: Remove Frontend Admin Routes (Week 3)
|
|
|
|
**Remove Routes**:
|
|
```typescript
|
|
// Remove from src/routes.tsx
|
|
- /admin/dashboard
|
|
- /admin/accounts
|
|
- /admin/*
|
|
- /ui-elements/*
|
|
```
|
|
|
|
**Remove Components**:
|
|
```
|
|
src/pages/Admin/ → DELETE entire directory
|
|
src/pages/UIElements/ → DELETE entire directory
|
|
src/components/auth/AdminGuard.tsx → DELETE
|
|
```
|
|
|
|
**Clean Sidebar**:
|
|
```typescript
|
|
// src/layout/AppSidebar.tsx
|
|
// Remove entire adminSection
|
|
// Remove isAwsAdminAccount checks
|
|
```
|
|
|
|
---
|
|
|
|
### Step 5: Clean Up Frontend Code (Week 3-4)
|
|
|
|
**Remove**:
|
|
1. Super user checks in ProtectedRoute
|
|
2. Developer role checks everywhere
|
|
3. `isAwsAdmin` variables
|
|
4. Comments about admin/developer overrides
|
|
|
|
**Keep**:
|
|
1. Normal user role checks (owner, admin, editor, viewer)
|
|
2. Account-level permission checks
|
|
3. Module enable/disable settings (account level)
|
|
|
|
---
|
|
|
|
### Step 6: Test & Deploy (Week 4)
|
|
|
|
**Test Cases**:
|
|
1. ✅ Regular users can't access Django admin
|
|
2. ✅ Super user can access Django admin monitoring
|
|
3. ✅ Global settings work for all accounts
|
|
4. ✅ Account-level overrides work
|
|
5. ✅ No frontend admin routes accessible
|
|
6. ✅ All user features still work
|
|
|
|
---
|
|
|
|
## Recommended Approach
|
|
|
|
### ✅ RECOMMENDED: Hybrid Approach
|
|
|
|
**Backend**: Keep super user in Django admin (essential for system management)
|
|
|
|
**Frontend**: Remove all super user access - make it pure user interface
|
|
|
|
**Settings**: True global settings, not account-based fallbacks
|
|
|
|
**Monitoring**: Django admin only
|
|
|
|
### Implementation Priority
|
|
|
|
**Phase 1 (Immediate - Week 1-2)**:
|
|
1. ✅ Create global settings models
|
|
2. ✅ Migrate aws-admin settings to global
|
|
3. ✅ Update backend logic to use global settings
|
|
4. ✅ Test thoroughly
|
|
|
|
**Phase 2 (Short-term - Week 3-4)**:
|
|
1. ✅ Create Django admin monitoring pages
|
|
2. ✅ Remove frontend admin routes
|
|
3. ✅ Clean up frontend code
|
|
4. ✅ Test end-to-end
|
|
|
|
**Phase 3 (Optional - Month 2)**:
|
|
1. ⚠️ Allow account-level API key overrides (for power users)
|
|
2. ⚠️ Add usage tracking per account
|
|
3. ⚠️ Alert on API key quota issues
|
|
|
|
---
|
|
|
|
## Settings Architecture Decision Matrix
|
|
|
|
| Setting Type | Current | Proposed | Reasoning |
|
|
|--------------|---------|----------|-----------|
|
|
| **OpenAI API Key** | aws-admin fallback | Global with optional override | Most users should use shared key for simplicity |
|
|
| **AI Model Selection** | aws-admin fallback | Global default, allow account override | Power users may want specific models |
|
|
| **AI Prompts** | Mixed | Global library + account custom | Templates global, customization per account |
|
|
| **Content Strategies** | Mixed | Global templates + account strategies | Same as prompts |
|
|
| **Author Profiles** | Mixed | Global library + account authors | Same as prompts |
|
|
| **Credit Costs** | Global | Global (keep as is) | System-wide pricing |
|
|
| **Publishing Channels** | Global | Global (keep as is) | Already correct |
|
|
| **WordPress Integrations** | Per-account | Per-account (keep as is) | User-specific connections |
|
|
|
|
---
|
|
|
|
## Benefits of Proposed Architecture
|
|
|
|
### For Development Team
|
|
1. ✅ **Less code to maintain** - Remove entire frontend admin section
|
|
2. ✅ **Clearer architecture** - No special cases for super users
|
|
3. ✅ **Easier testing** - No need to test admin UI in React
|
|
4. ✅ **Better separation** - Admin vs user concerns clearly separated
|
|
|
|
### For Security
|
|
1. ✅ **Smaller attack surface** - No client-side admin code
|
|
2. ✅ **Single admin interface** - Only Django admin to secure
|
|
3. ✅ **No frontend bypasses** - No special logic in React
|
|
4. ✅ **True global settings** - Not dependent on aws-admin account
|
|
|
|
### For Users
|
|
1. ✅ **Clearer interface** - No confusing admin menu items
|
|
2. ✅ **Simpler setup** - Global settings work out of box
|
|
3. ✅ **Optional customization** - Can override with own keys if needed
|
|
4. ✅ **Better performance** - Less code loaded in frontend
|
|
|
|
### For Operations
|
|
1. ✅ **Single source of truth** - Django admin for all admin tasks
|
|
2. ✅ **Better monitoring** - Centralized in Django admin
|
|
3. ✅ **Audit trail** - All admin actions logged
|
|
4. ✅ **No AWS account dependency** - Global settings not tied to account
|
|
|
|
---
|
|
|
|
## Risks & Mitigation
|
|
|
|
### Risk 1: Loss of React Admin UI
|
|
- **Mitigation**: Modern Django admin templates (Unfold already used)
|
|
- **Mitigation**: Build essential monitoring pages in Django admin
|
|
- **Mitigation**: Most admin tasks already work in Django admin
|
|
|
|
### Risk 2: Migration Complexity
|
|
- **Mitigation**: Careful planning and testing
|
|
- **Mitigation**: Gradual rollout (settings first, then UI)
|
|
- **Mitigation**: Rollback plan if issues occur
|
|
|
|
### Risk 3: API Key Management
|
|
- **Mitigation**: Keep global keys secure in Django admin
|
|
- **Mitigation**: Add option for accounts to use own keys
|
|
- **Mitigation**: Track usage per account even with shared keys
|
|
|
|
---
|
|
|
|
## Final Recommendation
|
|
|
|
### ✅ **PROCEED WITH PROPOSED ARCHITECTURE**
|
|
|
|
**Reasons**:
|
|
1. Cleaner separation of concerns
|
|
2. Less code to maintain
|
|
3. Better security posture
|
|
4. Proper global settings (not fallbacks)
|
|
5. Django admin is sufficient for admin tasks
|
|
6. Frontend becomes pure user interface
|
|
|
|
**Timeline**: 4 weeks for complete migration
|
|
|
|
**Risk Level**: LOW - Changes are well-defined and testable
|
|
|
|
**Business Impact**: POSITIVE - Simpler, more secure, easier to maintain
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. ✅ **Approval**: Review this document and approve approach
|
|
2. ✅ **Plan**: Create detailed implementation tickets
|
|
3. ✅ **Build**: Implement Phase 1 (global settings)
|
|
4. ✅ **Test**: Thorough testing of settings migration
|
|
5. ✅ **Deploy**: Phase 1 to production
|
|
6. ✅ **Build**: Implement Phase 2 (remove frontend admin)
|
|
7. ✅ **Test**: End-to-end testing
|
|
8. ✅ **Deploy**: Phase 2 to production
|
|
|
|
---
|
|
|
|
**Document Status**: Draft for Review
|
|
**Author**: System Architecture Analysis
|
|
**Date**: December 20, 2025
|
|
**Next Review**: After stakeholder feedback
|
|
|
|
---
|
|
|
|
*End of Analysis*
|