Files
igny8/docs/SITEBUILDER-REMOVAL-MIGRATION-GUIDE.md
2025-12-01 02:22:02 +00:00

352 lines
12 KiB
Markdown

# SiteBuilder Removal - Complete Migration Guide
**Date:** December 1, 2025
**Status:** Code changes completed, database migration pending
---
## Summary
All SiteBuilder and Blueprint functionality has been removed from the IGNY8 system. The taxonomy system has been simplified to use the direct `Content.taxonomy_terms` many-to-many relationship with the `ContentTaxonomy` model.
---
## What Was Removed
### Backend Models (Django)
-`SiteBlueprint` - Site structure blueprints
-`PageBlueprint` - Individual page definitions
-`SiteBlueprintCluster` - Cluster to blueprint mappings
-`SiteBlueprintTaxonomy` - Blueprint taxonomy definitions
-`BusinessType`, `AudienceProfile`, `BrandPersonality`, `HeroImageryDirection` - SiteBuilder metadata options
-`ContentTaxonomyMap` - Replaced by `Content.taxonomy_terms` M2M field
### Backend Modules
- ✅ Removed entire `igny8_core.modules.site_builder` module
- ✅ Removed from `INSTALLED_APPS` in settings.py
- ✅ Removed `/api/v1/site-builder/` URL patterns
- ✅ Cleaned up `site_building/models.py`, `site_building/admin.py`
### Backend Services & Views
- ✅ Updated `PublisherService` - removed `publish_to_sites()` method
- ✅ Updated `PublisherViewSet` - removed blueprint publishing actions
- ✅ Updated `DeploymentRecordViewSet` - removed blueprint references
- ✅ Updated `PublishingRecord` model - removed `site_blueprint` field
- ✅ Updated `DeploymentRecord` model - removed `site_blueprint` field
- ✅ Fixed `metadata_mapping_service.py` - removed ContentTaxonomyMap
- ✅ Fixed `candidate_engine.py` - uses `Content.taxonomy_terms` now
- ✅ Fixed `sites_renderer_adapter.py` - uses M2M taxonomy relationship
- ✅ Fixed `planner/serializers.py` - removed SiteBlueprintTaxonomy import
### Frontend
- ✅ Removed `frontend/src/modules/siteBuilder/` directory
- ✅ Removed `frontend/src/types/siteBuilder.ts`
- ✅ Removed `frontend/src/services/siteBuilder.api.ts`
- ✅ Removed SiteBlueprint API functions from `services/api.ts`
- ✅ Removed SiteBuilder routes from navigation
---
## Current Taxonomy System
### Simplified Architecture
**Before (Complex - SiteBuilder era):**
```
Content → ContentTaxonomyMap → SiteBlueprintTaxonomy → Clusters
(through table) (blueprint planning)
```
**After (Simplified - Current):**
```
Content ←→ ContentTaxonomy (many-to-many direct relationship)
Cluster (foreign key)
```
### ContentTaxonomy Model
**Location:** `backend/igny8_core/business/content/models.py`
**Fields:**
- `name` - Term name (e.g., "Outdoor Living Design")
- `slug` - URL-safe version
- `taxonomy_type` - Choices: `category`, `tag`
- `external_id` - WordPress term_id for sync
- `external_taxonomy` - WordPress taxonomy slug (category, post_tag)
- `description` - Term description
- `account`, `site`, `sector` - Multi-tenancy fields
**Relationship:**
- `Content.taxonomy_terms` - ManyToManyField to ContentTaxonomy
- Categories/tags are AI-generated and linked directly to Content
---
## How Content Taxonomy Works Now
### Publishing Flow (IGNY8 → WordPress)
```python
# In wordpress_publishing.py task
# STEP 4: Get categories from Content.taxonomy_terms
categories = [
term.name
for term in content.taxonomy_terms.filter(taxonomy_type='category')
]
# Fallback to cluster if no taxonomy_terms
if not categories and content.cluster:
categories.append(content.cluster.name)
# STEP 5: Get tags from taxonomy_terms + keywords
tags = [
term.name
for term in content.taxonomy_terms.filter(taxonomy_type='tag')
]
# Add keywords as tags
if content.primary_keyword not in tags:
tags.append(content.primary_keyword)
for keyword in content.secondary_keywords:
if keyword not in tags:
tags.append(keyword)
```
### Data Flow
```
Keywords → Clusters → Ideas → Tasks → Content
├── taxonomy_terms (M2M)
│ ├── Categories
│ └── Tags
├── cluster (FK)
├── primary_keyword
└── secondary_keywords
WordPress Publish
├── Categories (from taxonomy_terms + cluster)
└── Tags (from taxonomy_terms + keywords)
```
---
## Django Admin
**ContentTaxonomy is registered** in `backend/igny8_core/modules/writer/admin.py`:
- View at: `/admin/writer/contenttaxonomy/`
- Shows: name, taxonomy_type, slug, external_id, external_taxonomy, site, sector
- Searchable by: name, slug, external_taxonomy
- Filterable by: taxonomy_type, site, sector
---
## Database Migration (PENDING)
**Migration File:** `backend/igny8_core/business/site_building/migrations/0002_remove_blueprint_models.py`
**Status:** Created but not applied (requires external PostgreSQL access)
### Manual SQL Commands
Run these SQL commands directly on your production PostgreSQL database:
```sql
-- Drop foreign key constraints first
ALTER TABLE igny8_publishing_records
DROP CONSTRAINT IF EXISTS igny8_publishing_recor_site_blueprint_id_9f4e8c7a_fk_igny8_sit CASCADE;
ALTER TABLE igny8_deployment_records
DROP CONSTRAINT IF EXISTS igny8_deployment_recor_site_blueprint_id_3a2b7c1d_fk_igny8_sit CASCADE;
-- Drop blueprint tables
DROP TABLE IF EXISTS igny8_site_blueprint_taxonomies CASCADE;
DROP TABLE IF EXISTS igny8_site_blueprint_clusters CASCADE;
DROP TABLE IF EXISTS igny8_page_blueprints CASCADE;
DROP TABLE IF EXISTS igny8_site_blueprints CASCADE;
-- Drop SiteBuilder metadata tables
DROP TABLE IF EXISTS igny8_site_builder_business_types CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_audience_profiles CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_brand_personalities CASCADE;
DROP TABLE IF EXISTS igny8_site_builder_hero_imagery CASCADE;
-- Drop site_blueprint_id columns
ALTER TABLE igny8_publishing_records DROP COLUMN IF EXISTS site_blueprint_id CASCADE;
ALTER TABLE igny8_deployment_records DROP COLUMN IF EXISTS site_blueprint_id CASCADE;
-- Drop indexes
DROP INDEX IF EXISTS igny8_publishing_recor_site_blueprint_id_des_b7c4e5f8_idx;
-- Mark migration as applied
INSERT INTO django_migrations (app, name, applied)
VALUES ('site_building', '0002_remove_blueprint_models', NOW())
ON CONFLICT DO NOTHING;
```
---
## Files Modified
### Backend Python Files (24 files)
1. `backend/igny8_core/business/site_building/models.py` - All models removed
2. `backend/igny8_core/business/site_building/admin.py` - All admin classes removed
3. `backend/igny8_core/business/publishing/models.py` - Removed site_blueprint FK
4. `backend/igny8_core/business/publishing/services/publisher_service.py` - Removed publish_to_sites
5. `backend/igny8_core/business/publishing/services/adapters/sites_renderer_adapter.py` - Updated taxonomy usage
6. `backend/igny8_core/business/content/services/metadata_mapping_service.py` - Removed ContentTaxonomyMap
7. `backend/igny8_core/business/linking/services/candidate_engine.py` - Updated to M2M taxonomy
8. `backend/igny8_core/business/optimization/services/analyzer.py` - Updated taxonomy check
9. `backend/igny8_core/modules/publisher/views.py` - Removed blueprint actions
10. `backend/igny8_core/modules/planner/serializers.py` - Removed SiteBlueprintTaxonomy
11. `backend/igny8_core/tasks/wordpress_publishing.py` - Uses Content.taxonomy_terms
12. `backend/igny8_core/urls.py` - Removed site-builder URL
13. `backend/igny8_core/settings.py` - Removed site_builder from INSTALLED_APPS
### Frontend TypeScript Files (3 files)
1. `frontend/src/services/api.ts` - Removed SiteBlueprint API functions
2. Removed: `frontend/src/types/siteBuilder.ts`
3. Removed: `frontend/src/services/siteBuilder.api.ts`
4. Removed: `frontend/src/modules/siteBuilder/` directory
### Migrations
1. Created: `backend/igny8_core/business/site_building/migrations/0002_remove_blueprint_models.py`
---
## Testing Checklist
### Backend Health Check
```bash
# Check if backend starts successfully
docker compose -f docker-compose.app.yml logs igny8_backend | grep -i "error\|exception"
# Should show no import errors
```
### Taxonomy Workflow Test
1. **Check ContentTaxonomy in Admin**
- Go to `/admin/writer/contenttaxonomy/`
- Verify model is accessible
- Check existing taxonomy terms
2. **Test Content Creation**
```bash
# In Django shell
from igny8_core.business.content.models import Content, ContentTaxonomy
content = Content.objects.first()
print(f"Taxonomy terms: {content.taxonomy_terms.count()}")
print(f"Cluster: {content.cluster.name if content.cluster else 'None'}")
```
3. **Test Publishing to WordPress**
- Create/select content with taxonomy_terms
- Publish to WordPress from Review page
- Verify categories and tags appear in WordPress
- Check logs: `tail -f backend/logs/publish-sync-logs/publish-sync.log`
### Expected Log Output
```
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] STEP 4: Loading taxonomy terms...
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] Found 1 categories from taxonomy_terms
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 📁 Category: 'Outdoor Living Design'
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] ✅ TOTAL categories: 1
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] STEP 5: Loading tags...
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 🏷️ Primary keyword: 'outdoor patio design'
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] 🏷️ Secondary keywords: ['outdoor living spaces', 'outdoor kitchen design']
[2025-12-01 02:00:00] [INFO] [5-homeg8.com] ✅ TOTAL tags: 3
```
---
## Remaining Legacy References
These files contain SiteBlueprint references in **migrations only** (historical data, safe to ignore):
- `backend/igny8_core/business/content/migrations/0002_stage1_refactor_task_content_taxonomy.py`
- `backend/igny8_core/modules/writer/migrations/0001_initial.py`
- `backend/igny8_core/modules/planner/migrations/0002_initial.py`
- `backend/igny8_core/tasks/wordpress_publishing_backup.py` (backup file)
- `backend/igny8_core/tasks/wordpress_publishing_new.py` (backup file)
---
## Benefits of Simplified System
### Before (Complex)
- 5 models: SiteBlueprint, PageBlueprint, SiteBlueprintCluster, SiteBlueprintTaxonomy, ContentTaxonomyMap
- 3-level indirection: Content → ContentTaxonomyMap → SiteBlueprintTaxonomy
- Blueprint planning layer for site building
- Difficult to understand taxonomy relationships
### After (Simple)
- 1 model: ContentTaxonomy
- Direct M2M: Content ↔ ContentTaxonomy
- AI-generated categories/tags linked directly
- Clear taxonomy-content relationship in Django Admin
### Performance Improvements
- Fewer database queries (eliminated ContentTaxonomyMap joins)
- Simpler ORM queries: `content.taxonomy_terms.filter(taxonomy_type='category')`
- Easier debugging and maintenance
---
## Next Steps
1. **Apply Database Migration**
- Run SQL commands on production PostgreSQL
- Mark migration as applied in django_migrations table
2. **Test Publishing Workflow**
- Publish content from Review page
- Verify categories/tags in WordPress
- Check sync logs for any errors
3. **Monitor Logs**
- Backend: `/data/app/igny8/backend/logs/publish-sync-logs/`
- WordPress: `/wp-content/plugins/igny8-ai-os/logs/publish-sync-logs/`
4. **Update Documentation**
- Update SYSTEM-ARCHITECTURE doc to reflect simplified taxonomy
- Remove SiteBuilder references from workflow docs
---
## Rollback Plan (If Needed)
If issues arise, you can restore SiteBuilder functionality by:
1. Restore backup files:
```bash
cd /data/app/igny8/backend/igny8_core/modules
mv site_builder.backup site_builder
```
2. Uncomment in settings.py:
```python
'igny8_core.modules.site_builder.apps.SiteBuilderConfig',
```
3. Restore URL pattern in urls.py:
```python
path('api/v1/site-builder/', include('igny8_core.modules.site_builder.urls')),
```
4. Reverse database changes (restore from backup)
---
## Contact & Support
If you encounter any issues during migration:
- Check logs in `backend/logs/` and WordPress plugin `logs/`
- Review Django admin for ContentTaxonomy model
- Test publishing workflow step by step
**Migration completed by:** GitHub Copilot
**Date:** December 1, 2025
**Version:** IGNY8 v1.0 - SiteBuilder Removal